Fix ARM FastISel PIC function call.

The function call to external function should come with PLT relocation
type if the PIC relocation model is used.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189002 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Logan Chien 2013-08-22 12:08:04 +00:00
parent a5bd3937ab
commit 7ddda4704c
2 changed files with 32 additions and 2 deletions

View File

@ -2460,15 +2460,22 @@ bool ARMFastISel::SelectCall(const Instruction *I,
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
DL, TII.get(CallOpc));
unsigned char OpFlags = 0;
// Add MO_PLT for global address or external symbol in the PIC relocation
// model.
if (Subtarget->isTargetELF() && TM.getRelocationModel() == Reloc::PIC_)
OpFlags = ARMII::MO_PLT;
// ARM calls don't take a predicate, but tBL / tBLX do.
if(isThumb2)
AddDefaultPred(MIB);
if (UseReg)
MIB.addReg(CalleeReg);
else if (!IntrMemName)
MIB.addGlobalAddress(GV, 0, 0);
MIB.addGlobalAddress(GV, 0, OpFlags);
else
MIB.addExternalSymbol(IntrMemName, 0);
MIB.addExternalSymbol(IntrMemName, OpFlags);
// Add implicit physical register uses to the call.
for (unsigned i = 0, e = RegArgs.size(); i != e; ++i)

23
test/CodeGen/ARM/pic.ll Normal file
View File

@ -0,0 +1,23 @@
; Check the function call in PIC relocation model.
; If the relocation model is PIC, then the "bl" instruction for the function
; call to the external function should come with PLT fixup type.
; RUN: llc < %s -mtriple=armv7-unknown-linux-gnueabi \
; RUN: -relocation-model=pic -fast-isel \
; RUN: | FileCheck %s
define void @test() {
entry:
%0 = call i32 @get()
; CHECK: bl get(PLT)
call void @put(i32 %0)
; CHECK: bl put(PLT)
ret void
}
declare i32 @get()
declare void @put(i32)