[llvm-commits] [llvm] r55625 - /llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp

Evan Cheng evan.cheng at apple.com
Tue Sep 2 00:49:04 PDT 2008


Author: evancheng
Date: Tue Sep  2 02:49:03 2008
New Revision: 55625

URL: http://llvm.org/viewvc/llvm-project?rev=55625&view=rev
Log:
Add Mac OS X compatible JIT callback routine.

Modified:
    llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp?rev=55625&r1=55624&r2=55625&view=diff

==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp Tue Sep  2 02:49:03 2008
@@ -29,6 +29,14 @@
 /// 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 @@
   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();





More information about the llvm-commits mailing list