openoffice-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From h..@apache.org
Subject svn commit: r1468341 - /openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
Date Tue, 16 Apr 2013 09:43:45 GMT
Author: hdu
Date: Tue Apr 16 09:43:45 2013
New Revision: 1468341

URL: http://svn.apache.org/r1468341
Log:
on OSX the ECX register is not preserved for IA32 stdcalls

the function call convention for IA32 apps on OSX documented at
http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html
indicates that ECX is not preserved.

Modified:
    openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx

Modified: openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx?rev=1468341&r1=1468340&r2=1468341&view=diff
==============================================================================
--- openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx (original)
+++ openoffice/trunk/main/bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx Tue Apr 16
09:43:45 2013
@@ -78,45 +78,48 @@ void callVirtualMethod(
     // never called
     if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address
something
 
+	// see the function call convention for IA32 apps on OSX at
+	// http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html
+	// though it mentions that virtual functions may use something different in practice both
gcc and clang use the stdcall convention
 	volatile long edx = 0, eax = 0; // for register returns
     void * stackptr;
 	asm volatile (
-        "mov   %%esp, %6\n\t"
+		"mov   %%esp, %6\n\t"
 		"mov   %0, %%eax\n\t"
 		"mov   %%eax, %%edx\n\t"
-                // stack padding to keep stack aligned:
+                // padding to keep stack 16-byte aligned
 		"shl   $2, %%eax\n\t"
 		"neg   %%eax\n\t"
 		"add   %%esp, %%eax\n\t"
 		"and   $0xf, %%eax\n\t"
 		"sub   %%eax, %%esp\n\t"
-                // copy:
+                // push the arguments onto the stack
 		"mov   %%edx, %%eax\n\t"
 		"dec   %%edx\n\t"
 		"shl   $2, %%edx\n\t"
 		"add   %1, %%edx\n"
-		"Lcopy:\n\t"
+	"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   0(%%edx), %%edx\n\t"
+		"mov   %2, %%edx\n\t"	    // edx = this
+		"mov   0(%%edx), %%edx\n\t" // edx = vtable
 		"mov   %3, %%eax\n\t"
 		"shl   $2, %%eax\n\t"
-		"add   %%eax, %%edx\n\t"
-		"mov   0(%%edx), %%edx\n\t"
+		"add   %%eax, %%edx\n\t"    // func** edx = vtable[n]
+		"mov   0(%%edx), %%edx\n\t" // func* edx
 		"call  *%%edx\n\t"
 		// save return registers
  		"mov   %%eax, %4\n\t"
  		"mov   %%edx, %5\n\t"
-		// cleanup stack
-        "mov   %6, %%esp\n\t"
+		// restore stack
+		"mov   %6, %%esp\n\t"
 		:
-        : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
-          "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
-        : "eax", "edx" );
+		: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr),
+		  "m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
+		: "eax", "ecx", "edx" );
 	switch( pReturnTypeDescr->eTypeClass )
 	{
     case typelib_TypeClass_VOID:
@@ -124,6 +127,7 @@ void callVirtualMethod(
     case typelib_TypeClass_HYPER:
     case typelib_TypeClass_UNSIGNED_HYPER:
         ((long*)pRegisterReturn)[1] = edx;
+	// fall through
     case typelib_TypeClass_LONG:
     case typelib_TypeClass_UNSIGNED_LONG:
     case typelib_TypeClass_CHAR:



Mime
View raw message