summaryrefslogtreecommitdiff
path: root/editors/libreoffice6/files/powerpc64/patch-bridges-source-cpp_uno-gcc3_linux_powerpc64-cpp2uno.cxx
blob: 22102d34d855fba217ece85966bc4c4b06db6b86 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
--- bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx.orig	2020-04-04 12:03:03.236554000 -0500
+++ bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx	2020-04-08 14:28:30.208034000 -0500
@@ -341,7 +341,7 @@
 
 static typelib_TypeClass cpp_mediate(
     sal_uInt64 nOffsetAndIndex,
-        void ** gpreg, void ** fpreg, long sp,
+        void ** gpreg, void ** fpreg, long fp,
     sal_Int64 * pRegisterReturn /* space for register return */ )
 {
     static_assert(sizeof(sal_Int64)==sizeof(void *), "### unexpected!");
@@ -349,8 +349,8 @@
     sal_Int32 nVtableOffset = (nOffsetAndIndex >> 32);
     sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF);
 
-    long sf = *(long*)sp;
-    void ** ovrflw = (void**)(sf + PARAMSAVE + 64);
+    /* XXX: This is the stack frame!!!! */
+    void ** ovrflw = (void**)(fp + PARAMSAVE + 64);
 
     // gpreg:  [ret *], this, [other gpr params]
     // fpreg:  [fpr params]
@@ -513,18 +513,22 @@
     return eRet;
 }
 
-extern "C" void privateSnippetExecutor( ... )
+extern "C" void privateSnippetExecutor( uint64_t a, ... )
 {
+    va_list args, fpargs;
     sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
 
-    register long r3 asm("r3"); gpreg[0] = r3;
-    register long r4 asm("r4"); gpreg[1] = r4;
-    register long r5 asm("r5"); gpreg[2] = r5;
-    register long r6 asm("r6"); gpreg[3] = r6;
-    register long r7 asm("r7"); gpreg[4] = r7;
-    register long r8 asm("r8"); gpreg[5] = r8;
-    register long r9 asm("r9"); gpreg[6] = r9;
-    register long r10 asm("r10"); gpreg[7] = r10;
+    va_start(args, a);
+    va_copy(fpargs, args);
+    /* Start with all the GPRs */
+    gpreg[0] = a;
+    gpreg[1] = va_arg(args, uint64_t);
+    gpreg[2] = va_arg(args, uint64_t);
+    gpreg[3] = va_arg(args, uint64_t);
+    gpreg[4] = va_arg(args, uint64_t);
+    gpreg[5] = va_arg(args, uint64_t);
+    gpreg[6] = va_arg(args, uint64_t);
+    gpreg[7] = va_arg(args, uint64_t);
 
     double fpreg[ppc64::MAX_SSE_REGS];
 
@@ -547,11 +551,11 @@
           "fr10", "fr11", "fr12", "fr13"
     );
 
-    register long r11 asm("r11");
-    const long nOffsetAndIndex = r11;
+    long nOffsetAndIndex;
+    long fp;
 
-    register long r1 asm("r1");
-    const long sp = r1;
+    __asm __volatile("mr %0, 11\n" : "=r"(nOffsetAndIndex));
+    fp = (long)__builtin_frame_address(0);
 
 #if defined(_CALL_ELF) && _CALL_ELF == 2
     volatile long nRegReturn[2];
@@ -560,7 +564,7 @@
 #endif
 
     typelib_TypeClass aType =
-        cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn);
+        cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, fp, (sal_Int64*)nRegReturn);
 
     switch( aType )
     {