From 274d8d4eba8224b64e0bbc7196011ae7e0477453 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 7 Apr 2011 20:31:12 +0000 Subject: [PATCH] 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 --- lib/Target/ARM/ARMISelLowering.cpp | 24 +++++++++++++++++++++++- test/CodeGen/ARM/trap.ll | 11 ++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 330a7816f5c..7c456ed1eaa 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -72,6 +72,11 @@ ARMInterworking("arm-interworking", cl::Hidden, cl::desc("Enable / disable ARM interworking (for debugging only)"), cl::init(true)); +static cl::opt +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) { @@ -557,7 +562,10 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM) setOperationAction(ISD::GlobalTLSAddress, 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. setOperationAction(ISD::VASTART, MVT::Other, Custom); @@ -4690,6 +4698,19 @@ 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 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!"); @@ -4736,6 +4757,7 @@ 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(); } diff --git a/test/CodeGen/ARM/trap.ll b/test/CodeGen/ARM/trap.ll index b2f6b6e69fa..189bc8cc04e 100644 --- a/test/CodeGen/ARM/trap.ll +++ b/test/CodeGen/ARM/trap.ll @@ -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://9249183 define void @t() nounwind { entry: -; CHECK: t: -; CHECK: trap +; INSTR: t: +; INSTR: trap + +; FUNC: t: +; FUNC: bl __trap call void @llvm.trap() unreachable } -- 2.34.1