PR9081: Split up LDM instruction with deprecated use of both LR and PC.
authorBob Wilson <bob.wilson@apple.com>
Tue, 1 Feb 2011 22:30:51 +0000 (22:30 +0000)
committerBob Wilson <bob.wilson@apple.com>
Tue, 1 Feb 2011 22:30:51 +0000 (22:30 +0000)
This is completely untested but pretty straightforward, so hopefully I
got it right.

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

lib/Target/ARM/ARMJITInfo.cpp

index 50e6562c79eeef44c674c014d275fb1cbffd0fc8..61c68ef13797fd407e60578b2d3de05723150d29 100644 (file)
@@ -43,7 +43,7 @@ static TargetJITInfo::JITCompilerFn JITCompilerFunction;
 #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 (we need
+// it, because the prolog/epilog inserted by GCC won't work for us. (We need
 // to preserve more context and manipulate the stack directly).  Instead,
 // write our own wrapper, which does things our way, so we have complete
 // control over register saving and restoring.
@@ -99,7 +99,8 @@ extern "C" {
     // The above twiddling of the saved return addresses allows us to
     // deallocate everything, including the LR the stub saved, all in one
     // pop instruction.
-    "ldmia  sp!, {r0, r1, r2, r3, lr, pc}\n"
+    "ldmia  sp!, {r0, r1, r2, r3, lr}\n"
+    "ldr    pc, [sp], #4\n"
       );
 #else  // Not an ARM host
   void ARMCompilationCallback() {