aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-06-29 01:48:36 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-06-29 01:48:36 +0000
commitbe33dd95d8777449463093192cd689c263069bd9 (patch)
tree9201ec0273aa29269758f8bd31de1ab916a1222b
parent2a0f984771fcdbc6c59c87e492e405ba630a4838 (diff)
downloadexternal_llvm-be33dd95d8777449463093192cd689c263069bd9.tar.gz
external_llvm-be33dd95d8777449463093192cd689c263069bd9.tar.bz2
external_llvm-be33dd95d8777449463093192cd689c263069bd9.zip
Let X86CompilationCallback pass previous frame and return address to X86CompilationCallback2. Remove alloca hack.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28982 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86JITInfo.cpp17
1 files changed, 7 insertions, 10 deletions
diff --git a/lib/Target/X86/X86JITInfo.cpp b/lib/Target/X86/X86JITInfo.cpp
index a96b4a67e3..9a20b951c1 100644
--- a/lib/Target/X86/X86JITInfo.cpp
+++ b/lib/Target/X86/X86JITInfo.cpp
@@ -64,6 +64,10 @@ extern "C" {
#if defined(__APPLE__)
"andl $-16, %esp\n" // Align ESP on 16-byte boundary
#endif
+ "subl $16, %esp\n"
+ "movl 4(%ebp), %eax\n" // Pass prev frame and return address
+ "movl %eax, 4(%esp)\n"
+ "movl %ebp, (%esp)\n"
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)
"call _X86CompilationCallback2\n"
#else
@@ -108,22 +112,15 @@ extern "C" {
/// function stub when we did not know the real target of a call. This function
/// must locate the start of the stub or call site and pass it into the JIT
/// compiler function.
-extern "C" void X86CompilationCallback2() {
#ifdef _MSC_VER
+extern "C" void X86CompilationCallback2() {
assert(sizeof(size_t) == 4); // FIXME: handle Win64
unsigned *RetAddrLoc = (unsigned *)_AddressOfReturnAddress();
RetAddrLoc += 3; // skip over ret addr, edx, eax
unsigned RetAddr = *RetAddrLoc;
#else
- unsigned *StackPtr = (unsigned*)__builtin_frame_address(1);
- unsigned RetAddr = (unsigned)(intptr_t)__builtin_return_address(1);
- unsigned *RetAddrLoc = &StackPtr[1];
-
- // NOTE: __builtin_frame_address doesn't work if frame pointer elimination has
- // been performed. Having a variable sized alloca disables frame pointer
- // elimination currently, even if it's dead. This is a gross hack.
- alloca(10+(RetAddr >> 31));
-
+extern "C" void X86CompilationCallback2(intptr_t *StackPtr, intptr_t RetAddr) {
+ intptr_t *RetAddrLoc = &StackPtr[1];
#endif
assert(*RetAddrLoc == RetAddr &&
"Could not find return address on the stack!");