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"       
        
     );


Reply via email to