summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86JITInfo.cpp
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2006-04-25 20:54:26 +0000
committerNate Begeman <natebegeman@mac.com>2006-04-25 20:54:26 +0000
commitadd19dc20a519295deb57bd5a89014d80c540930 (patch)
treefe51cbbc6e6e54e6f9b4dd555d6e5c64eb82be44 /lib/Target/X86/X86JITInfo.cpp
parent0db9fe6775853d62632ad299dd734b6ba6c6b336 (diff)
downloadllvm-add19dc20a519295deb57bd5a89014d80c540930.tar.gz
llvm-add19dc20a519295deb57bd5a89014d80c540930.tar.bz2
llvm-add19dc20a519295deb57bd5a89014d80c540930.tar.xz
Keep the stack from on darwin 16-byte aligned. This fixes many JIT
failres. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27973 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86JITInfo.cpp')
-rw-r--r--lib/Target/X86/X86JITInfo.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/Target/X86/X86JITInfo.cpp b/lib/Target/X86/X86JITInfo.cpp
index 5cf3b728cc..19ff68bd8f 100644
--- a/lib/Target/X86/X86JITInfo.cpp
+++ b/lib/Target/X86/X86JITInfo.cpp
@@ -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