|
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,34 @@ 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 | + return LowerCall(CLI, InVals); |
| 762 | +} |
| 763 | + |
729 | 764 | const char *BPFTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
730 | 765 | switch ((BPFISD::NodeType)Opcode) {
|
731 | 766 | case BPFISD::FIRST_NUMBER:
|
|
0 commit comments