mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:40:38 +00:00
[GlobalISel] add helper function to create arbitrary libcalls
Summary: The existing helper function can only create a libcall to functions available in RTLIB. Add a helper function that can create a libcall to a given function name using the provided calling convention. Reviewers: aditya_nandakumar, t.p.northover, rovka, arsenm, dsanders Reviewed By: arsenm Subscribers: wdng, hiraditya, volkan, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D76845
This commit is contained in:
parent
8126913310
commit
5df600714d
@ -304,6 +304,13 @@ private:
|
||||
GISelChangeObserver &Observer;
|
||||
};
|
||||
|
||||
/// Helper function that creates a libcall to the given \p Name using the given
|
||||
/// calling convention \p CC.
|
||||
LegalizerHelper::LegalizeResult
|
||||
createLibcall(MachineIRBuilder &MIRBuilder, const char *Name,
|
||||
const CallLowering::ArgInfo &Result,
|
||||
ArrayRef<CallLowering::ArgInfo> Args, CallingConv::ID CC);
|
||||
|
||||
/// Helper function that creates the given libcall.
|
||||
LegalizerHelper::LegalizeResult
|
||||
createLibcall(MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
|
||||
|
@ -489,15 +489,14 @@ static bool isLibCallInTailPosition(MachineInstr &MI) {
|
||||
}
|
||||
|
||||
LegalizerHelper::LegalizeResult
|
||||
llvm::createLibcall(MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
|
||||
llvm::createLibcall(MachineIRBuilder &MIRBuilder, const char *Name,
|
||||
const CallLowering::ArgInfo &Result,
|
||||
ArrayRef<CallLowering::ArgInfo> Args) {
|
||||
ArrayRef<CallLowering::ArgInfo> Args,
|
||||
const CallingConv::ID CC) {
|
||||
auto &CLI = *MIRBuilder.getMF().getSubtarget().getCallLowering();
|
||||
auto &TLI = *MIRBuilder.getMF().getSubtarget().getTargetLowering();
|
||||
const char *Name = TLI.getLibcallName(Libcall);
|
||||
|
||||
CallLowering::CallLoweringInfo Info;
|
||||
Info.CallConv = TLI.getLibcallCallingConv(Libcall);
|
||||
Info.CallConv = CC;
|
||||
Info.Callee = MachineOperand::CreateES(Name);
|
||||
Info.OrigRet = Result;
|
||||
std::copy(Args.begin(), Args.end(), std::back_inserter(Info.OrigArgs));
|
||||
@ -507,6 +506,16 @@ llvm::createLibcall(MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
|
||||
return LegalizerHelper::Legalized;
|
||||
}
|
||||
|
||||
LegalizerHelper::LegalizeResult
|
||||
llvm::createLibcall(MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
|
||||
const CallLowering::ArgInfo &Result,
|
||||
ArrayRef<CallLowering::ArgInfo> Args) {
|
||||
auto &TLI = *MIRBuilder.getMF().getSubtarget().getTargetLowering();
|
||||
const char *Name = TLI.getLibcallName(Libcall);
|
||||
const CallingConv::ID CC = TLI.getLibcallCallingConv(Libcall);
|
||||
return createLibcall(MIRBuilder, Name, Result, Args, CC);
|
||||
}
|
||||
|
||||
// Useful for libcalls where all operands have the same type.
|
||||
static LegalizerHelper::LegalizeResult
|
||||
simpleLibcall(MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size,
|
||||
|
@ -2722,4 +2722,30 @@ TEST_F(AArch64GISelMITest, BitcastBitOps) {
|
||||
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
|
||||
}
|
||||
|
||||
TEST_F(AArch64GISelMITest, CreateLibcall) {
|
||||
setUp();
|
||||
if (!TM)
|
||||
return;
|
||||
|
||||
DefineLegalizerInfo(A, {});
|
||||
|
||||
AInfo Info(MF->getSubtarget());
|
||||
DummyGISelObserver Observer;
|
||||
|
||||
LLVMContext &Ctx = MF->getFunction().getContext();
|
||||
auto *RetTy = Type::getVoidTy(Ctx);
|
||||
|
||||
EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized,
|
||||
createLibcall(B, "abort", {{}, RetTy}, {}, CallingConv::C));
|
||||
|
||||
auto CheckStr = R"(
|
||||
CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
|
||||
CHECK: BL &abort
|
||||
CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
|
||||
)";
|
||||
|
||||
// Check
|
||||
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
Loading…
Reference in New Issue
Block a user