mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 12:50:00 +00:00
Change -arm-trap-func= into a non-arm specific option. Now Intrinsic::trap is lowered into a call to the specified trap function at sdisel time.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129152 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e2e777b0e7
commit
4da0c7c0c9
@ -161,6 +161,11 @@ namespace llvm {
|
||||
/// runtime library has integer divmod libcalls.
|
||||
extern bool HasDivModLibcall;
|
||||
|
||||
/// getTrapFunctionName - If this returns a non-empty string, this means isel
|
||||
/// should lower Intrinsic::trap to a call to the specified function name
|
||||
/// instead of an ISD::TRAP node.
|
||||
extern StringRef getTrapFunctionName();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -4672,9 +4672,22 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::flt_rounds:
|
||||
setValue(&I, DAG.getNode(ISD::FLT_ROUNDS_, dl, MVT::i32));
|
||||
return 0;
|
||||
case Intrinsic::trap:
|
||||
DAG.setRoot(DAG.getNode(ISD::TRAP, dl,MVT::Other, getRoot()));
|
||||
case Intrinsic::trap: {
|
||||
StringRef TrapFuncName = getTrapFunctionName();
|
||||
if (TrapFuncName.empty()) {
|
||||
DAG.setRoot(DAG.getNode(ISD::TRAP, dl,MVT::Other, getRoot()));
|
||||
return 0;
|
||||
}
|
||||
TargetLowering::ArgListTy Args;
|
||||
std::pair<SDValue, SDValue> Result =
|
||||
TLI.LowerCallTo(getRoot(), I.getType(),
|
||||
false, false, false, false, 0, CallingConv::C,
|
||||
/*isTailCall=*/false, /*isReturnValueUsed=*/true,
|
||||
DAG.getExternalSymbol(TrapFuncName.data(), TLI.getPointerTy()),
|
||||
Args, DAG, getCurDebugLoc());
|
||||
DAG.setRoot(Result.second);
|
||||
return 0;
|
||||
}
|
||||
case Intrinsic::uadd_with_overflow:
|
||||
return implVisitAluOverflow(I, ISD::UADDO);
|
||||
case Intrinsic::sadd_with_overflow:
|
||||
|
@ -72,11 +72,6 @@ ARMInterworking("arm-interworking", cl::Hidden,
|
||||
cl::desc("Enable / disable ARM interworking (for debugging only)"),
|
||||
cl::init(true));
|
||||
|
||||
static cl::opt<std::string>
|
||||
TrapFuncName("arm-trap-func", cl::Hidden,
|
||||
cl::desc("Emit a call to trap function rather than a trap instruction"),
|
||||
cl::init(""));
|
||||
|
||||
void ARMTargetLowering::addTypeForNEON(EVT VT, EVT PromotedLdStVT,
|
||||
EVT PromotedBitwiseVT) {
|
||||
if (VT != PromotedLdStVT) {
|
||||
@ -562,10 +557,7 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||
setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
|
||||
|
||||
if (TrapFuncName.size())
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Custom);
|
||||
else
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
||||
|
||||
// Use the default implementation.
|
||||
setOperationAction(ISD::VASTART, MVT::Other, Custom);
|
||||
@ -4698,19 +4690,6 @@ static SDValue LowerUDIV(SDValue Op, SelectionDAG &DAG) {
|
||||
return N0;
|
||||
}
|
||||
|
||||
static SDValue LowerTrap(SDValue Op, SelectionDAG &DAG) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
TargetLowering::ArgListTy Args;
|
||||
std::pair<SDValue, SDValue> CallResult =
|
||||
TLI.LowerCallTo(Op.getOperand(0), Type::getVoidTy(*DAG.getContext()),
|
||||
false, false, false, false, 0, CallingConv::C,
|
||||
/*isTailCall=*/false,
|
||||
/*isReturnValueUsed=*/true,
|
||||
DAG.getExternalSymbol(TrapFuncName.c_str(), TLI.getPointerTy()),
|
||||
Args, DAG, Op.getDebugLoc());
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
||||
switch (Op.getOpcode()) {
|
||||
default: llvm_unreachable("Don't know how to custom lower this!");
|
||||
@ -4757,7 +4736,6 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
||||
case ISD::MUL: return LowerMUL(Op, DAG);
|
||||
case ISD::SDIV: return LowerSDIV(Op, DAG);
|
||||
case ISD::UDIV: return LowerUDIV(Op, DAG);
|
||||
case ISD::TRAP: return LowerTrap(Op, DAG);
|
||||
}
|
||||
return SDValue();
|
||||
}
|
||||
|
@ -211,6 +211,10 @@ UseDivMod("use-divmod-libcall",
|
||||
cl::desc("Use __{u}divmod libcalls for div / rem pairs"),
|
||||
cl::location(HasDivModLibcall),
|
||||
cl::init(false));
|
||||
static cl::opt<std::string>
|
||||
TrapFuncName("trap-func", cl::Hidden,
|
||||
cl::desc("Emit a call to trap function rather than a trap instruction"),
|
||||
cl::init(""));
|
||||
static cl::opt<bool>
|
||||
DataSections("fdata-sections",
|
||||
cl::desc("Emit data into separate sections"),
|
||||
@ -310,4 +314,11 @@ namespace llvm {
|
||||
bool HonorSignDependentRoundingFPMath() {
|
||||
return !UnsafeFPMath && HonorSignDependentRoundingFPMathOption;
|
||||
}
|
||||
|
||||
/// getTrapFunctionName - If this returns a non-empty string, this means isel
|
||||
/// should lower Intrinsic::trap to a call to the specified function name
|
||||
/// instead of an ISD::TRAP node.
|
||||
StringRef getTrapFunctionName() {
|
||||
return TrapFuncName;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s -check-prefix=INSTR
|
||||
; RUN: llc < %s -mtriple=arm-apple-darwin -arm-trap-func=_trap | FileCheck %s -check-prefix=FUNC
|
||||
; RUN: llc < %s -mtriple=arm-apple-darwin -trap-func=_trap | FileCheck %s -check-prefix=FUNC
|
||||
; rdar://7961298
|
||||
; rdar://9249183
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user