|
23 | 23 | #include "llvm/CodeGen/ValueTypes.h" |
24 | 24 | #include "llvm/IR/DiagnosticInfo.h" |
25 | 25 | #include "llvm/IR/DiagnosticPrinter.h" |
| 26 | +#include "llvm/IR/Module.h" |
26 | 27 | #include "llvm/Support/Debug.h" |
27 | 28 | #include "llvm/Support/ErrorHandling.h" |
28 | 29 | #include "llvm/Support/MathExtras.h" |
@@ -68,6 +69,8 @@ BPFTargetLowering::BPFTargetLowering(const TargetMachine &TM, |
68 | 69 | setOperationAction(ISD::BRIND, MVT::Other, Expand); |
69 | 70 | setOperationAction(ISD::BRCOND, MVT::Other, Expand); |
70 | 71 |
|
| 72 | + setOperationAction(ISD::TRAP, MVT::Other, Custom); |
| 73 | + |
71 | 74 | setOperationAction({ISD::GlobalAddress, ISD::ConstantPool}, MVT::i64, Custom); |
72 | 75 |
|
73 | 76 | setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Custom); |
@@ -326,6 +329,8 @@ SDValue BPFTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const { |
326 | 329 | case ISD::ATOMIC_LOAD: |
327 | 330 | case ISD::ATOMIC_STORE: |
328 | 331 | return LowerATOMIC_LOAD_STORE(Op, DAG); |
| 332 | + case ISD::TRAP: |
| 333 | + return LowerTRAP(Op, DAG); |
329 | 334 | } |
330 | 335 | } |
331 | 336 |
|
@@ -521,10 +526,12 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, |
521 | 526 | Callee = DAG.getTargetGlobalAddress(G->getGlobal(), CLI.DL, PtrVT, |
522 | 527 | G->getOffset(), 0); |
523 | 528 | } else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee)) { |
524 | | - Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, 0); |
525 | | - fail(CLI.DL, DAG, |
526 | | - Twine("A call to built-in function '" + StringRef(E->getSymbol()) + |
527 | | - "' is not supported.")); |
| 529 | + if (strcmp(E->getSymbol(), BPF_UNREACHABLE) != 0) { |
| 530 | + Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, 0); |
| 531 | + fail(CLI.DL, DAG, |
| 532 | + Twine("A call to built-in function '" + StringRef(E->getSymbol()) + |
| 533 | + "' is not supported.")); |
| 534 | + } |
528 | 535 | } |
529 | 536 |
|
530 | 537 | // Returns a chain & a flag for retval copy to use. |
@@ -726,6 +733,35 @@ SDValue BPFTargetLowering::LowerATOMIC_LOAD_STORE(SDValue Op, |
726 | 733 | return Op; |
727 | 734 | } |
728 | 735 |
|
| 736 | +SDValue BPFTargetLowering::LowerTRAP(SDValue Op, SelectionDAG &DAG) const { |
| 737 | + MachineFunction &MF = DAG.getMachineFunction(); |
| 738 | + TargetLowering::CallLoweringInfo CLI(DAG); |
| 739 | + SmallVector<SDValue> InVals; |
| 740 | + SDNode *N = Op.getNode(); |
| 741 | + SDLoc DL(N); |
| 742 | + |
| 743 | + Module *M = MF.getFunction().getParent(); |
| 744 | + FunctionType *FT = FunctionType::get(Type::getVoidTy(M->getContext()), false); |
| 745 | + Function *UnreachableHelper = M->getFunction(BPF_UNREACHABLE); |
| 746 | + if (!UnreachableHelper) { |
| 747 | + Function *NewF = Function::Create(FT, GlobalValue::ExternalWeakLinkage, |
| 748 | + BPF_UNREACHABLE, M); |
| 749 | + NewF->setDSOLocal(true); |
| 750 | + NewF->setCallingConv(CallingConv::C); |
| 751 | + } |
| 752 | + |
| 753 | + auto PtrVT = getPointerTy(MF.getDataLayout()); |
| 754 | + CLI.Callee = DAG.getTargetExternalSymbol(BPF_UNREACHABLE, PtrVT); |
| 755 | + CLI.Chain = N->getOperand(0); |
| 756 | + CLI.IsTailCall = false; |
| 757 | + CLI.CallConv = CallingConv::C; |
| 758 | + CLI.IsVarArg = false; |
| 759 | + CLI.DL = DL; |
| 760 | + CLI.NoMerge = false; |
| 761 | + CLI.DoesNotReturn = true; |
| 762 | + return LowerCall(CLI, InVals); |
| 763 | +} |
| 764 | + |
729 | 765 | const char *BPFTargetLowering::getTargetNodeName(unsigned Opcode) const { |
730 | 766 | switch ((BPFISD::NodeType)Opcode) { |
731 | 767 | case BPFISD::FIRST_NUMBER: |
|
0 commit comments