summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorCaolán McNamara <cmc@openoffice.org>2010-05-04 14:33:17 +0100
committerCaolán McNamara <cmc@openoffice.org>2010-05-04 14:33:17 +0100
commit867721d3e825be238785847a703c211d0e61d0ab (patch)
treeaccd26f98c8462273774c0d15379fc56e5cb019f /bridges
parentdce434e245a25a28a2bcd4aae8a40dd3bb3c2f63 (diff)
armeabi02: #i105359# fix arm-eabi uno bridge
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_arm/armhelper.S2
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx24
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx20
3 files changed, 32 insertions, 14 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/armhelper.S b/bridges/source/cpp_uno/gcc3_linux_arm/armhelper.S
index 8db287174680..d5faf15eed6f 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/armhelper.S
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/armhelper.S
@@ -2,7 +2,7 @@
@
@ Written by Peter Naulls <peter@chocky.org>
@ Modified by Caolan McNamara <caolanm@redhat.com>
-@ Fixed by Michael Casadevall
+@ Fixed by Michael Casadevall <mcasadevall@kubuntu.org>
#ifdef __ARM_EABI__
# define UNWIND
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx
index 54239945df19..0e801ab4433e 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx
@@ -408,8 +408,30 @@ extern "C" sal_Int64 cpp_vtable_call( long *pFunctionAndOffset,
void **pCallStack )
{
sal_Int64 nRegReturn;
- cpp_mediate( pFunctionAndOffset[0], pFunctionAndOffset[1], pCallStack,
+ typelib_TypeClass aType = cpp_mediate( pFunctionAndOffset[0], pFunctionAndOffset[1], pCallStack,
&nRegReturn );
+
+ switch( aType )
+ {
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+ nRegReturn = (unsigned long)(*(unsigned char *)&nRegReturn);
+ break;
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+ case typelib_TypeClass_SHORT:
+ nRegReturn = (unsigned long)(*(unsigned short *)&nRegReturn);
+ break;
+ case typelib_TypeClass_ENUM:
+ case typelib_TypeClass_UNSIGNED_LONG:
+ case typelib_TypeClass_LONG:
+ nRegReturn = (unsigned long)(*(unsigned int *)&nRegReturn);
+ break;
+ case typelib_TypeClass_VOID:
+ default:
+ break;
+ }
+
return nRegReturn;
}
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
index 8d40be39b5ab..be67ed8fd830 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
@@ -149,7 +149,7 @@ namespace arm
}
}
-void MapReturn(long r0, long r1, typelib_TypeDescriptionReference * pReturnType, void *pRegisterReturn)
+void MapReturn(sal_uInt32 r0, sal_uInt32 r1, typelib_TypeDescriptionReference * pReturnType, sal_uInt32* pRegisterReturn)
{
#if !defined(__ARM_EABI__) && !defined(__SOFTFP__)
register float fret asm("f0");
@@ -160,32 +160,28 @@ void MapReturn(long r0, long r1, typelib_TypeDescriptionReference * pReturnType,
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
- ((long*)pRegisterReturn)[1] = r1;
+ pRegisterReturn[1] = r1;
case typelib_TypeClass_LONG:
case typelib_TypeClass_UNSIGNED_LONG:
case typelib_TypeClass_ENUM:
- ((long*)pRegisterReturn)[0] = r0;
- break;
case typelib_TypeClass_CHAR:
case typelib_TypeClass_SHORT:
case typelib_TypeClass_UNSIGNED_SHORT:
- *(unsigned short*)pRegisterReturn = (unsigned short)r0;
- break;
case typelib_TypeClass_BOOLEAN:
case typelib_TypeClass_BYTE:
- *(unsigned char*)pRegisterReturn = (unsigned char)r0;
+ pRegisterReturn[0] = r0;
break;
case typelib_TypeClass_FLOAT:
#if defined(__ARM_EABI__) || defined(__SOFTFP__)
- ((long*)pRegisterReturn)[0] = r0;
+ pRegisterReturn[0] = r0;
#else
*(float*)pRegisterReturn = fret;
#endif
break;
case typelib_TypeClass_DOUBLE:
#if defined(__ARM_EABI__) || defined(__SOFTFP__)
- ((long*)pRegisterReturn)[1] = r1;
- ((long*)pRegisterReturn)[0] = r0;
+ pRegisterReturn[1] = r1;
+ pRegisterReturn[0] = r0;
#else
*(double*)pRegisterReturn = dret;
#endif
@@ -194,7 +190,7 @@ void MapReturn(long r0, long r1, typelib_TypeDescriptionReference * pReturnType,
case typelib_TypeClass_EXCEPTION:
{
if (!arm::return_in_hidden_param(pReturnType))
- ((long*)pRegisterReturn)[0] = r0;
+ pRegisterReturn[0] = r0;
break;
}
default:
@@ -260,7 +256,7 @@ void callVirtualMethod(
"mov %1, r1\n\t"
: "=r" (r0), "=r" (r1) : );
- MapReturn(r0, r1, pReturnType, pRegisterReturn);
+ MapReturn(r0, r1, pReturnType, (sal_uInt32*)pRegisterReturn);
}
}