When initializing the PIC global base register on ARM/ELF add pc to fix the address.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 16 Aug 2013 12:52:08 +0000 (12:52 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 16 Aug 2013 12:52:08 +0000 (12:52 +0000)
This unbreaks PIC with fast isel on ELF targets (PR16717). The output matches
what GCC and SDag do for PIC but may not cover all of the many flavors of PIC
that exist.

llvm-svn: 188551

llvm/lib/Target/ARM/ARMInstrInfo.cpp
llvm/test/CodeGen/ARM/fast-isel-pic.ll

index 8cdb85369f271cd3225b301cc56fd62dff834188..868dd47743b852c8d1bb53cb5caa0e5615feb817 100644 (file)
@@ -130,6 +130,10 @@ namespace {
         MIB.addImm(0);
       AddDefaultPred(MIB);
 
+      // Fix the GOT address by adding pc.
+      BuildMI(FirstMBB, MBBI, DL, TII.get(ARM::tPICADD), GlobalBaseReg)
+          .addReg(GlobalBaseReg).addImm(ARMPCLabelIndex);
+
       return true;
     }
 
index ad0f15966f728e440d89a5f6f6d92455c6b129fe..e3e5972cf7873919060461db2c32d7f5abdeaac9 100644 (file)
@@ -25,6 +25,8 @@ entry:
 ; ARMv7: add  [[reg2]], pc, [[reg2]]
 ; ARMv7-ELF: LoadGV
 ; ARMv7-ELF: ldr r[[reg2:[0-9]+]],
+; ARMv7-ELF: .LPC
+; ARMv7-ELF-NEXT: add r[[reg2]], pc
 ; ARMv7-ELF: ldr r[[reg3:[0-9]+]],
 ; ARMv7-ELF: ldr r[[reg2]], [r[[reg3]], r[[reg2]]]
   %tmp = load i32* @g
@@ -54,6 +56,8 @@ entry:
 ; ARMv7: ldr  r[[reg5]], [r[[reg5]]]
 ; ARMv7-ELF: LoadIndirectSymbol
 ; ARMv7-ELF: ldr r[[reg5:[0-9]+]],
+; ARMv7-ELF: .LPC
+; ARMv7-ELF-NEXT: add r[[reg5]], pc
 ; ARMv7-ELF: ldr r[[reg6:[0-9]+]],
 ; ARMv7-ELF: ldr r[[reg5]], [r[[reg6]], r[[reg5]]]
   %tmp = load i32* @i