Author: hdu
Date: Tue Apr 30 12:57:36 2013
New Revision: 1477604
URL: http://svn.apache.org/r1477604
Log:
adapt the optimization fix to UNO bridge's callVirtualMethod() for FreeBSD and
Linux
adapted from the the fix to OSX 64bit's UNO bridge (in r1477588):
if the pCallStack variable is optimized out then any assumptions of the
method's inlined assembler about stack layout collapse. Adding a pseudo
dependency to the pCallStack variable solves that problem.
Modified:
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
Modified:
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx?rev=1477604&r1=1477603&r2=1477604&view=diff
==============================================================================
---
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx
(original)
+++
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx
Tue Apr 30 12:57:36 2013
@@ -98,11 +98,12 @@ static void callVirtualMethod(void * pTh
pMethod = *((sal_uInt64 *)pMethod);
// Load parameters to stack, if necessary
+ sal_uInt64* pCallStack = NULL;
if ( nStack )
{
// 16-bytes aligned
sal_uInt32 nStackBytes = ( ( nStack + 1 ) >> 1 ) * 16;
- sal_uInt64 *pCallStack = (sal_uInt64 *) __builtin_alloca( nStackBytes
);
+ pCallStack = (sal_uInt64*) __builtin_alloca( nStackBytes );
memcpy( pCallStack, pStack, nStackBytes );
}
@@ -113,7 +114,6 @@ static void callVirtualMethod(void * pTh
double xmm1;
asm volatile (
-
// Fill the xmm registers
"movq %2, %%rax\n\t"
@@ -148,7 +148,8 @@ static void callVirtualMethod(void * pTh
"movsd %%xmm1, %7\n\t"
:
: "m" ( pMethod ), "m" ( pGPR ), "m" ( pFPR ), "m" ( nFPR ),
- "m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 )
+ "m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 ),
+ "m" (pCallStack) // dummy input to prevent the compiler from
optimizing the alloca out
: "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11"
);
Modified:
openoffice/trunk/main/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx?rev=1477604&r1=1477603&r2=1477604&view=diff
==============================================================================
--- openoffice/trunk/main/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
(original)
+++ openoffice/trunk/main/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
Tue Apr 30 12:57:36 2013
@@ -98,11 +98,12 @@ static void callVirtualMethod(void * pTh
pMethod = *((sal_uInt64 *)pMethod);
// Load parameters to stack, if necessary
+ sal_uInt64* pCallStack = NULL;
if ( nStack )
{
// 16-bytes aligned
sal_uInt32 nStackBytes = ( ( nStack + 1 ) >> 1 ) * 16;
- sal_uInt64 *pCallStack = (sal_uInt64 *) __builtin_alloca( nStackBytes
);
+ pCallStack = (sal_uInt64*) __builtin_alloca( nStackBytes );
memcpy( pCallStack, pStack, nStackBytes );
}
@@ -113,7 +114,6 @@ static void callVirtualMethod(void * pTh
double xmm1;
asm volatile (
-
// Fill the xmm registers
"movq %2, %%rax\n\t"
@@ -148,7 +148,8 @@ static void callVirtualMethod(void * pTh
"movsd %%xmm1, %7\n\t"
:
: "m" ( pMethod ), "m" ( pGPR ), "m" ( pFPR ), "m" ( nFPR ),
- "m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 )
+ "m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 ),
+ "m" (pCallStack) // dummy input to prevent the compiler from
optimizing the alloca out
: "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11",
"xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
);