| 
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