mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 06:09:05 +00:00
jalr should use t9 ($25) for indirect calls regardless of the relocation model
specified. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146229 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f5b9a74f0a
commit
0dca9456c5
@ -2338,7 +2338,7 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
// node so that legalize doesn't hack it.
|
||||
unsigned char OpFlag;
|
||||
bool IsPICCall = (IsN64 || IsPIC); // true if calls are translated to jalr $25
|
||||
bool LoadSymAddr = false;
|
||||
bool GlobalOrExternal = false;
|
||||
SDValue CalleeLo;
|
||||
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
@ -2355,7 +2355,7 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
getPointerTy(), 0, OpFlag);
|
||||
}
|
||||
|
||||
LoadSymAddr = true;
|
||||
GlobalOrExternal = true;
|
||||
}
|
||||
else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
|
||||
if (IsN64 || (!IsO32 && IsPIC))
|
||||
@ -2366,14 +2366,14 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
OpFlag = MipsII::MO_GOT_CALL;
|
||||
Callee = DAG.getTargetExternalSymbol(S->getSymbol(),
|
||||
getPointerTy(), OpFlag);
|
||||
LoadSymAddr = true;
|
||||
GlobalOrExternal = true;
|
||||
}
|
||||
|
||||
SDValue InFlag;
|
||||
|
||||
// Create nodes that load address of callee and copy it to T9
|
||||
if (IsPICCall) {
|
||||
if (LoadSymAddr) {
|
||||
if (GlobalOrExternal) {
|
||||
// Load callee address
|
||||
Callee = DAG.getNode(MipsISD::WrapperPIC, dl, getPointerTy(), Callee);
|
||||
SDValue LoadValue = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
|
||||
@ -2387,7 +2387,11 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
} else
|
||||
Callee = LoadValue;
|
||||
}
|
||||
}
|
||||
|
||||
// T9 should contain the address of the callee function if
|
||||
// -reloction-model=pic or it is an indirect call.
|
||||
if (IsPICCall || !GlobalOrExternal) {
|
||||
// copy to T9
|
||||
unsigned T9Reg = IsN64 ? Mips::T9_64 : Mips::T9;
|
||||
Chain = DAG.getCopyToReg(Chain, dl, T9Reg, Callee, SDValue(0, 0));
|
||||
|
8
test/CodeGen/Mips/indirectcall.ll
Normal file
8
test/CodeGen/Mips/indirectcall.ll
Normal file
@ -0,0 +1,8 @@
|
||||
; RUN: llc < %s -march=mipsel -relocation-model=static | FileCheck %s
|
||||
|
||||
define void @foo0(void (i32)* nocapture %f1) nounwind {
|
||||
entry:
|
||||
; CHECK: jalr $25
|
||||
tail call void %f1(i32 13) nounwind
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user