editors/openoffice-*: Fix build on powerpc64

The upstream bridges code does not yet work on powerpc64.

PR:		251417
This commit is contained in:
Curtis Hamilton 2024-11-04 03:50:28 -08:00 committed by Don Lewis
parent 7a0f7e1c4f
commit d74f1e0a8d
17 changed files with 2601 additions and 22 deletions

View File

@ -0,0 +1,12 @@
--- bridges/prj/build.lst.orig
+++ bridges/prj/build.lst
@@ -9,6 +9,8 @@
br bridges\source\cpp_uno\gcc3_freebsd_intel nmake - u br_gcc3fi br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_x86-64 nmake - u br_gcc3lx br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_freebsd_x86-64 nmake - u br_gcc3fx br_cppuno_shared br_unotypes br_inc NULL
+br bridges\source\cpp_uno\gcc3_freebsd_powerpc nmake - u br_gcc3fp br_cppuno_shared br_unotypes br_inc NULL
+br bridges\source\cpp_uno\gcc3_freebsd_powerpc64 nmake - u br_gcc3fp_64 br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_powerpc nmake - u br_gcc3lp br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_powerpc64 nmake - u br_gcc3lp_64 br_cppuno_shared br_unotypes br_inc NULL
br bridges\source\cpp_uno\gcc3_linux_mips nmake - u br_gcc3lmips br_cppuno_shared br_unotypes br_inc NULL

View File

@ -0,0 +1,482 @@
--- /dev/null
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/call.s
@@ -0,0 +1,478 @@
+ .file "uno_ppc64_asm.cc"
+ .machine power4
+ .abiversion 2
+ .section ".text"
+ .align 2
+ .globl callVirtualMethod
+ .type callVirtualMethod, @function
+callVirtualMethod:
+.LFB0:
+ .cfi_startproc
+.LCF0:
+0: addis 2,12,.TOC.-.LCF0@ha
+ addi 2,2,.TOC.-.LCF0@l
+ .localentry callVirtualMethod,.-callVirtualMethod
+ mflr 0
+ std 0,16(1)
+ std 31,-8(1)
+ stdu 1,-208(1)
+ .cfi_def_cfa_offset 208
+ .cfi_offset 65, 16
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ std 3,136(31)
+ std 5,128(31)
+ std 6,120(31)
+ std 7,112(31)
+ std 9,104(31)
+ mr 9,4
+ stw 9,248(31)
+ mr 9,8
+ stw 9,280(31)
+ mr 9,10
+ stw 9,296(31)
+ ld 9,304(31)
+ std 9,96(31)
+ ld 9,-28688(13)
+ std 9,184(31)
+ li 9,0
+ lwz 9,280(31)
+ cmpwi 0,9,0
+ beq 0,.L2
+ lwz 9,280(31)
+ addi 9,9,1
+ rldicl 9,9,0,32
+ rlwinm 9,9,0,0,30
+ stw 9,280(31)
+.L2:
+#ifdef __LITTLE_ENDIAN__
+ lwz 9,312(31)
+#else
+ lwz 9,316(31)
+#endif
+ cmplwi 0,9,13
+ ble 0,.L3
+ li 9,13
+#ifdef __LITTLE_ENDIAN__
+ stw 9,312(31)
+#else
+ stw 9,316(31)
+#endif
+.L3:
+ lwz 9,296(31)
+ cmplwi 0,9,8
+ ble 0,.L4
+ li 9,8
+ stw 9,296(31)
+.L4:
+ lwz 9,280(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ addi 9,9,15
+ srdi 9,9,4
+ sldi 9,9,4
+ ld 10,0(1)
+ neg 9,9
+ stdux 10,1,9
+ addi 9,1,96
+ addi 9,9,15
+ srdi 9,9,4
+ sldi 9,9,4
+ std 9,160(31)
+ lwz 9,280(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ mr 8,9
+ ld 10,160(31)
+ ld 9,112(31)
+ mr 5,8
+ mr 4,9
+ mr 3,10
+ bl memcpy
+ nop
+ ld 9,136(31)
+ ld 9,0(9)
+ std 9,168(31)
+ lwz 9,248(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ mr 10,9
+ ld 9,168(31)
+ add 9,9,10
+ std 9,168(31)
+ ld 9,168(31)
+ ld 9,0(9)
+ std 9,168(31)
+ ld 9,168(31)
+ std 9,176(31)
+ ld 9,96(31)
+#APP
+ # 123 "uno_ppc64_asm.cc" 1
+ lfd 1, 0(9)
+ lfd 2, 8(9)
+ lfd 3, 16(9)
+ lfd 4, 24(9)
+ lfd 5, 32(9)
+ lfd 6, 40(9)
+ lfd 7, 48(9)
+ lfd 8, 56(9)
+ lfd 9, 64(9)
+ lfd 10, 72(9)
+ lfd 11, 80(9)
+ lfd 12, 88(9)
+ lfd 13, 96(9)
+
+ # 0 "" 2
+#NO_APP
+ ld 9,104(31)
+ ld 3,0(9)
+ ld 9,104(31)
+ addi 9,9,8
+ ld 4,0(9)
+ ld 9,104(31)
+ addi 9,9,16
+ ld 5,0(9)
+ ld 9,104(31)
+ addi 9,9,24
+ ld 6,0(9)
+ ld 9,104(31)
+ addi 9,9,32
+ ld 7,0(9)
+ ld 9,104(31)
+ addi 9,9,40
+ ld 8,0(9)
+ ld 9,104(31)
+ addi 9,9,48
+ ld 0,0(9)
+ ld 9,104(31)
+ addi 9,9,56
+ ld 9,0(9)
+ ld 11,176(31)
+ mr 10,9
+ mr 9,0
+ std 2,24(1)
+ mr 12,11
+ mtctr 12
+ bctrl
+ ld 2,24(1)
+#APP
+ # 149 "uno_ppc64_asm.cc" 1
+ mr 3, 3
+ mr 4, 4
+ fmr 0, 1
+
+ # 0 "" 2
+#NO_APP
+ stfd 0,152(31)
+ mr 9,3
+ mr 10,4
+ lfd 0,152(31)
+ ld 7,128(31)
+ ld 6,120(31)
+ fmr 1,0
+ mr 4,10
+ mr 3,9
+ bl MapReturn
+ nop
+ nop
+ ld 9,184(31)
+ ld 10,-28688(13)
+ xor. 9,9,10
+ li 10,0
+ beq 0,.L5
+ bl __stack_chk_fail
+ nop
+.L5:
+ addi 1,31,208
+ .cfi_def_cfa 1, 0
+ ld 0,16(1)
+ mtlr 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,1,128,1,0,1
+ .cfi_endproc
+.LFE0:
+ .size callVirtualMethod,.-callVirtualMethod
+ .section ".toc","aw"
+ .align 3
+.LC0:
+ .quad .L9
+ .section ".text"
+ .align 2
+ .globl privateSnippetExecutor
+ .type privateSnippetExecutor, @function
+privateSnippetExecutor:
+.LFB1:
+ .cfi_startproc
+.LCF1:
+0: addis 2,12,.TOC.-.LCF1@ha
+ addi 2,2,.TOC.-.LCF1@l
+ .localentry privateSnippetExecutor,.-privateSnippetExecutor
+ mflr 0
+ std 0,16(1)
+ std 31,-8(1)
+ stdu 1,-272(1)
+ .cfi_def_cfa_offset 272
+ .cfi_offset 65, 16
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ ld 0,-28688(13)
+ std 0,248(31)
+ li 0,0
+ std 3,80(31)
+ std 4,88(31)
+ std 5,96(31)
+ std 6,104(31)
+ std 7,112(31)
+ std 8,120(31)
+ std 9,128(31)
+ mr 9,10
+ std 9,136(31)
+ addi 9,31,144
+#APP
+ # 173 "uno_ppc64_asm.cc" 1
+ stfd 1, 0(9)
+stfd 2, 8(9)
+stfd 3, 16(9)
+stfd 4, 24(9)
+stfd 5, 32(9)
+stfd 6, 40(9)
+stfd 7, 48(9)
+stfd 8, 56(9)
+stfd 9, 64(9)
+stfd 10, 72(9)
+stfd 11, 80(9)
+stfd 12, 88(9)
+stfd 13, 96(9)
+
+ # 0 "" 2
+#NO_APP
+ std 11,48(31)
+ std 1,56(31)
+ ld 9,48(31)
+ addi 7,31,64
+ addi 8,31,144
+ addi 10,31,80
+ ld 6,56(31)
+ mr 5,8
+ mr 4,10
+ mr 3,9
+ bl cpp_mediate
+ nop
+ mr 9,3
+ stw 9,44(31)
+ lwa 9,44(31)
+ cmplwi 0,9,15
+ bgt 0,.L7
+ sldi 10,9,2
+ addis 8,2,.LC0@toc@ha
+ ld 9,.LC0@toc@l(8)
+ add 9,10,9
+ lwz 10,0(9)
+ ld 9,.LC0@toc@l(8)
+ extsw 10,10
+ add 9,10,9
+ mtctr 9
+ bctr
+ .p2align 2
+ .align 2
+.L9:
+ .long .L19-.L9
+ .long .L13-.L9
+ .long .L15-.L9
+ .long .L15-.L9
+ .long .L14-.L9
+ .long .L13-.L9
+ .long .L12-.L9
+ .long .L8-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L11-.L9
+ .long .L10-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L8-.L9
+.L15:
+#APP
+ # 209 "uno_ppc64_asm.cc" 1
+ lbz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L13:
+#APP
+ # 214 "uno_ppc64_asm.cc" 1
+ lhz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L14:
+#APP
+ # 218 "uno_ppc64_asm.cc" 1
+ lha 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L8:
+#APP
+ # 223 "uno_ppc64_asm.cc" 1
+ lwz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L12:
+#APP
+ # 227 "uno_ppc64_asm.cc" 1
+ lwa 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L11:
+ addi 9,31,64
+#APP
+ # 231 "uno_ppc64_asm.cc" 1
+ lfs 1,0(9)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L10:
+ addi 9,31,64
+#APP
+ # 235 "uno_ppc64_asm.cc" 1
+ lfd 1,0(9)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L7:
+#APP
+ # 239 "uno_ppc64_asm.cc" 1
+ ld 3,64(31)
+
+ # 0 "" 2
+ # 241 "uno_ppc64_asm.cc" 1
+ ld 4,72(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L19:
+ nop
+.L17:
+ nop
+ ld 9,248(31)
+ ld 10,-28688(13)
+ xor. 9,9,10
+ li 10,0
+ beq 0,.L18
+ bl __stack_chk_fail
+ nop
+.L18:
+ addi 1,31,272
+ .cfi_def_cfa 1, 0
+ ld 0,16(1)
+ mtlr 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,1,128,1,0,1
+ .cfi_endproc
+.LFE1:
+ .size privateSnippetExecutor,.-privateSnippetExecutor
+ .section .rodata
+ .align 2
+ .type _ZL15codeSnippetSize, @object
+ .size _ZL15codeSnippetSize, 4
+_ZL15codeSnippetSize:
+ .long 32
+ .section ".text"
+ .align 2
+ .globl codeSnippet
+ .type codeSnippet, @function
+codeSnippet:
+.LFB2:
+ .cfi_startproc
+.LCF2:
+0: addis 2,12,.TOC.-.LCF2@ha
+ addi 2,2,.TOC.-.LCF2@l
+ .localentry codeSnippet,.-codeSnippet
+ std 31,-8(1)
+ stdu 1,-96(1)
+ .cfi_def_cfa_offset 96
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ std 3,56(31)
+ mr 9,4
+ mr 8,5
+ mr 10,6
+ stw 9,52(31)
+ mr 9,8
+ stw 9,48(31)
+ mr 9,10
+ stb 9,47(31)
+ lwa 9,48(31)
+ sldi 10,9,32
+ lwa 9,52(31)
+ or 9,10,9
+ std 9,64(31)
+ lbz 9,47(31)
+ cmpwi 0,9,0
+ beq 0,.L21
+ ld 9,64(31)
+ oris 9,9,0x8000
+ std 9,64(31)
+.L21:
+ ld 9,56(31)
+ std 9,72(31)
+ ld 9,72(31)
+ lis 10,0xe96c
+ ori 10,10,0x18
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,4
+ lis 10,0xe98c
+ ori 10,10,0x10
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,8
+ lis 10,0x7d89
+ ori 10,10,0x3a6
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,12
+ lis 10,0x4e80
+ ori 10,10,0x420
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,16
+ addis 10,2,privateSnippetExecutor@toc@ha
+ addi 10,10,privateSnippetExecutor@toc@l
+ std 10,0(9)
+ ld 9,72(31)
+ addi 9,9,24
+ ld 10,64(31)
+ std 10,0(9)
+ ld 9,56(31)
+ addi 9,9,32
+ mr 3,9
+ addi 1,31,96
+ .cfi_def_cfa 1, 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,0,128,1,0,1
+ .cfi_endproc
+.LFE2:
+ .size codeSnippet,.-codeSnippet
+ .section .note.GNU-stack,"",@progbits

View File

@ -0,0 +1,257 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx
@@ -28,6 +28,7 @@
#include <uno/data.h>
#include <typelib/typedescription.hxx>
+#include <osl/endian.h>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
@@ -37,6 +38,11 @@
#include <stdio.h>
#include <string.h>
+#ifdef OSL_BIGENDIAN
+#define IS_BIG_ENDIAN 1
+#else
+#define IS_BIG_ENDIAN 0
+#endif
using namespace ::com::sun::star::uno;
@@ -144,14 +150,14 @@
case typelib_TypeClass_BYTE:
case typelib_TypeClass_BOOLEAN:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-1));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 7*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 7*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -160,14 +166,14 @@
case typelib_TypeClass_SHORT:
case typelib_TypeClass_UNSIGNED_SHORT:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-2));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 6*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 6*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -176,14 +182,14 @@
case typelib_TypeClass_LONG:
case typelib_TypeClass_UNSIGNED_LONG:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-4));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 4*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-4));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 4*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -327,21 +333,25 @@
}
}
-
-//==================================================================================================
-static typelib_TypeClass cpp_mediate(
- sal_uInt64 nOffsetAndIndex,
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+# define PARAMSAVE 32
+#else
+# define PARAMSAVE 48
+#endif
+
+extern "C" typelib_TypeClass cpp_mediate(
+ sal_uInt64 nOffsetAndIndex,
void ** gpreg, void ** fpreg, long sp,
- sal_Int64 * pRegisterReturn /* space for register return */ )
-{
- OSL_ENSURE( sizeof(sal_Int64)==sizeof(void *), "### unexpected!" );
+ sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+ static_assert(sizeof(sal_Int64)==sizeof(void *), "### unexpected!");
sal_Int32 nVtableOffset = (nOffsetAndIndex >> 32);
sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF);
long sf = *(long*)sp;
- void ** ovrflw = (void**)(sf + 112);
-
+ void ** ovrflw = (void**)(sf + PARAMSAVE + 64);
+
// gpreg: [ret *], this, [other gpr params]
// fpreg: [fpr params]
// ovrflw: [gpr or fpr params (properly aligned)]
@@ -501,54 +511,52 @@
return eRet;
}
-extern "C" void privateSnippetExecutor( ... )
-{
- volatile long nOffsetAndIndex;
-
- //mr %r3, %r11 # move into arg1 the 64bit value passed from OOo
+extern "C" void privateSnippetExecutor( ... );
+#if 0
+{
+ 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;
+
+ double fpreg[ppc64::MAX_SSE_REGS];
+
__asm__ __volatile__ (
- "mr %0, 11\n\t"
- : "=r" (nOffsetAndIndex) : );
-
- sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
- double fpreg[ppc64::MAX_SSE_REGS];
-
- __asm__ __volatile__ (
- "std 3, 0(%0)\t\n"
- "std 4, 8(%0)\t\n"
- "std 5, 16(%0)\t\n"
- "std 6, 24(%0)\t\n"
- "std 7, 32(%0)\t\n"
- "std 8, 40(%0)\t\n"
- "std 9, 48(%0)\t\n"
- "std 10, 56(%0)\t\n"
- "stfd 1, 0(%1)\t\n"
- "stfd 2, 8(%1)\t\n"
- "stfd 3, 16(%1)\t\n"
- "stfd 4, 24(%1)\t\n"
- "stfd 5, 32(%1)\t\n"
- "stfd 6, 40(%1)\t\n"
- "stfd 7, 48(%1)\t\n"
- "stfd 8, 56(%1)\t\n"
- "stfd 9, 64(%1)\t\n"
- "stfd 10, 72(%1)\t\n"
- "stfd 11, 80(%1)\t\n"
- "stfd 12, 88(%1)\t\n"
- "stfd 13, 96(%1)\t\n"
- : : "r" (gpreg), "r" (fpreg)
- : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
- "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+ "stfd 1, 0(%0)\t\n"
+ "stfd 2, 8(%0)\t\n"
+ "stfd 3, 16(%0)\t\n"
+ "stfd 4, 24(%0)\t\n"
+ "stfd 5, 32(%0)\t\n"
+ "stfd 6, 40(%0)\t\n"
+ "stfd 7, 48(%0)\t\n"
+ "stfd 8, 56(%0)\t\n"
+ "stfd 9, 64(%0)\t\n"
+ "stfd 10, 72(%0)\t\n"
+ "stfd 11, 80(%0)\t\n"
+ "stfd 12, 88(%0)\t\n"
+ "stfd 13, 96(%0)\t\n"
+ : : "r" (fpreg)
+ : "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
"fr10", "fr11", "fr12", "fr13"
);
- volatile long sp;
-
- //stack pointer
- __asm__ __volatile__ (
- "mr %0, 1\n\t"
- : "=r" (sp) : );
-
+ register long r11 asm("r11");
+ const long nOffsetAndIndex = r11;
+
+ register long r1 asm("r1");
+ const long sp = r1;
+
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ volatile long nRegReturn[2];
+#else
volatile long nRegReturn[1];
+#endif
typelib_TypeClass aType =
cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn);
@@ -591,11 +599,20 @@
default:
__asm__( "ld 3,%0\n\t"
: : "m" (nRegReturn[0]) );
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ __asm__( "ld 4,%0\n\t"
+ : : "m" (nRegReturn[1]) );
+#endif
break;
}
}
-
+#endif
+
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+const int codeSnippetSize = 32;
+#else
const int codeSnippetSize = 24;
+#endif
unsigned char * codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset,
bool simpleRetType)
@@ -609,10 +626,22 @@
if ( !simpleRetType )
nOffsetAndIndex |= 0x80000000;
-
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ unsigned int *raw = (unsigned int *)&code[0];
+
+ raw[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */
+ raw[1] = 0xe98c0010; /* ld 12,1f-0b(12) */
+ raw[2] = 0x7d8903a6; /* mtctr 12 */
+ raw[3] = 0x4e800420; /* bctr */
+ /* 1: .quad function_addr */
+ /* 2: .quad context */
+ *(void **)&raw[4] = (void *)privateSnippetExecutor;
+ *(void **)&raw[6] = (void*)nOffsetAndIndex;
+#else
void ** raw = (void **)&code[0];
memcpy(raw, (char*) privateSnippetExecutor, 16);
raw[2] = (void*) nOffsetAndIndex;
+#endif
#ifdef CMC_DEBUG
fprintf(stderr, "in: offset/index is %x %x %d, %lx\n",
nFunctionIndex, nVtableOffset, !simpleRetType, raw[2]);

View File

@ -0,0 +1,21 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
@@ -53,7 +53,8 @@
SLOFILES= \
$(SLO)$/except.obj \
$(SLO)$/cpp2uno.obj \
- $(SLO)$/uno2cpp.obj
+ $(SLO)$/uno2cpp.obj \
+ $(SLO)$/call.obj
SHL1TARGET= $(TARGET)
@@ -73,3 +74,7 @@
# --- Targets ------------------------------------------------------
.INCLUDE : target.mk
+
+$(SLO)$/%.obj: %.s
+ $(CC) -c -o $(SLO)$/$(@:b).o $<
+ touch $@

View File

@ -1,6 +1,65 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx.orig 2020-10-06 14:16:16 UTC
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx
@@ -35,6 +35,7 @@ namespace CPPU_CURRENT_NAMESPACE
@@ -25,16 +25,64 @@
#include <typeinfo>
#include <exception>
+
+#include <cxxabi.h>
+#ifndef _GLIBCXX_CDTOR_CALLABI // new in GCC 4.7 cxxabi.h
+#define _GLIBCXX_CDTOR_CALLABI
+#endif
#include <cstddef>
+
+#ifndef CONFIG_CXXABI_H
+#define CONFIG_CXXABI_H
+
+#define HAVE_CXXABI_H_BASE_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_CXA_ALLOCATE_EXCEPTION 0
+#define HAVE_CXXABI_H_CXA_EH_GLOBALS 1
+#define HAVE_CXXABI_H_CXA_EXCEPTION 1
+#define HAVE_CXXABI_H_CXA_GET_GLOBALS 1
+#define HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE 1
+#define HAVE_CXXABI_H_CXA_THROW 0
+#define HAVE_CXXABI_H_SI_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO 0
+
+#endif
+
+#if !HAVE_CXXABI_H_CLASS_TYPE_INFO
+// <https://mentorembedded.github.io/cxx-abi/abi.html>,
+// libstdc++-v3/libsupc++/cxxabi.h:
+namespace __cxxabiv1 {
+class __class_type_info: public std::type_info {
+public:
+ explicit __class_type_info(char const * n): type_info(n) {}
+ ~__class_type_info();
+};
+}
+#endif
+
+#if !HAVE_CXXABI_H_SI_CLASS_TYPE_INFO
+// <https://mentorembedded.github.io/cxx-abi/abi.html>,
+// libstdc++-v3/libsupc++/cxxabi.h:
+namespace __cxxabiv1 {
+class __si_class_type_info: public __class_type_info {
+public:
+ __class_type_info const * __base_type;
+ explicit __si_class_type_info(
+ char const * n, __class_type_info const *base):
+ __class_type_info(n), __base_type(base) {}
+ ~__si_class_type_info();
+};
+}
+#endif
namespace CPPU_CURRENT_NAMESPACE
{
- void dummy_can_throw_anything( char const * );
-
+void dummy_can_throw_anything( char const * );
// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
@ -8,15 +67,14 @@
struct _Unwind_Exception
{
unsigned exception_class __attribute__((__mode__(__DI__)));
@@ -63,18 +64,21 @@ struct __cxa_exception
@@ -63,18 +111,21 @@
_Unwind_Exception unwindHeader;
};
+#endif /* __GLIBCXX__ */
extern "C" void *__cxa_allocate_exception(
- std::size_t thrown_size ) throw();
+ size_t thrown_size );
std::size_t thrown_size ) throw();
extern "C" void __cxa_throw (
void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn));
@ -31,7 +89,7 @@
// -----
@@ -82,6 +86,10 @@ void raiseException(
@@ -82,11 +133,16 @@
void raiseException(
uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
//==================================================================================================
@ -42,3 +100,11 @@
void fillUnoException(
__cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
}
namespace ppc64
{
- enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+ enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
}

View File

@ -1,9 +1,24 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx.orig 2019-09-17 22:55:10 UTC
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
@@ -42,6 +42,14 @@ using namespace ::com::sun::star::uno;
@@ -26,6 +26,12 @@
#include <stdlib.h>
+#include <exception>
+#include <malloc.h>
+#include <typeinfo>
+
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/uno/genfunc.hxx>
#include <uno/data.h>
@@ -42,10 +48,68 @@
using namespace ::rtl;
using namespace ::com::sun::star::uno;
-
-void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+#ifdef __GLIBCXX__
+using CPPU_CURRENT_NAMESPACE::__cxa_exception;
+using CPPU_CURRENT_NAMESPACE::__cxa_get_globals;
@ -12,10 +27,332 @@
+using __cxxabiv1::__cxa_current_primary_exception;
+using __cxxabiv1::__cxa_decrement_exception_refcount;
+#endif
void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+
+namespace ppc64
{
@@ -448,9 +456,18 @@ static void cpp_call(
- switch (eTypeClass)
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ bool is_complex_struct(const typelib_TypeDescription * type)
+ {
+ const typelib_CompoundTypeDescription * p
+ = reinterpret_cast< const typelib_CompoundTypeDescription * >(type);
+ for (sal_Int32 i = 0; i < p->nMembers; ++i)
+ {
+ if (p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_STRUCT ||
+ p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_EXCEPTION)
+ {
+ typelib_TypeDescription * t = 0;
+ TYPELIB_DANGER_GET(&t, p->ppTypeRefs[i]);
+ bool b = is_complex_struct(t);
+ TYPELIB_DANGER_RELEASE(t);
+ if (b) {
+ return true;
+ }
+ }
+ else if (!bridges::cpp_uno::shared::isSimpleType(p->ppTypeRefs[i]->eTypeClass))
+ return true;
+ }
+ if (p->pBaseTypeDescription != 0)
+ return is_complex_struct(&p->pBaseTypeDescription->aBase);
+ return false;
+ }
+#endif
+
+ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef )
+ {
+ if (bridges::cpp_uno::shared::isSimpleType(pTypeRef))
+ return false;
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
+ {
+ typelib_TypeDescription * pTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
+
+ //A Composite Type not larger than 16 bytes is returned in up to two GPRs
+ bool bRet = pTypeDescr->nSize > 16 || is_complex_struct(pTypeDescr);
+
+ TYPELIB_DANGER_RELEASE( pTypeDescr );
+ return bRet;
+ }
+#endif
+ return true;
+ }
+}
+
+extern "C" void MapReturn(long r3, long r4, double dret, typelib_TypeDescriptionReference* pReturnType, void *pRegisterReturn)
+{
+ switch (pReturnType->eTypeClass)
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
@@ -67,10 +131,23 @@
break;
case typelib_TypeClass_FLOAT:
*reinterpret_cast<float *>( pRegisterReturn ) = dret;
- break;
+ break;
case typelib_TypeClass_DOUBLE:
*reinterpret_cast<double *>( pRegisterReturn ) = dret;
break;
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ case typelib_TypeClass_STRUCT:
+ case typelib_TypeClass_EXCEPTION:
+ if (!ppc64::return_in_hidden_param(pReturnType))
+ {
+ sal_uInt64 *pRegisters = reinterpret_cast<sal_uInt64*>(pRegisterReturn);
+ pRegisters[0] = r3;
+ if (pReturnType->pType->nSize > 8)
+ pRegisters[1] = r4;
+ }
+#else
+ (void)r4;
+#endif
default:
break;
}
@@ -79,11 +156,13 @@
namespace
{
//==================================================================================================
-static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
- void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr,
+extern "C" void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
+ void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr,
sal_uInt64 *pStack, sal_uInt32 nStack,
sal_uInt64 *pGPR, sal_uInt32 nGPR,
- double *pFPR, sal_uInt32 nFPR)
+ double *pFPR, sal_uInt32 nFPR);
+
+#if 0
{
// Stack, if used, must be 16-bytes aligned
if ( nStack )
@@ -99,13 +178,13 @@
// Let's figure out what is really going on here
{
fprintf( stderr, "= callVirtualMethod() =\nGPR's (%d): ", nGPR );
- for ( int i = 0; i < nGPR; ++i )
+ for ( sal_uInt32 i = 0; i < nGPR; ++i )
fprintf( stderr, "0x%lx, ", pGPR[i] );
fprintf( stderr, "\nFPR's (%d): ", nFPR );
- for ( int i = 0; i < nFPR; ++i )
- fprintf( stderr, "0x%lx (%f), ", pFPR[i], pFPR[i] );
+ for ( sal_uInt32 i = 0; i < nFPR; ++i )
+ fprintf( stderr, "0x%lx (%lf), ", (sal_Int64)pFPR[i], pFPR[i] );
fprintf( stderr, "\nStack (%d): ", nStack );
- for ( int i = 0; i < nStack; ++i )
+ for ( sal_uInt32 i = 0; i < nStack; ++i )
fprintf( stderr, "0x%lx, ", pStack[i] );
fprintf( stderr, "\n" );
}
@@ -120,52 +199,40 @@
pMethod += 8 * nVtableIndex;
pMethod = *((sal_uInt64 *)pMethod);
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ typedef void (* FunctionCall )(...);
+#else
typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 );
+#endif
FunctionCall pFunc = (FunctionCall)pMethod;
volatile double dret;
// fill registers
__asm__ __volatile__ (
- "ld 3, 0(%0)\n\t"
- "ld 4, 8(%0)\n\t"
- "ld 5, 16(%0)\n\t"
- "ld 6, 24(%0)\n\t"
- "ld 7, 32(%0)\n\t"
- "ld 8, 40(%0)\n\t"
- "ld 9, 48(%0)\n\t"
- "ld 10, 56(%0)\n\t"
- "lfd 1, 0(%1)\n\t"
- "lfd 2, 8(%1)\n\t"
- "lfd 3, 16(%1)\n\t"
- "lfd 4, 24(%1)\n\t"
- "lfd 5, 32(%1)\n\t"
- "lfd 6, 40(%1)\n\t"
- "lfd 7, 48(%1)\n\t"
- "lfd 8, 56(%1)\n\t"
- "lfd 9, 64(%1)\n\t"
- "lfd 10, 72(%1)\n\t"
- "lfd 11, 80(%1)\n\t"
- "lfd 12, 88(%1)\n\t"
- "lfd 13, 96(%1)\n\t"
- : : "r" (pGPR), "r" (pFPR)
- : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
- "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
- "fr10", "fr11", "fr12", "fr13"
+ "lfd 1, 0(%0)\n\t"
+ "lfd 2, 8(%0)\n\t"
+ "lfd 3, 16(%0)\n\t"
+ "lfd 4, 24(%0)\n\t"
+ "lfd 5, 32(%0)\n\t"
+ "lfd 6, 40(%0)\n\t"
+ "lfd 7, 48(%0)\n\t"
+ "lfd 8, 56(%0)\n\t"
+ "lfd 9, 64(%0)\n\t"
+ "lfd 10, 72(%0)\n\t"
+ "lfd 11, 80(%0)\n\t"
+ "lfd 12, 88(%0)\n\t"
+ "lfd 13, 96(%0)\n\t"
+ : : "r" (pFPR)
+ : "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+ "fr10", "fr11", "fr12", "fr13"
);
// tell gcc that r3 to r11 are not available to it for doing the TOC and exception munge on the func call
register sal_uInt64 r3 asm("r3");
register sal_uInt64 r4 asm("r4");
- register sal_uInt64 r5 asm("r5");
- register sal_uInt64 r6 asm("r6");
- register sal_uInt64 r7 asm("r7");
- register sal_uInt64 r8 asm("r8");
- register sal_uInt64 r9 asm("r9");
- register sal_uInt64 r10 asm("r10");
- register sal_uInt64 r11 asm("r11");
-
- (*pFunc)(r3, r4, r5, r6, r7, r8, r9, r10);
+
+ (*pFunc)(pGPR[0], pGPR[1], pGPR[2], pGPR[3], pGPR[4], pGPR[5], pGPR[6], pGPR[7]);
// get return value
__asm__ __volatile__ (
@@ -174,8 +241,9 @@
"fmr %0, 1\n\t"
: "=f" (dret), "=r" (r3), "=r" (r4) : );
- MapReturn(r3, dret, pReturnTypeDescr->eTypeClass, pRegisterReturn);
+ MapReturn(r3, r4, dret, reinterpret_cast<typelib_TypeDescriptionReference *>(pReturnTypeDescr), pRegisterReturn);
}
+#endif
// Macros for easier insertion of values to registers or stack
// pSV - pointer to the source
@@ -185,23 +253,35 @@
// The value in %xmm register is already prepared to be retrieved as a float,
// thus we treat float and double the same
-#define INSERT_FLOAT( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_FLOAT( pSV, nr, pFPR, nGPR, pDS, bOverFlow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<float *>( pSV ); \
else \
- bOverFlow = true; \
+ bOverFlow = true; \
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
-#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_DOUBLE( pSV, nr, pFPR, nGPR, pDS, bOverFlow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
else \
- bOverFlow = true; \
+ bOverFlow = true; \
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
-#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int64 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int64 *>( pSV );
+
+#define INSERT_UINT64( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
else \
@@ -209,7 +289,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
-#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int32 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int32 *>( pSV );
+
+#define INSERT_UINT32( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
else \
@@ -217,7 +305,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
-#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int16 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int16 *>( pSV );
+
+#define INSERT_UINT16( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
else \
@@ -225,7 +321,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
-#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int8 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int8 *>( pSV );
+
+#define INSERT_UINT8( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
else \
@@ -337,19 +441,23 @@
INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_SHORT:
+ INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_CHAR:
case typelib_TypeClass_UNSIGNED_SHORT:
INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_BOOLEAN:
+ INSERT_UINT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_BYTE:
INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_FLOAT:
- INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
- break;
+ INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_DOUBLE:
- INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
+ INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverFlow );
break;
}
@@ -448,9 +556,18 @@
}
catch (...)
{
@ -36,3 +373,37 @@
// temporary params
for ( ; nTempIndizes--; )
@@ -475,8 +592,8 @@
void * pReturn, void * pArgs[], uno_Any ** ppException )
{
// is my surrogate
- bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
- = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
+ ::bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
+ = static_cast< ::bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
switch (pMemberDescr->eTypeClass)
@@ -484,8 +601,8 @@
case typelib_TypeClass_INTERFACE_ATTRIBUTE:
{
- VtableSlot aVtableSlot(
- getVtableSlot(
+ ::bridges::cpp_uno::shared::VtableSlot aVtableSlot(
+ ::bridges::cpp_uno::shared::getVtableSlot(
reinterpret_cast<
typelib_InterfaceAttributeTypeDescription const * >(
pMemberDescr)));
@@ -529,8 +646,8 @@
case typelib_TypeClass_INTERFACE_METHOD:
{
- VtableSlot aVtableSlot(
- getVtableSlot(
+ ::bridges::cpp_uno::shared::VtableSlot aVtableSlot(
+ ::bridges::cpp_uno::shared::getVtableSlot(
reinterpret_cast<
typelib_InterfaceMethodTypeDescription const * >(
pMemberDescr)));

View File

@ -0,0 +1,67 @@
--- set_soenv.in 2021-04-02 08:58:22.000000000 -0400
+++ set_soenv.in 2021-04-17 14:43:53.000000000 -0400
@@ -408,46 +403,26 @@
$JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."arm".$ds."native_threads";
$EPM_FLAGS = "-a arm";
}
- elsif ($platform =~ m/^powerpc/)
- {
- if (($platform =~ m/^powerpc64/) && ('@SIZEOF_LONG@' eq '8')) {
- print "Setting FreeBSD PPC64 specific values... ";
- $outfile = "FreeBSDPPC64Env.Set";
- $OUTPATH = "unxfbsdppc64";
- $CPUNAME = "POWERPC64";
-
- if ( $JDK eq "gcj" ) {
- $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64";
- $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."client";
- $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."native_threads";
- }
- }
- else {
- print "Setting FreeBSD PPC specific values... ";
- $outfile = "FreeBSDPPCEnv.Set";
- $OUTPATH = "unxlngppc";
- $CPUNAME = "POWERPC";
-
- if ( $JDK eq "gcj" ) {
- $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
- $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."client";
- $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."native_threads"; }
- elsif ($JDK =~ m/^[Ii][Bb][Mm]/)
- { $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
- $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."classic";
- $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
- }
- # OpenJDK
- elsif ($JDK =~ m/sun/) {
- $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
- $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."server";
- $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."native_threads";
- }
- }
-
+ elsif (($platform =~ m/^powerpc64/) && ('@SIZEOF_LONG@' eq '8'))
+ { print "Setting FreeBSD PPC64 specific values... ";
+ $outfile = "FreeBSDPPC64Env.Set";
$CPU = "P";
-
+ $CPUNAME = "POWERPC64";
+ $OUTPATH = "unxfbsdppc64";
+ $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64";
+ $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."server";
+ $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."native_threads";
}
+ elsif ($platform =~ m/powerpc/)
+ { print "Setting FreeBSD PPC specific values... ";
+ $outfile = "FreeBSDPPCEnv.Set";
+ $CPU = "P";
+ $CPUNAME = "POWERPC";
+ $OUTPATH = "unxfbsdppc";
+ $JRELIBDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
+ $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."client";
+ $JRETHREADDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."native_threads";
+ }
else
{ print "Unsupported FreeBSD architecture: $platform \n";
exit 1;

View File

@ -0,0 +1,34 @@
--- /dev/null
+++ solenv/inc/unxfbsdp.mk 2024-03-27 19:54:01.799314000 -0400
@@ -0,0 +1,31 @@
+#**************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#**************************************************************
+
+
+
+# mk file for Unix FreeBSD 64Bit PowerPC using GCC, inherit from
+# ppc and add some flags
+
+.INCLUDE : unxfbsdppc.mk
+
+CDEFS+=-DPOWERPC64
+CFLAGSCXX+=-mminimal-toc
+BUILD64=1

View File

@ -0,0 +1,12 @@
--- testtools/source/bridgetest/makefile.mk.orig
+++ testtools/source/bridgetest/makefile.mk
@@ -134,7 +134,7 @@
runtest : $(DLLDEST)$/uno_types.rdb $(DLLDEST)$/uno_services.rdb makefile.mk \
$(SHL1TARGETN) $(SHL2TARGETN) $(SHL3TARGETN)
-.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS" || "$(COM)$(OS)$(CPU)"=="GCCFREEBSDP"
+.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS" || "$(OS)$(CPU)"=="FREEBSDP"
@echo "Mac OSX PPC GCC and Solaris fails this test! likely broken UNO bridge. Fix me."
.ELSE
cd $(DLLDEST) && $(AUGMENT_LIBRARY_PATH) $(SOLARBINDIR)/uno \

View File

@ -0,0 +1,14 @@
--- bridges/Library_cpp_uno.mk.orig
+++ bridges/Library_cpp_uno.mk
@@ -131,6 +131,10 @@
bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp \
))
+$(eval $(call gb_Library_add_asmobjects,$(COMNAME)_uno,\
+ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/call \
+))
+
$(eval $(call gb_LinkTarget_set_cxx_optimization, \
bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno \
bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp \

View File

@ -0,0 +1,482 @@
--- /dev/null
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/call.s
@@ -0,0 +1,478 @@
+ .file "uno_ppc64_asm.cc"
+ .machine power4
+ .abiversion 2
+ .section ".text"
+ .align 2
+ .globl callVirtualMethod
+ .type callVirtualMethod, @function
+callVirtualMethod:
+.LFB0:
+ .cfi_startproc
+.LCF0:
+0: addis 2,12,.TOC.-.LCF0@ha
+ addi 2,2,.TOC.-.LCF0@l
+ .localentry callVirtualMethod,.-callVirtualMethod
+ mflr 0
+ std 0,16(1)
+ std 31,-8(1)
+ stdu 1,-208(1)
+ .cfi_def_cfa_offset 208
+ .cfi_offset 65, 16
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ std 3,136(31)
+ std 5,128(31)
+ std 6,120(31)
+ std 7,112(31)
+ std 9,104(31)
+ mr 9,4
+ stw 9,248(31)
+ mr 9,8
+ stw 9,280(31)
+ mr 9,10
+ stw 9,296(31)
+ ld 9,304(31)
+ std 9,96(31)
+ ld 9,-28688(13)
+ std 9,184(31)
+ li 9,0
+ lwz 9,280(31)
+ cmpwi 0,9,0
+ beq 0,.L2
+ lwz 9,280(31)
+ addi 9,9,1
+ rldicl 9,9,0,32
+ rlwinm 9,9,0,0,30
+ stw 9,280(31)
+.L2:
+#ifdef __LITTLE_ENDIAN__
+ lwz 9,312(31)
+#else
+ lwz 9,316(31)
+#endif
+ cmplwi 0,9,13
+ ble 0,.L3
+ li 9,13
+#ifdef __LITTLE_ENDIAN__
+ stw 9,312(31)
+#else
+ stw 9,316(31)
+#endif
+.L3:
+ lwz 9,296(31)
+ cmplwi 0,9,8
+ ble 0,.L4
+ li 9,8
+ stw 9,296(31)
+.L4:
+ lwz 9,280(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ addi 9,9,15
+ srdi 9,9,4
+ sldi 9,9,4
+ ld 10,0(1)
+ neg 9,9
+ stdux 10,1,9
+ addi 9,1,96
+ addi 9,9,15
+ srdi 9,9,4
+ sldi 9,9,4
+ std 9,160(31)
+ lwz 9,280(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ mr 8,9
+ ld 10,160(31)
+ ld 9,112(31)
+ mr 5,8
+ mr 4,9
+ mr 3,10
+ bl memcpy
+ nop
+ ld 9,136(31)
+ ld 9,0(9)
+ std 9,168(31)
+ lwz 9,248(31)
+ slwi 9,9,3
+ rldicl 9,9,0,32
+ mr 10,9
+ ld 9,168(31)
+ add 9,9,10
+ std 9,168(31)
+ ld 9,168(31)
+ ld 9,0(9)
+ std 9,168(31)
+ ld 9,168(31)
+ std 9,176(31)
+ ld 9,96(31)
+#APP
+ # 123 "uno_ppc64_asm.cc" 1
+ lfd 1, 0(9)
+ lfd 2, 8(9)
+ lfd 3, 16(9)
+ lfd 4, 24(9)
+ lfd 5, 32(9)
+ lfd 6, 40(9)
+ lfd 7, 48(9)
+ lfd 8, 56(9)
+ lfd 9, 64(9)
+ lfd 10, 72(9)
+ lfd 11, 80(9)
+ lfd 12, 88(9)
+ lfd 13, 96(9)
+
+ # 0 "" 2
+#NO_APP
+ ld 9,104(31)
+ ld 3,0(9)
+ ld 9,104(31)
+ addi 9,9,8
+ ld 4,0(9)
+ ld 9,104(31)
+ addi 9,9,16
+ ld 5,0(9)
+ ld 9,104(31)
+ addi 9,9,24
+ ld 6,0(9)
+ ld 9,104(31)
+ addi 9,9,32
+ ld 7,0(9)
+ ld 9,104(31)
+ addi 9,9,40
+ ld 8,0(9)
+ ld 9,104(31)
+ addi 9,9,48
+ ld 0,0(9)
+ ld 9,104(31)
+ addi 9,9,56
+ ld 9,0(9)
+ ld 11,176(31)
+ mr 10,9
+ mr 9,0
+ std 2,24(1)
+ mr 12,11
+ mtctr 12
+ bctrl
+ ld 2,24(1)
+#APP
+ # 149 "uno_ppc64_asm.cc" 1
+ mr 3, 3
+ mr 4, 4
+ fmr 0, 1
+
+ # 0 "" 2
+#NO_APP
+ stfd 0,152(31)
+ mr 9,3
+ mr 10,4
+ lfd 0,152(31)
+ ld 7,128(31)
+ ld 6,120(31)
+ fmr 1,0
+ mr 4,10
+ mr 3,9
+ bl MapReturn
+ nop
+ nop
+ ld 9,184(31)
+ ld 10,-28688(13)
+ xor. 9,9,10
+ li 10,0
+ beq 0,.L5
+ bl __stack_chk_fail
+ nop
+.L5:
+ addi 1,31,208
+ .cfi_def_cfa 1, 0
+ ld 0,16(1)
+ mtlr 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,1,128,1,0,1
+ .cfi_endproc
+.LFE0:
+ .size callVirtualMethod,.-callVirtualMethod
+ .section ".toc","aw"
+ .align 3
+.LC0:
+ .quad .L9
+ .section ".text"
+ .align 2
+ .globl privateSnippetExecutor
+ .type privateSnippetExecutor, @function
+privateSnippetExecutor:
+.LFB1:
+ .cfi_startproc
+.LCF1:
+0: addis 2,12,.TOC.-.LCF1@ha
+ addi 2,2,.TOC.-.LCF1@l
+ .localentry privateSnippetExecutor,.-privateSnippetExecutor
+ mflr 0
+ std 0,16(1)
+ std 31,-8(1)
+ stdu 1,-272(1)
+ .cfi_def_cfa_offset 272
+ .cfi_offset 65, 16
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ ld 0,-28688(13)
+ std 0,248(31)
+ li 0,0
+ std 3,80(31)
+ std 4,88(31)
+ std 5,96(31)
+ std 6,104(31)
+ std 7,112(31)
+ std 8,120(31)
+ std 9,128(31)
+ mr 9,10
+ std 9,136(31)
+ addi 9,31,144
+#APP
+ # 173 "uno_ppc64_asm.cc" 1
+ stfd 1, 0(9)
+stfd 2, 8(9)
+stfd 3, 16(9)
+stfd 4, 24(9)
+stfd 5, 32(9)
+stfd 6, 40(9)
+stfd 7, 48(9)
+stfd 8, 56(9)
+stfd 9, 64(9)
+stfd 10, 72(9)
+stfd 11, 80(9)
+stfd 12, 88(9)
+stfd 13, 96(9)
+
+ # 0 "" 2
+#NO_APP
+ std 11,48(31)
+ std 1,56(31)
+ ld 9,48(31)
+ addi 7,31,64
+ addi 8,31,144
+ addi 10,31,80
+ ld 6,56(31)
+ mr 5,8
+ mr 4,10
+ mr 3,9
+ bl cpp_mediate
+ nop
+ mr 9,3
+ stw 9,44(31)
+ lwa 9,44(31)
+ cmplwi 0,9,15
+ bgt 0,.L7
+ sldi 10,9,2
+ addis 8,2,.LC0@toc@ha
+ ld 9,.LC0@toc@l(8)
+ add 9,10,9
+ lwz 10,0(9)
+ ld 9,.LC0@toc@l(8)
+ extsw 10,10
+ add 9,10,9
+ mtctr 9
+ bctr
+ .p2align 2
+ .align 2
+.L9:
+ .long .L19-.L9
+ .long .L13-.L9
+ .long .L15-.L9
+ .long .L15-.L9
+ .long .L14-.L9
+ .long .L13-.L9
+ .long .L12-.L9
+ .long .L8-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L11-.L9
+ .long .L10-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L7-.L9
+ .long .L8-.L9
+.L15:
+#APP
+ # 209 "uno_ppc64_asm.cc" 1
+ lbz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L13:
+#APP
+ # 214 "uno_ppc64_asm.cc" 1
+ lhz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L14:
+#APP
+ # 218 "uno_ppc64_asm.cc" 1
+ lha 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L8:
+#APP
+ # 223 "uno_ppc64_asm.cc" 1
+ lwz 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L12:
+#APP
+ # 227 "uno_ppc64_asm.cc" 1
+ lwa 3,64(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L11:
+ addi 9,31,64
+#APP
+ # 231 "uno_ppc64_asm.cc" 1
+ lfs 1,0(9)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L10:
+ addi 9,31,64
+#APP
+ # 235 "uno_ppc64_asm.cc" 1
+ lfd 1,0(9)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L7:
+#APP
+ # 239 "uno_ppc64_asm.cc" 1
+ ld 3,64(31)
+
+ # 0 "" 2
+ # 241 "uno_ppc64_asm.cc" 1
+ ld 4,72(31)
+
+ # 0 "" 2
+#NO_APP
+ b .L17
+.L19:
+ nop
+.L17:
+ nop
+ ld 9,248(31)
+ ld 10,-28688(13)
+ xor. 9,9,10
+ li 10,0
+ beq 0,.L18
+ bl __stack_chk_fail
+ nop
+.L18:
+ addi 1,31,272
+ .cfi_def_cfa 1, 0
+ ld 0,16(1)
+ mtlr 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,1,128,1,0,1
+ .cfi_endproc
+.LFE1:
+ .size privateSnippetExecutor,.-privateSnippetExecutor
+ .section .rodata
+ .align 2
+ .type _ZL15codeSnippetSize, @object
+ .size _ZL15codeSnippetSize, 4
+_ZL15codeSnippetSize:
+ .long 32
+ .section ".text"
+ .align 2
+ .globl codeSnippet
+ .type codeSnippet, @function
+codeSnippet:
+.LFB2:
+ .cfi_startproc
+.LCF2:
+0: addis 2,12,.TOC.-.LCF2@ha
+ addi 2,2,.TOC.-.LCF2@l
+ .localentry codeSnippet,.-codeSnippet
+ std 31,-8(1)
+ stdu 1,-96(1)
+ .cfi_def_cfa_offset 96
+ .cfi_offset 31, -8
+ mr 31,1
+ .cfi_def_cfa_register 31
+ std 3,56(31)
+ mr 9,4
+ mr 8,5
+ mr 10,6
+ stw 9,52(31)
+ mr 9,8
+ stw 9,48(31)
+ mr 9,10
+ stb 9,47(31)
+ lwa 9,48(31)
+ sldi 10,9,32
+ lwa 9,52(31)
+ or 9,10,9
+ std 9,64(31)
+ lbz 9,47(31)
+ cmpwi 0,9,0
+ beq 0,.L21
+ ld 9,64(31)
+ oris 9,9,0x8000
+ std 9,64(31)
+.L21:
+ ld 9,56(31)
+ std 9,72(31)
+ ld 9,72(31)
+ lis 10,0xe96c
+ ori 10,10,0x18
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,4
+ lis 10,0xe98c
+ ori 10,10,0x10
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,8
+ lis 10,0x7d89
+ ori 10,10,0x3a6
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,12
+ lis 10,0x4e80
+ ori 10,10,0x420
+ stw 10,0(9)
+ ld 9,72(31)
+ addi 9,9,16
+ addis 10,2,privateSnippetExecutor@toc@ha
+ addi 10,10,privateSnippetExecutor@toc@l
+ std 10,0(9)
+ ld 9,72(31)
+ addi 9,9,24
+ ld 10,64(31)
+ std 10,0(9)
+ ld 9,56(31)
+ addi 9,9,32
+ mr 3,9
+ addi 1,31,96
+ .cfi_def_cfa 1, 0
+ ld 31,-8(1)
+ blr
+ .long 0
+ .byte 0,9,0,0,128,1,0,1
+ .cfi_endproc
+.LFE2:
+ .size codeSnippet,.-codeSnippet
+ .section .note.GNU-stack,"",@progbits

View File

@ -0,0 +1,257 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx
@@ -28,6 +28,7 @@
#include <uno/data.h>
#include <typelib/typedescription.hxx>
+#include <osl/endian.h>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
@@ -37,6 +38,11 @@
#include <stdio.h>
#include <string.h>
+#ifdef OSL_BIGENDIAN
+#define IS_BIG_ENDIAN 1
+#else
+#define IS_BIG_ENDIAN 0
+#endif
using namespace ::com::sun::star::uno;
@@ -144,14 +150,14 @@
case typelib_TypeClass_BYTE:
case typelib_TypeClass_BOOLEAN:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-1));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 7*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 7*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -160,14 +166,14 @@
case typelib_TypeClass_SHORT:
case typelib_TypeClass_UNSIGNED_SHORT:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-2));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 6*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 6*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -176,14 +182,14 @@
case typelib_TypeClass_LONG:
case typelib_TypeClass_UNSIGNED_LONG:
if (ng < ppc64::MAX_GPR_REGS)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-4));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 4*IS_BIG_ENDIAN);
ng++;
gpreg++;
}
else
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-4));
+ {
+ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 4*IS_BIG_ENDIAN);
bOverFlowUsed = true;
}
if (bOverFlowUsed) ovrflw++;
@@ -327,21 +333,25 @@
}
}
-
-//==================================================================================================
-static typelib_TypeClass cpp_mediate(
- sal_uInt64 nOffsetAndIndex,
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+# define PARAMSAVE 32
+#else
+# define PARAMSAVE 48
+#endif
+
+extern "C" typelib_TypeClass cpp_mediate(
+ sal_uInt64 nOffsetAndIndex,
void ** gpreg, void ** fpreg, long sp,
- sal_Int64 * pRegisterReturn /* space for register return */ )
-{
- OSL_ENSURE( sizeof(sal_Int64)==sizeof(void *), "### unexpected!" );
+ sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+ static_assert(sizeof(sal_Int64)==sizeof(void *), "### unexpected!");
sal_Int32 nVtableOffset = (nOffsetAndIndex >> 32);
sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF);
long sf = *(long*)sp;
- void ** ovrflw = (void**)(sf + 112);
-
+ void ** ovrflw = (void**)(sf + PARAMSAVE + 64);
+
// gpreg: [ret *], this, [other gpr params]
// fpreg: [fpr params]
// ovrflw: [gpr or fpr params (properly aligned)]
@@ -501,54 +511,52 @@
return eRet;
}
-extern "C" void privateSnippetExecutor( ... )
-{
- volatile long nOffsetAndIndex;
-
- //mr %r3, %r11 # move into arg1 the 64bit value passed from OOo
+extern "C" void privateSnippetExecutor( ... );
+#if 0
+{
+ 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;
+
+ double fpreg[ppc64::MAX_SSE_REGS];
+
__asm__ __volatile__ (
- "mr %0, 11\n\t"
- : "=r" (nOffsetAndIndex) : );
-
- sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
- double fpreg[ppc64::MAX_SSE_REGS];
-
- __asm__ __volatile__ (
- "std 3, 0(%0)\t\n"
- "std 4, 8(%0)\t\n"
- "std 5, 16(%0)\t\n"
- "std 6, 24(%0)\t\n"
- "std 7, 32(%0)\t\n"
- "std 8, 40(%0)\t\n"
- "std 9, 48(%0)\t\n"
- "std 10, 56(%0)\t\n"
- "stfd 1, 0(%1)\t\n"
- "stfd 2, 8(%1)\t\n"
- "stfd 3, 16(%1)\t\n"
- "stfd 4, 24(%1)\t\n"
- "stfd 5, 32(%1)\t\n"
- "stfd 6, 40(%1)\t\n"
- "stfd 7, 48(%1)\t\n"
- "stfd 8, 56(%1)\t\n"
- "stfd 9, 64(%1)\t\n"
- "stfd 10, 72(%1)\t\n"
- "stfd 11, 80(%1)\t\n"
- "stfd 12, 88(%1)\t\n"
- "stfd 13, 96(%1)\t\n"
- : : "r" (gpreg), "r" (fpreg)
- : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
- "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+ "stfd 1, 0(%0)\t\n"
+ "stfd 2, 8(%0)\t\n"
+ "stfd 3, 16(%0)\t\n"
+ "stfd 4, 24(%0)\t\n"
+ "stfd 5, 32(%0)\t\n"
+ "stfd 6, 40(%0)\t\n"
+ "stfd 7, 48(%0)\t\n"
+ "stfd 8, 56(%0)\t\n"
+ "stfd 9, 64(%0)\t\n"
+ "stfd 10, 72(%0)\t\n"
+ "stfd 11, 80(%0)\t\n"
+ "stfd 12, 88(%0)\t\n"
+ "stfd 13, 96(%0)\t\n"
+ : : "r" (fpreg)
+ : "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
"fr10", "fr11", "fr12", "fr13"
);
- volatile long sp;
-
- //stack pointer
- __asm__ __volatile__ (
- "mr %0, 1\n\t"
- : "=r" (sp) : );
-
+ register long r11 asm("r11");
+ const long nOffsetAndIndex = r11;
+
+ register long r1 asm("r1");
+ const long sp = r1;
+
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ volatile long nRegReturn[2];
+#else
volatile long nRegReturn[1];
+#endif
typelib_TypeClass aType =
cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn);
@@ -591,11 +599,20 @@
default:
__asm__( "ld 3,%0\n\t"
: : "m" (nRegReturn[0]) );
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ __asm__( "ld 4,%0\n\t"
+ : : "m" (nRegReturn[1]) );
+#endif
break;
}
}
-
+#endif
+
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+const int codeSnippetSize = 32;
+#else
const int codeSnippetSize = 24;
+#endif
unsigned char * codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset,
bool simpleRetType)
@@ -609,10 +626,22 @@
if ( !simpleRetType )
nOffsetAndIndex |= 0x80000000;
-
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ unsigned int *raw = (unsigned int *)&code[0];
+
+ raw[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */
+ raw[1] = 0xe98c0010; /* ld 12,1f-0b(12) */
+ raw[2] = 0x7d8903a6; /* mtctr 12 */
+ raw[3] = 0x4e800420; /* bctr */
+ /* 1: .quad function_addr */
+ /* 2: .quad context */
+ *(void **)&raw[4] = (void *)privateSnippetExecutor;
+ *(void **)&raw[6] = (void*)nOffsetAndIndex;
+#else
void ** raw = (void **)&code[0];
memcpy(raw, (char*) privateSnippetExecutor, 16);
raw[2] = (void*) nOffsetAndIndex;
+#endif
#ifdef CMC_DEBUG
fprintf(stderr, "in: offset/index is %x %x %d, %lx\n",
nFunctionIndex, nVtableOffset, !simpleRetType, raw[2]);

View File

@ -0,0 +1,21 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
@@ -53,7 +53,8 @@
SLOFILES= \
$(SLO)$/except.obj \
$(SLO)$/cpp2uno.obj \
- $(SLO)$/uno2cpp.obj
+ $(SLO)$/uno2cpp.obj \
+ $(SLO)$/call.obj
SHL1TARGET= $(TARGET)
@@ -73,3 +74,7 @@
# --- Targets ------------------------------------------------------
.INCLUDE : target.mk
+
+$(SLO)$/%.obj: %.s
+ $(CC) -c -o $(SLO)$/$(@:b).o $<
+ touch $@

View File

@ -1,6 +1,65 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx.orig 2019-09-17 22:55:10 UTC
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx
@@ -35,6 +35,7 @@ namespace CPPU_CURRENT_NAMESPACE
@@ -25,16 +25,64 @@
#include <typeinfo>
#include <exception>
+
+#include <cxxabi.h>
+#ifndef _GLIBCXX_CDTOR_CALLABI // new in GCC 4.7 cxxabi.h
+#define _GLIBCXX_CDTOR_CALLABI
+#endif
#include <cstddef>
+
+#ifndef CONFIG_CXXABI_H
+#define CONFIG_CXXABI_H
+
+#define HAVE_CXXABI_H_BASE_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_CXA_ALLOCATE_EXCEPTION 0
+#define HAVE_CXXABI_H_CXA_EH_GLOBALS 1
+#define HAVE_CXXABI_H_CXA_EXCEPTION 1
+#define HAVE_CXXABI_H_CXA_GET_GLOBALS 1
+#define HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE 1
+#define HAVE_CXXABI_H_CXA_THROW 0
+#define HAVE_CXXABI_H_SI_CLASS_TYPE_INFO 0
+#define HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO 0
+
+#endif
+
+#if !HAVE_CXXABI_H_CLASS_TYPE_INFO
+// <https://mentorembedded.github.io/cxx-abi/abi.html>,
+// libstdc++-v3/libsupc++/cxxabi.h:
+namespace __cxxabiv1 {
+class __class_type_info: public std::type_info {
+public:
+ explicit __class_type_info(char const * n): type_info(n) {}
+ ~__class_type_info();
+};
+}
+#endif
+
+#if !HAVE_CXXABI_H_SI_CLASS_TYPE_INFO
+// <https://mentorembedded.github.io/cxx-abi/abi.html>,
+// libstdc++-v3/libsupc++/cxxabi.h:
+namespace __cxxabiv1 {
+class __si_class_type_info: public __class_type_info {
+public:
+ __class_type_info const * __base_type;
+ explicit __si_class_type_info(
+ char const * n, __class_type_info const *base):
+ __class_type_info(n), __base_type(base) {}
+ ~__si_class_type_info();
+};
+}
+#endif
namespace CPPU_CURRENT_NAMESPACE
{
- void dummy_can_throw_anything( char const * );
-
+void dummy_can_throw_anything( char const * );
// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
@ -8,15 +67,14 @@
struct _Unwind_Exception
{
unsigned exception_class __attribute__((__mode__(__DI__)));
@@ -63,18 +64,21 @@ struct __cxa_exception
@@ -63,18 +111,21 @@
_Unwind_Exception unwindHeader;
};
+#endif /* __GLIBCXX__ */
extern "C" void *__cxa_allocate_exception(
- std::size_t thrown_size ) throw();
+ size_t thrown_size );
std::size_t thrown_size ) throw();
extern "C" void __cxa_throw (
void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn));
@ -31,7 +89,7 @@
// -----
@@ -82,6 +86,10 @@ void raiseException(
@@ -82,11 +133,16 @@
void raiseException(
uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
//==================================================================================================
@ -42,3 +100,11 @@
void fillUnoException(
__cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
}
namespace ppc64
{
- enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+ enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
}

View File

@ -1,9 +1,24 @@
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx.orig 2019-09-17 22:55:10 UTC
--- bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx.orig
+++ bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
@@ -42,6 +42,14 @@ using namespace ::com::sun::star::uno;
@@ -26,6 +26,12 @@
#include <stdlib.h>
+#include <exception>
+#include <malloc.h>
+#include <typeinfo>
+
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/uno/genfunc.hxx>
#include <uno/data.h>
@@ -42,10 +48,68 @@
using namespace ::rtl;
using namespace ::com::sun::star::uno;
-
-void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+#ifdef __GLIBCXX__
+using CPPU_CURRENT_NAMESPACE::__cxa_exception;
+using CPPU_CURRENT_NAMESPACE::__cxa_get_globals;
@ -12,10 +27,332 @@
+using __cxxabiv1::__cxa_current_primary_exception;
+using __cxxabiv1::__cxa_decrement_exception_refcount;
+#endif
void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+
+namespace ppc64
{
@@ -448,9 +456,18 @@ static void cpp_call(
- switch (eTypeClass)
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ bool is_complex_struct(const typelib_TypeDescription * type)
+ {
+ const typelib_CompoundTypeDescription * p
+ = reinterpret_cast< const typelib_CompoundTypeDescription * >(type);
+ for (sal_Int32 i = 0; i < p->nMembers; ++i)
+ {
+ if (p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_STRUCT ||
+ p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_EXCEPTION)
+ {
+ typelib_TypeDescription * t = 0;
+ TYPELIB_DANGER_GET(&t, p->ppTypeRefs[i]);
+ bool b = is_complex_struct(t);
+ TYPELIB_DANGER_RELEASE(t);
+ if (b) {
+ return true;
+ }
+ }
+ else if (!bridges::cpp_uno::shared::isSimpleType(p->ppTypeRefs[i]->eTypeClass))
+ return true;
+ }
+ if (p->pBaseTypeDescription != 0)
+ return is_complex_struct(&p->pBaseTypeDescription->aBase);
+ return false;
+ }
+#endif
+
+ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef )
+ {
+ if (bridges::cpp_uno::shared::isSimpleType(pTypeRef))
+ return false;
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
+ {
+ typelib_TypeDescription * pTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
+
+ //A Composite Type not larger than 16 bytes is returned in up to two GPRs
+ bool bRet = pTypeDescr->nSize > 16 || is_complex_struct(pTypeDescr);
+
+ TYPELIB_DANGER_RELEASE( pTypeDescr );
+ return bRet;
+ }
+#endif
+ return true;
+ }
+}
+
+extern "C" void MapReturn(long r3, long r4, double dret, typelib_TypeDescriptionReference* pReturnType, void *pRegisterReturn)
+{
+ switch (pReturnType->eTypeClass)
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
@@ -67,10 +131,23 @@
break;
case typelib_TypeClass_FLOAT:
*reinterpret_cast<float *>( pRegisterReturn ) = dret;
- break;
+ break;
case typelib_TypeClass_DOUBLE:
*reinterpret_cast<double *>( pRegisterReturn ) = dret;
break;
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ case typelib_TypeClass_STRUCT:
+ case typelib_TypeClass_EXCEPTION:
+ if (!ppc64::return_in_hidden_param(pReturnType))
+ {
+ sal_uInt64 *pRegisters = reinterpret_cast<sal_uInt64*>(pRegisterReturn);
+ pRegisters[0] = r3;
+ if (pReturnType->pType->nSize > 8)
+ pRegisters[1] = r4;
+ }
+#else
+ (void)r4;
+#endif
default:
break;
}
@@ -79,11 +156,13 @@
namespace
{
//==================================================================================================
-static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
- void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr,
+extern "C" void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
+ void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr,
sal_uInt64 *pStack, sal_uInt32 nStack,
sal_uInt64 *pGPR, sal_uInt32 nGPR,
- double *pFPR, sal_uInt32 nFPR)
+ double *pFPR, sal_uInt32 nFPR);
+
+#if 0
{
// Stack, if used, must be 16-bytes aligned
if ( nStack )
@@ -99,13 +178,13 @@
// Let's figure out what is really going on here
{
fprintf( stderr, "= callVirtualMethod() =\nGPR's (%d): ", nGPR );
- for ( int i = 0; i < nGPR; ++i )
+ for ( sal_uInt32 i = 0; i < nGPR; ++i )
fprintf( stderr, "0x%lx, ", pGPR[i] );
fprintf( stderr, "\nFPR's (%d): ", nFPR );
- for ( int i = 0; i < nFPR; ++i )
- fprintf( stderr, "0x%lx (%f), ", pFPR[i], pFPR[i] );
+ for ( sal_uInt32 i = 0; i < nFPR; ++i )
+ fprintf( stderr, "0x%lx (%lf), ", (sal_Int64)pFPR[i], pFPR[i] );
fprintf( stderr, "\nStack (%d): ", nStack );
- for ( int i = 0; i < nStack; ++i )
+ for ( sal_uInt32 i = 0; i < nStack; ++i )
fprintf( stderr, "0x%lx, ", pStack[i] );
fprintf( stderr, "\n" );
}
@@ -120,52 +199,40 @@
pMethod += 8 * nVtableIndex;
pMethod = *((sal_uInt64 *)pMethod);
+#if defined(_CALL_ELF) && _CALL_ELF == 2
+ typedef void (* FunctionCall )(...);
+#else
typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 );
+#endif
FunctionCall pFunc = (FunctionCall)pMethod;
volatile double dret;
// fill registers
__asm__ __volatile__ (
- "ld 3, 0(%0)\n\t"
- "ld 4, 8(%0)\n\t"
- "ld 5, 16(%0)\n\t"
- "ld 6, 24(%0)\n\t"
- "ld 7, 32(%0)\n\t"
- "ld 8, 40(%0)\n\t"
- "ld 9, 48(%0)\n\t"
- "ld 10, 56(%0)\n\t"
- "lfd 1, 0(%1)\n\t"
- "lfd 2, 8(%1)\n\t"
- "lfd 3, 16(%1)\n\t"
- "lfd 4, 24(%1)\n\t"
- "lfd 5, 32(%1)\n\t"
- "lfd 6, 40(%1)\n\t"
- "lfd 7, 48(%1)\n\t"
- "lfd 8, 56(%1)\n\t"
- "lfd 9, 64(%1)\n\t"
- "lfd 10, 72(%1)\n\t"
- "lfd 11, 80(%1)\n\t"
- "lfd 12, 88(%1)\n\t"
- "lfd 13, 96(%1)\n\t"
- : : "r" (pGPR), "r" (pFPR)
- : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
- "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
- "fr10", "fr11", "fr12", "fr13"
+ "lfd 1, 0(%0)\n\t"
+ "lfd 2, 8(%0)\n\t"
+ "lfd 3, 16(%0)\n\t"
+ "lfd 4, 24(%0)\n\t"
+ "lfd 5, 32(%0)\n\t"
+ "lfd 6, 40(%0)\n\t"
+ "lfd 7, 48(%0)\n\t"
+ "lfd 8, 56(%0)\n\t"
+ "lfd 9, 64(%0)\n\t"
+ "lfd 10, 72(%0)\n\t"
+ "lfd 11, 80(%0)\n\t"
+ "lfd 12, 88(%0)\n\t"
+ "lfd 13, 96(%0)\n\t"
+ : : "r" (pFPR)
+ : "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+ "fr10", "fr11", "fr12", "fr13"
);
// tell gcc that r3 to r11 are not available to it for doing the TOC and exception munge on the func call
register sal_uInt64 r3 asm("r3");
register sal_uInt64 r4 asm("r4");
- register sal_uInt64 r5 asm("r5");
- register sal_uInt64 r6 asm("r6");
- register sal_uInt64 r7 asm("r7");
- register sal_uInt64 r8 asm("r8");
- register sal_uInt64 r9 asm("r9");
- register sal_uInt64 r10 asm("r10");
- register sal_uInt64 r11 asm("r11");
-
- (*pFunc)(r3, r4, r5, r6, r7, r8, r9, r10);
+
+ (*pFunc)(pGPR[0], pGPR[1], pGPR[2], pGPR[3], pGPR[4], pGPR[5], pGPR[6], pGPR[7]);
// get return value
__asm__ __volatile__ (
@@ -174,8 +241,9 @@
"fmr %0, 1\n\t"
: "=f" (dret), "=r" (r3), "=r" (r4) : );
- MapReturn(r3, dret, pReturnTypeDescr->eTypeClass, pRegisterReturn);
+ MapReturn(r3, r4, dret, reinterpret_cast<typelib_TypeDescriptionReference *>(pReturnTypeDescr), pRegisterReturn);
}
+#endif
// Macros for easier insertion of values to registers or stack
// pSV - pointer to the source
@@ -185,23 +253,35 @@
// The value in %xmm register is already prepared to be retrieved as a float,
// thus we treat float and double the same
-#define INSERT_FLOAT( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_FLOAT( pSV, nr, pFPR, nGPR, pDS, bOverFlow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<float *>( pSV ); \
else \
- bOverFlow = true; \
+ bOverFlow = true; \
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
-#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_DOUBLE( pSV, nr, pFPR, nGPR, pDS, bOverFlow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
else \
- bOverFlow = true; \
+ bOverFlow = true; \
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
-#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int64 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int64 *>( pSV );
+
+#define INSERT_UINT64( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
else \
@@ -209,7 +289,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
-#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int32 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int32 *>( pSV );
+
+#define INSERT_UINT32( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
else \
@@ -217,7 +305,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
-#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int16 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int16 *>( pSV );
+
+#define INSERT_UINT16( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
else \
@@ -225,7 +321,15 @@
if (bOverFlow) \
*pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
-#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverflow ) \
+#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverFlow ) \
+ if ( nr < ppc64::MAX_GPR_REGS ) \
+ pGPR[nr++] = *reinterpret_cast<sal_Int8 *>( pSV ); \
+ else \
+ bOverFlow = true; \
+ if (bOverFlow) \
+ *pDS++ = *reinterpret_cast<sal_Int8 *>( pSV );
+
+#define INSERT_UINT8( pSV, nr, pGPR, pDS, bOverFlow ) \
if ( nr < ppc64::MAX_GPR_REGS ) \
pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
else \
@@ -337,19 +441,23 @@
INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_SHORT:
+ INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_CHAR:
case typelib_TypeClass_UNSIGNED_SHORT:
INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_BOOLEAN:
+ INSERT_UINT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_BYTE:
INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
break;
case typelib_TypeClass_FLOAT:
- INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
- break;
+ INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverFlow );
+ break;
case typelib_TypeClass_DOUBLE:
- INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
+ INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverFlow );
break;
}
@@ -448,9 +556,18 @@
}
catch (...)
{
@ -36,3 +373,37 @@
// temporary params
for ( ; nTempIndizes--; )
@@ -475,8 +592,8 @@
void * pReturn, void * pArgs[], uno_Any ** ppException )
{
// is my surrogate
- bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
- = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
+ ::bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
+ = static_cast< ::bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
switch (pMemberDescr->eTypeClass)
@@ -484,8 +601,8 @@
case typelib_TypeClass_INTERFACE_ATTRIBUTE:
{
- VtableSlot aVtableSlot(
- getVtableSlot(
+ ::bridges::cpp_uno::shared::VtableSlot aVtableSlot(
+ ::bridges::cpp_uno::shared::getVtableSlot(
reinterpret_cast<
typelib_InterfaceAttributeTypeDescription const * >(
pMemberDescr)));
@@ -529,8 +646,8 @@
case typelib_TypeClass_INTERFACE_METHOD:
{
- VtableSlot aVtableSlot(
- getVtableSlot(
+ ::bridges::cpp_uno::shared::VtableSlot aVtableSlot(
+ ::bridges::cpp_uno::shared::getVtableSlot(
reinterpret_cast<
typelib_InterfaceMethodTypeDescription const * >(
pMemberDescr)));

View File

@ -0,0 +1,34 @@
--- /dev/null
+++ solenv/inc/unxfbsdp.mk 2024-03-27 19:54:01.799314000 -0400
@@ -0,0 +1,31 @@
+#**************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#**************************************************************
+
+
+
+# mk file for Unix FreeBSD 64Bit PowerPC using GCC, inherit from
+# ppc and add some flags
+
+.INCLUDE : unxfbsdppc.mk
+
+CDEFS+=-DPOWERPC64
+CFLAGSCXX+=-mminimal-toc
+BUILD64=1

View File

@ -0,0 +1,12 @@
--- testtools/source/bridgetest/makefile.mk.orig
+++ testtools/source/bridgetest/makefile.mk
@@ -134,7 +134,7 @@
runtest : $(DLLDEST)$/uno_types.rdb $(DLLDEST)$/uno_services.rdb makefile.mk \
$(SHL1TARGETN) $(SHL2TARGETN) $(SHL3TARGETN)
-.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS" || "$(COM)$(OS)$(CPU)"=="GCCFREEBSDP"
+.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS" || "$(OS)$(CPU)"=="FREEBSDP"
@echo "Mac OSX PPC GCC and Solaris fails this test! likely broken UNO bridge. Fix me."
.ELSE
cd $(DLLDEST) && $(AUGMENT_LIBRARY_PATH) $(SOLARBINDIR)/uno \