diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-09-02 07:49:03 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-09-02 07:49:03 +0000 |
commit | df8cdc3717d9e3d50c28d45259862f727510ca5a (patch) | |
tree | 78967d67eeffc4be400f83ea4e67fa346dfabc03 /llvm/lib/Target/ARM/ARMJITInfo.cpp | |
parent | 3be5b728b14514880907edb743f8d3f3e53eeae2 (diff) | |
download | bcm5719-llvm-df8cdc3717d9e3d50c28d45259862f727510ca5a.tar.gz bcm5719-llvm-df8cdc3717d9e3d50c28d45259862f727510ca5a.zip |
Add Mac OS X compatible JIT callback routine.
llvm-svn: 55625
Diffstat (limited to 'llvm/lib/Target/ARM/ARMJITInfo.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMJITInfo.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/ARMJITInfo.cpp b/llvm/lib/Target/ARM/ARMJITInfo.cpp index bc2bba36c80..1c23054c82b 100644 --- a/llvm/lib/Target/ARM/ARMJITInfo.cpp +++ b/llvm/lib/Target/ARM/ARMJITInfo.cpp @@ -29,6 +29,14 @@ void ARMJITInfo::replaceMachineCodeForFunction(void *Old, void *New) { /// compile a function lazily. static TargetJITInfo::JITCompilerFn JITCompilerFunction; +// Get the ASMPREFIX for the current host. This is often '_'. +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ +#endif +#define GETASMPREFIX2(X) #X +#define GETASMPREFIX(X) GETASMPREFIX2(X) +#define ASMPREFIX GETASMPREFIX(__USER_LABEL_PREFIX__) + // CompilationCallback stub - We can't use a C function with inline assembly in // it, because we the prolog/epilog inserted by GCC won't work for us. Instead, // write our own wrapper, which does things our way, so we have complete control @@ -39,21 +47,37 @@ extern "C" { asm( ".text\n" ".align 2\n" - ".globl ARMCompilationCallback\n" - "ARMCompilationCallback:\n" + ".globl " ASMPREFIX "ARMCompilationCallback\n" + ASMPREFIX "ARMCompilationCallback:\n" // save main registers +#if defined(__APPLE__) + "stmfd sp!, {r4, r5, r6, r7, lr}\n" + "mov r0, r7\n" // stub's frame + "stmfd sp!, {r8, r10, r11}\n" +#else "mov ip, sp\n" "stmfd sp!, {fp, ip, lr, pc}\n" "sub fp, ip, #4\n" +#endif // __APPLE__ // arguments to Compilation Callback // r0 - our lr (address of the call instruction in stub plus 4) // r1 - stub's lr (address of instruction that called the stub plus 4) +#if defined(__APPLE__) + "mov r0, r7\n" // stub's frame +#else "mov r0, fp\n" // stub's frame +#endif // __APPLE__ "mov r1, lr\n" // stub's lr - "bl ARMCompilationCallbackC\n" + "bl " ASMPREFIX "ARMCompilationCallbackC\n" // restore main registers - "ldmfd sp, {fp, sp, pc}\n"); -#else // Not an ARM host +#if defined(__APPLE__) + "ldmfd sp!, {r8, r10, r11}\n" + "ldmfd sp!, {r4, r5, r6, r7, pc}\n" +#else + "ldmfd sp, {fp, sp, pc}\n" +#endif // __APPLE__ + ); +#else // Not an ARM host void ARMCompilationCallback() { assert(0 && "Cannot call ARMCompilationCallback() on a non-ARM arch!\n"); abort(); |