mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
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:
parent
a5bd3937ab
commit
7ddda4704c
@ -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
23
test/CodeGen/ARM/pic.ll
Normal 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)
|
Loading…
Reference in New Issue
Block a user