Keep the stack from on darwin 16-byte aligned. This fixes many JIT
authorNate Begeman <natebegeman@mac.com>
Tue, 25 Apr 2006 20:54:26 +0000 (20:54 +0000)
committerNate Begeman <natebegeman@mac.com>
Tue, 25 Apr 2006 20:54:26 +0000 (20:54 +0000)
failres.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27973 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86JITInfo.cpp

index 5cf3b728cc816c617d0038ca98f65ca8e107ae0c..19ff68bd8f71fa59db968ac9feb2be6174799fe7 100644 (file)
@@ -59,8 +59,19 @@ extern "C" {
     "movl    %esp, %ebp\n"    // Standard prologue
     "pushl   %eax\n"
     "pushl   %edx\n"          // save EAX/EDX
-#if defined(__CYGWIN__) || defined(__APPLE__)
-    "call _X86CompilationCallback2\n"
+#if defined(__CYGWIN__)
+    "call    _X86CompilationCallback2\n"
+#elif defined(__APPLE__)
+    "movl    4(%ebp), %eax\n" // load the address of return address
+    "movl    $24, %edx\n"     // if the opcode of the instruction at the
+    "cmpb    $-51, (%eax)\n"  // return address is our 0xCD marker, then
+    "movl    $12, %eax\n"     // subtract 24 from %esp to realign it to 16
+    "cmovne  %eax, %edx\n"    // bytes after the push of edx, the amount to.
+    "subl    %edx, %esp\n"    // the push of edx to keep it aligned.
+    "pushl   %edx\n"          // subtract.  Otherwise, subtract 12 bytes after
+    "call    _X86CompilationCallback2\n"
+    "popl    %edx\n"
+    "addl    %edx, %esp\n"
 #else
     "call X86CompilationCallback2\n"
 #endif