parent
9ac316ca15
commit
16611a273c
@ -0,0 +1,54 @@
|
|||||||
|
From 032084d8582ef8eb04724d2488f3e381ac8054d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Tardon <dtardon@redhat.com>
|
||||||
|
Date: Mon, 23 Apr 2012 13:19:39 +0200
|
||||||
|
Subject: [PATCH] do not let gcc use registers we are setting ourselves
|
||||||
|
|
||||||
|
gcc uses a register for the function call--and it tried r9 here...
|
||||||
|
---
|
||||||
|
.../source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx | 16 +++++++++++++---
|
||||||
|
1 files changed, 13 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
|
||||||
|
index 34e8c63..f409bf7 100644
|
||||||
|
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
|
||||||
|
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
|
||||||
|
@@ -67,7 +67,6 @@ static void callVirtualMethod(
|
||||||
|
// of floating point registers f1 to f8
|
||||||
|
|
||||||
|
unsigned long * mfunc; // actual function to be invoked
|
||||||
|
- void (*ptr)();
|
||||||
|
int gpr[8]; // storage for gpregisters, map to r3-r10
|
||||||
|
int off; // offset used to find function
|
||||||
|
#ifndef __NO_FPRS__
|
||||||
|
@@ -243,7 +242,8 @@ static void callVirtualMethod(
|
||||||
|
mfunc = *((unsigned long **)pAdjustedThisPtr); // get the address of the vtable
|
||||||
|
mfunc = (unsigned long *)((char *)mfunc + off); // get the address from the vtable entry at offset
|
||||||
|
mfunc = *((unsigned long **)mfunc); // the function is stored at the address
|
||||||
|
- ptr = (void (*)())mfunc;
|
||||||
|
+ typedef void (*FunctionCall)(sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32);
|
||||||
|
+ FunctionCall ptr = (FunctionCall)mfunc;
|
||||||
|
|
||||||
|
/* Set up the machine registers and invoke the function */
|
||||||
|
|
||||||
|
@@ -272,7 +272,17 @@ static void callVirtualMethod(
|
||||||
|
: "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
|
||||||
|
);
|
||||||
|
|
||||||
|
- (*ptr)();
|
||||||
|
+ // tell gcc that r3 to r10 are not available to it for doing the TOC and exception munge on the func call
|
||||||
|
+ register sal_uInt32 r3 __asm__("r3");
|
||||||
|
+ register sal_uInt32 r4 __asm__("r4");
|
||||||
|
+ register sal_uInt32 r5 __asm__("r5");
|
||||||
|
+ register sal_uInt32 r6 __asm__("r6");
|
||||||
|
+ register sal_uInt32 r7 __asm__("r7");
|
||||||
|
+ register sal_uInt32 r8 __asm__("r8");
|
||||||
|
+ register sal_uInt32 r9 __asm__("r9");
|
||||||
|
+ register sal_uInt32 r10 __asm__("r10");
|
||||||
|
+
|
||||||
|
+ (*ptr)(r3, r4, r5, r6, r7, r8, r9, r10);
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mr %0, 3\n\t"
|
||||||
|
--
|
||||||
|
1.7.7.6
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
From f4c5fe13fd1484aa1bf37910841c689877740602 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Tardon <dtardon@redhat.com>
|
||||||
|
Date: Mon, 23 Apr 2012 09:47:41 +0200
|
||||||
|
Subject: [PATCH] save register arguments first
|
||||||
|
|
||||||
|
The "mr" stores r11 to indeterminate register (r9 in my case) before
|
||||||
|
storing it into the output variable, thus overwriting one of our input
|
||||||
|
arguments... This later leads to nice segfault in
|
||||||
|
testtools/source/bridgetest ...
|
||||||
|
|
||||||
|
I suppose there is a better way to get the variable, but I do not know
|
||||||
|
it .-)
|
||||||
|
---
|
||||||
|
.../cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx | 16 ++++++++--------
|
||||||
|
1 files changed, 8 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
|
||||||
|
index 425c5b5..3cb94dd 100644
|
||||||
|
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
|
||||||
|
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
|
||||||
|
@@ -504,13 +504,6 @@ static typelib_TypeClass cpp_mediate(
|
||||||
|
|
||||||
|
extern "C" void privateSnippetExecutor( ... )
|
||||||
|
{
|
||||||
|
- volatile long nOffsetAndIndex;
|
||||||
|
-
|
||||||
|
- //mr %r3, %r11 # move into arg1 the 64bit value passed from OOo
|
||||||
|
- __asm__ __volatile__ (
|
||||||
|
- "mr %0, 11\n\t"
|
||||||
|
- : "=r" (nOffsetAndIndex) : );
|
||||||
|
-
|
||||||
|
sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
|
||||||
|
double fpreg[ppc64::MAX_SSE_REGS];
|
||||||
|
|
||||||
|
@@ -537,11 +530,18 @@ extern "C" void privateSnippetExecutor( ... )
|
||||||
|
"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",
|
||||||
|
+ : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
|
||||||
|
"fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
|
||||||
|
"fr10", "fr11", "fr12", "fr13"
|
||||||
|
);
|
||||||
|
|
||||||
|
+ volatile long nOffsetAndIndex;
|
||||||
|
+
|
||||||
|
+ //mr %r3, %r11 # move into arg1 the 64bit value passed from OOo
|
||||||
|
+ __asm__ __volatile__ (
|
||||||
|
+ "mr %0, 11\n\t"
|
||||||
|
+ : "=r" (nOffsetAndIndex) : );
|
||||||
|
+
|
||||||
|
volatile long sp;
|
||||||
|
|
||||||
|
//stack pointer
|
||||||
|
--
|
||||||
|
1.7.7.6
|
||||||
|
|
Loading…
Reference in new issue