mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
Add option to emit @llvm.trap as a function call instead of a trap instruction. rdar://9249183.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129107 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce8463f1fb
commit
274d8d4eba
@ -72,6 +72,11 @@ ARMInterworking("arm-interworking", cl::Hidden,
|
|||||||
cl::desc("Enable / disable ARM interworking (for debugging only)"),
|
cl::desc("Enable / disable ARM interworking (for debugging only)"),
|
||||||
cl::init(true));
|
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,
|
void ARMTargetLowering::addTypeForNEON(EVT VT, EVT PromotedLdStVT,
|
||||||
EVT PromotedBitwiseVT) {
|
EVT PromotedBitwiseVT) {
|
||||||
if (VT != PromotedLdStVT) {
|
if (VT != PromotedLdStVT) {
|
||||||
@ -557,7 +562,10 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
|||||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
|
setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
|
||||||
|
|
||||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
if (TrapFuncName.size())
|
||||||
|
setOperationAction(ISD::TRAP, MVT::Other, Custom);
|
||||||
|
else
|
||||||
|
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
||||||
|
|
||||||
// Use the default implementation.
|
// Use the default implementation.
|
||||||
setOperationAction(ISD::VASTART, MVT::Other, Custom);
|
setOperationAction(ISD::VASTART, MVT::Other, Custom);
|
||||||
@ -4690,6 +4698,19 @@ static SDValue LowerUDIV(SDValue Op, SelectionDAG &DAG) {
|
|||||||
return N0;
|
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 {
|
SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
||||||
switch (Op.getOpcode()) {
|
switch (Op.getOpcode()) {
|
||||||
default: llvm_unreachable("Don't know how to custom lower this!");
|
default: llvm_unreachable("Don't know how to custom lower this!");
|
||||||
@ -4736,6 +4757,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
case ISD::MUL: return LowerMUL(Op, DAG);
|
case ISD::MUL: return LowerMUL(Op, DAG);
|
||||||
case ISD::SDIV: return LowerSDIV(Op, DAG);
|
case ISD::SDIV: return LowerSDIV(Op, DAG);
|
||||||
case ISD::UDIV: return LowerUDIV(Op, DAG);
|
case ISD::UDIV: return LowerUDIV(Op, DAG);
|
||||||
|
case ISD::TRAP: return LowerTrap(Op, DAG);
|
||||||
}
|
}
|
||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,15 @@
|
|||||||
; RUN: llc < %s -march=arm | FileCheck %s
|
; 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
|
||||||
; rdar://7961298
|
; rdar://7961298
|
||||||
|
; rdar://9249183
|
||||||
|
|
||||||
define void @t() nounwind {
|
define void @t() nounwind {
|
||||||
entry:
|
entry:
|
||||||
; CHECK: t:
|
; INSTR: t:
|
||||||
; CHECK: trap
|
; INSTR: trap
|
||||||
|
|
||||||
|
; FUNC: t:
|
||||||
|
; FUNC: bl __trap
|
||||||
call void @llvm.trap()
|
call void @llvm.trap()
|
||||||
unreachable
|
unreachable
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user