summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2014-08-22 15:06:53 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-08-22 15:08:56 +0100
commit6ab1951ea2e31f47bc9f211dd9b2681c794b8e7f (patch)
tree64174e1fa838773dda63662349dd7ba879f0a385
parente426e448ce2bd889f287ce13295092a75fa6150d (diff)
Resolves: rhbz#1125588 ppc64le passes testtools
*bzzt*, <lightning arcs, faint smell of ozone>, it's alive! Change-Id: I0b42f4e2603e6d76200d63ab2e26bbb856ae1173
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx8
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx17
2 files changed, 22 insertions, 3 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
index dbdef1bce881..507d3b1fe173 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
@@ -545,7 +545,11 @@ extern "C" void privateSnippetExecutor( ... )
"mr %0, 1\n\t"
: "=r" (sp) : );
+#if _CALL_ELF == 2
volatile long nRegReturn[1];
+#else
+ volatile long nRegReturn[2];
+#endif
typelib_TypeClass aType =
cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn);
@@ -588,6 +592,10 @@ extern "C" void privateSnippetExecutor( ... )
default:
__asm__( "ld 3,%0\n\t"
: : "m" (nRegReturn[0]) );
+#if _CALL_ELF == 2
+ __asm__( "ld 4,%0\n\t"
+ : : "m" (nRegReturn[1]) );
+#endif
break;
}
}
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
index aa054d78a16a..391ef219ac27 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
@@ -87,9 +87,9 @@ namespace ppc64
}
}
-void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+void MapReturn(long r3, long r4, double dret, typelib_TypeDescriptionReference* pReturnType, void *pRegisterReturn)
{
- switch (eTypeClass)
+ switch (pReturnType->eTypeClass)
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
@@ -115,6 +115,17 @@ void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegist
case typelib_TypeClass_DOUBLE:
*reinterpret_cast<double *>( pRegisterReturn ) = dret;
break;
+#if _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;
+ }
+#endif
default:
break;
}
@@ -222,7 +233,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
"fmr %0, 1\n\t"
: "=f" (dret), "=r" (r3), "=r" (r4) : );
- MapReturn(r3, dret, pReturnTypeDescr->eTypeClass, pRegisterReturn);
+ MapReturn(r3, r4, dret, pReturnTypeRef, pRegisterReturn);
}
// Macros for easier insertion of values to registers or stack