diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-08-22 15:06:53 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-08-22 15:08:56 +0100 |
commit | 6ab1951ea2e31f47bc9f211dd9b2681c794b8e7f (patch) | |
tree | 64174e1fa838773dda63662349dd7ba879f0a385 /bridges/source | |
parent | e426e448ce2bd889f287ce13295092a75fa6150d (diff) |
Resolves: rhbz#1125588 ppc64le passes testtools
*bzzt*, <lightning arcs, faint smell of ozone>, it's alive!
Change-Id: I0b42f4e2603e6d76200d63ab2e26bbb856ae1173
Diffstat (limited to 'bridges/source')
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx | 8 | ||||
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 17 |
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 |