Add option to emit @llvm.trap as a function call instead of a trap instruction. rdar...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 7 Apr 2011 20:31:12 +0000 (20:31 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 7 Apr 2011 20:31:12 +0000 (20:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129107 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMISelLowering.cpp
test/CodeGen/ARM/trap.ll

index 330a7816f5ca2ece0d5e7bc594f0a5b5145fbefd..7c456ed1eaa6b63ef2bafa9ebc0cf97b072ff935 100644 (file)
@@ -72,6 +72,11 @@ 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) {
@@ -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<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!");
@@ -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();
 }
index b2f6b6e69fa5734315fe3b94f65a07c17af2b84a..189bc8cc04edb25123ecfceed9d14f8c49c7a7bf 100644 (file)
@@ -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
 }