Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/4148

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/48/4148/1

fix gcc inline assembler operands usage

Apparently whoever did these didn't get the gcc docs and specified
every operand only as input, and then added volatile, explicit
initialization and what not until it worked. Specify output operands
correctly instead.
I couldn't verify all assembler variants, as I don't know them,
but the ones I don't know had at least some proper usage of output
operands, so I'll assume those are all correct.

Change-Id: I2910308b5e00cce8db756496df50ed26cfe35bb6
---
M bridges/source/cpp_uno/gcc3_ios_arm/uno2cpp-i386.cxx
M bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx
M bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
M bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
M bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
M bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
M bridges/source/cpp_uno/mingw_intel/callvirtualmethod.cxx
M include/wntgcci/sehandler.hxx
8 files changed, 82 insertions(+), 82 deletions(-)



diff --git a/bridges/source/cpp_uno/gcc3_ios_arm/uno2cpp-i386.cxx 
b/bridges/source/cpp_uno/gcc3_ios_arm/uno2cpp-i386.cxx
index 45e51a9..69f7e52 100644
--- a/bridges/source/cpp_uno/gcc3_ios_arm/uno2cpp-i386.cxx
+++ b/bridges/source/cpp_uno/gcc3_ios_arm/uno2cpp-i386.cxx
@@ -67,11 +67,11 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long edx = 0, eax = 0; // for register returns
-    void * stackptr = 0;
+    long edx, eax; // for register returns
+    void * stackptr;
     asm volatile (
-        "mov   %%esp, %6\n\t"
-        "mov   %0, %%eax\n\t"
+        "mov   %%esp, %2\n\t"
+        "mov   %3, %%eax\n\t"
         "mov   %%eax, %%edx\n\t"
                 // stack padding to keep stack aligned:
         "shl   $2, %%eax\n\t"
@@ -83,28 +83,27 @@
         "mov   %%edx, %%eax\n\t"
         "dec   %%edx\n\t"
         "shl   $2, %%edx\n\t"
-        "add   %1, %%edx\n"
+        "add   %4, %%edx\n"
         "Lcopy:\n\t"
         "pushl 0(%%edx)\n\t"
         "sub   $4, %%edx\n\t"
         "dec   %%eax\n\t"
         "jne   Lcopy\n\t"
         // do the actual call
-        "mov   %2, %%edx\n\t"
+        "mov   %5, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
-        "mov   %3, %%eax\n\t"
+        "mov   %6, %%eax\n\t"
         "shl   $2, %%eax\n\t"
         "add   %%eax, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
         "call  *%%edx\n\t"
         // save return registers
-         "mov   %%eax, %4\n\t"
-         "mov   %%edx, %5\n\t"
+         "mov   %%eax, %0\n\t"
+         "mov   %%edx, %1\n\t"
         // cleanup stack
-        "mov   %6, %%esp\n\t"
-        :
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+        "mov   %2, %%esp\n\t"
+        : "=m"(eax), "=m"(edx), "+m"(stackptr)
+        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
         : "eax", "edx" );
     switch( pReturnTypeDescr->eTypeClass )
     {
diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx 
b/bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx
index af060de..e98216b 100644
--- a/bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx
@@ -62,44 +62,43 @@
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 #endif
 
-    volatile long edx = 0, eax = 0; // for register returns
+    long edx, eax; // for register returns
     void * stackptr;
     asm volatile (
-        "mov   %%esp, %6\n\t"
+        "mov   %%esp, %2\n\t"
         // preserve potential 128bit stack alignment
         "and   $0xfffffff0, %%esp\n\t"
-        "mov   %0, %%eax\n\t"
+        "mov   %3, %%eax\n\t"
         "lea   -4(,%%eax,4), %%eax\n\t"
         "and   $0xf, %%eax\n\t"
         "sub   $0xc, %%eax\n\t"
         "add   %%eax, %%esp\n\t"
         // copy values
-        "mov   %0, %%eax\n\t"
+        "mov   %3, %%eax\n\t"
         "mov   %%eax, %%edx\n\t"
         "dec   %%edx\n\t"
         "shl   $2, %%edx\n\t"
-        "add   %1, %%edx\n"
+        "add   %4, %%edx\n"
         "Lcopy:\n\t"
         "pushl 0(%%edx)\n\t"
         "sub   $4, %%edx\n\t"
         "dec   %%eax\n\t"
         "jne   Lcopy\n\t"
         // do the actual call
-        "mov   %2, %%edx\n\t"
+        "mov   %5, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
-        "mov   %3, %%eax\n\t"
+        "mov   %6, %%eax\n\t"
         "shl   $2, %%eax\n\t"
         "add   %%eax, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
         "call  *%%edx\n\t"
         // save return registers
-         "mov   %%eax, %4\n\t"
-         "mov   %%edx, %5\n\t"
+         "mov   %%eax, %0\n\t"
+         "mov   %%edx, %1\n\t"
         // cleanup stack
-        "mov   %6, %%esp\n\t"
-        :
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+        "mov   %2, %%esp\n\t"
+        : "=m"(eax), "=m"(edx), "+m"(stackptr)
+        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
         : "eax", "ecx", "edx" );
     switch( pReturnTypeDescr->eTypeClass )
     {
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx 
b/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
index 37b00d2..1a73ed5 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
@@ -70,9 +70,9 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long o0 = 0, o1 = 0; // for register returns
-    volatile double f0d = 0;
-    volatile float f0f = 0;
+    long o0, o1; // for register returns
+    double f0d;
+    float f0f;
     volatile long long saveReg[7];
 
     __asm__ (
@@ -231,12 +231,15 @@
         "ldd [%%l7], %%o4\n\t"
         "add %%l7, 8, %%l7\n\t"
         "ldd [%%l7], %%l6\n\t"
-        : :
-        "m"(o0),
-        "m"(o1),
-        "m"(f0d),
-        "m"(f0f),
+        :
+        "=m"(o0),
+        "=m"(o1),
+        "=m"(f0d),
+        "=m"(f0f),
+        :
         "r"(&saveReg[0])
+        :
+        "memory"
         );
     switch( eReturnType )
     {
diff --git a/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx 
b/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
index 9b14f17..e3996d8 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
@@ -70,11 +70,11 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long edx = 0, eax = 0; // for register returns
-    void * stackptr = 0;
+    long edx, eax; // for register returns
+    void * stackptr;
     asm volatile (
-        "mov   %%esp, %6\n\t"
-        "mov   %0, %%eax\n\t"
+        "mov   %%esp, %2\n\t"
+        "mov   %3, %%eax\n\t"
         "mov   %%eax, %%edx\n\t"
                 // stack padding to keep stack aligned:
         "shl   $2, %%eax\n\t"
@@ -86,28 +86,27 @@
         "mov   %%edx, %%eax\n\t"
         "dec   %%edx\n\t"
         "shl   $2, %%edx\n\t"
-        "add   %1, %%edx\n"
+        "add   %4, %%edx\n"
         "Lcopy:\n\t"
         "pushl 0(%%edx)\n\t"
         "sub   $4, %%edx\n\t"
         "dec   %%eax\n\t"
         "jne   Lcopy\n\t"
         // do the actual call
-        "mov   %2, %%edx\n\t"
+        "mov   %5, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
-        "mov   %3, %%eax\n\t"
+        "mov   %6, %%eax\n\t"
         "shl   $2, %%eax\n\t"
         "add   %%eax, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
         "call  *%%edx\n\t"
         // save return registers
-         "mov   %%eax, %4\n\t"
-         "mov   %%edx, %5\n\t"
+         "mov   %%eax, %0\n\t"
+         "mov   %%edx, %1\n\t"
         // cleanup stack
-        "mov   %6, %%esp\n\t"
-        :
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+        "mov   %2, %%esp\n\t"
+        : "=m"(eax), "=m"(edx), "+m"(stackptr)
+        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
         : "eax", "ecx", "edx" );
     switch( pReturnTypeDescr->eTypeClass )
     {
@@ -131,10 +130,10 @@
         *(unsigned char*)pRegisterReturn = eax;
         break;
     case typelib_TypeClass_FLOAT:
-        asm ( "fstps %0" : : "m"(*(char *)pRegisterReturn) );
+        asm ( "fstps %0" : "=m"(*(char *)pRegisterReturn) );
         break;
     case typelib_TypeClass_DOUBLE:
-        asm ( "fstpl %0\n\t" : : "m"(*(char *)pRegisterReturn) );
+        asm ( "fstpl %0\n\t" : "=m"(*(char *)pRegisterReturn) );
         break;
     default: {
         sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
diff --git a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx 
b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
index 1be1215..4ac525f 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
@@ -57,37 +57,36 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long edx = 0, eax = 0; // for register returns
+    long edx, eax; // for register returns
     void * stackptr;
     asm volatile (
-        "mov   %%esp, %6\n\t"
+        "mov   %%esp, %2\n\t"
         // copy values
-        "mov   %0, %%eax\n\t"
+        "mov   %3, %%eax\n\t"
         "mov   %%eax, %%edx\n\t"
         "dec   %%edx\n\t"
         "shl   $2, %%edx\n\t"
-        "add   %1, %%edx\n"
+        "add   %4, %%edx\n"
         "Lcopy:\n\t"
         "pushl 0(%%edx)\n\t"
         "sub   $4, %%edx\n\t"
         "dec   %%eax\n\t"
         "jne   Lcopy\n\t"
         // do the actual call
-        "mov   %2, %%edx\n\t"
+        "mov   %5, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
-        "mov   %3, %%eax\n\t"
+        "mov   %6, %%eax\n\t"
         "shl   $2, %%eax\n\t"
         "add   %%eax, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
         "call  *%%edx\n\t"
         // save return registers
-         "mov   %%eax, %4\n\t"
-         "mov   %%edx, %5\n\t"
+         "mov   %%eax, %0\n\t"
+         "mov   %%edx, %1\n\t"
         // cleanup stack
-        "mov   %6, %%esp\n\t"
-        :
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+        "mov   %2, %%esp\n\t"
+        : "=m"(eax), "=m"(edx), "+m"(stackptr)
+        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
         : "eax", "ecx", "edx" );
     switch( eReturnType )
     {
diff --git a/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx 
b/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
index a85d756..ae9f0b8 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
@@ -68,9 +68,9 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long o0 = 0, o1 = 0; // for register returns
-    volatile double f0d = 0;
-    volatile float f0f = 0;
+    long o0, o1; // for register returns
+    double f0d;
+    float f0f;
     volatile long long saveReg[7];
 
     __asm__ (
@@ -229,12 +229,14 @@
         "ldd [%%l7], %%o4\n\t"
         "add %%l7, 8, %%l7\n\t"
         "ldd [%%l7], %%l6\n\t"
-        : :
-        "m"(o0),
-        "m"(o1),
-        "m"(f0d),
-        "m"(f0f),
+        :
+        "=m"(o0),
+        "=m"(o1),
+        "=m"(f0d),
+        "=m"(f0f),
+        :
         "r"(&saveReg[0])
+        : "memory"
         );
     switch( eReturnType )
     {
diff --git a/bridges/source/cpp_uno/mingw_intel/callvirtualmethod.cxx 
b/bridges/source/cpp_uno/mingw_intel/callvirtualmethod.cxx
index c1bb9b6..1d650f1 100644
--- a/bridges/source/cpp_uno/mingw_intel/callvirtualmethod.cxx
+++ b/bridges/source/cpp_uno/mingw_intel/callvirtualmethod.cxx
@@ -56,37 +56,36 @@
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address 
something
 
-    volatile long edx = 0, eax = 0; // for register returns
+    long edx, eax; // for register returns
     void * stackptr;
     asm volatile (
-        "mov   %%esp, %6\n\t"
+        "mov   %%esp, %2\n\t"
         // copy values
-        "mov   %0, %%eax\n\t"
+        "mov   %3, %%eax\n\t"
         "mov   %%eax, %%edx\n\t"
         "dec   %%edx\n\t"
         "shl   $2, %%edx\n\t"
-        "add   %1, %%edx\n"
+        "add   %4, %%edx\n"
         "Lcopy:\n\t"
         "pushl 0(%%edx)\n\t"
         "sub   $4, %%edx\n\t"
         "dec   %%eax\n\t"
         "jne   Lcopy\n\t"
         // do the actual call
-        "mov   %2, %%edx\n\t"
+        "mov   %5, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
-        "mov   %3, %%eax\n\t"
+        "mov   %6, %%eax\n\t"
         "shl   $2, %%eax\n\t"
         "add   %%eax, %%edx\n\t"
         "mov   0(%%edx), %%edx\n\t"
         "call  *%%edx\n\t"
         // save return registers
-         "mov   %%eax, %4\n\t"
-         "mov   %%edx, %5\n\t"
+         "mov   %%eax, %0\n\t"
+         "mov   %%edx, %1\n\t"
         // cleanup stack
-        "mov   %6, %%esp\n\t"
-        :
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+        "mov   %2, %%esp\n\t"
+        : "=m"(eax), "=m"(edx), "+m"(stackptr)
+        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
         : "eax", "ecx", "edx" );
     switch( returnType->eTypeClass )
     {
diff --git a/include/wntgcci/sehandler.hxx b/include/wntgcci/sehandler.hxx
index 2fabe48..403099b 100644
--- a/include/wntgcci/sehandler.hxx
+++ b/include/wntgcci/sehandler.hxx
@@ -58,7 +58,7 @@
         m_ER.pHandlerClass = this;
         m_ER.hp = handler;
         asm("movl %%fs:0, %%eax\n\t"
-            "movl %%eax, %0": : "m" (m_ER.prev): "%eax" );
+            "movl %%eax, %0": "=m" (m_ER.prev): : "%eax" );
         asm("movl %0, %%eax\n\t"
             "movl %%eax, %%fs:0": : "r" (&m_ER): "%eax" );
     }

-- 
To view, visit https://gerrit.libreoffice.org/4148
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2910308b5e00cce8db756496df50ed26cfe35bb6
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Luboš Luňák <l.lunak@suse.cz>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.