diff --git a/llvm/lib/Target/BPF/BPFISelLowering.h b/llvm/lib/Target/BPF/BPFISelLowering.h --- a/llvm/lib/Target/BPF/BPFISelLowering.h +++ b/llvm/lib/Target/BPF/BPFISelLowering.h @@ -66,6 +66,8 @@ MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override; + void finalizeLowering(MachineFunction &MF) const override; + private: // Control Instruction Selection Features bool HasAlu32; @@ -73,6 +75,11 @@ bool HasJmpExt; bool HasMovsx; + mutable bool HasError = false; + + void fail(const SDLoc &DL, SelectionDAG &DAG, const Twine &Msg, + SDValue Val) const; + SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; diff --git a/llvm/lib/Target/BPF/BPFISelLowering.cpp b/llvm/lib/Target/BPF/BPFISelLowering.cpp --- a/llvm/lib/Target/BPF/BPFISelLowering.cpp +++ b/llvm/lib/Target/BPF/BPFISelLowering.cpp @@ -35,22 +35,18 @@ cl::Hidden, cl::init(false), cl::desc("Expand memcpy into load/store pairs in order")); -static void fail(const SDLoc &DL, SelectionDAG &DAG, const Twine &Msg) { - MachineFunction &MF = DAG.getMachineFunction(); - DAG.getContext()->diagnose( - DiagnosticInfoUnsupported(MF.getFunction(), Msg, DL.getDebugLoc())); -} - -static void fail(const SDLoc &DL, SelectionDAG &DAG, const char *Msg, - SDValue Val) { - MachineFunction &MF = DAG.getMachineFunction(); +void BPFTargetLowering::fail(const SDLoc &DL, SelectionDAG &DAG, + const Twine &Msg, SDValue Val = {}) const { + HasError = true; std::string Str; - raw_string_ostream OS(Str); - OS << Msg; - Val->print(OS); - OS.flush(); - DAG.getContext()->diagnose( - DiagnosticInfoUnsupported(MF.getFunction(), Str, DL.getDebugLoc())); + if (Val) { + raw_string_ostream OS(Str); + Val->print(OS); + OS << ' '; + } + MachineFunction &MF = DAG.getMachineFunction(); + DAG.getContext()->diagnose(DiagnosticInfoUnsupported( + MF.getFunction(), Msg.concat(Str), DL.getDebugLoc())); } BPFTargetLowering::BPFTargetLowering(const TargetMachine &TM, @@ -871,6 +867,13 @@ return (getHasAlu32() && VT == MVT::i32) ? MVT::i32 : MVT::i64; } +void BPFTargetLowering::finalizeLowering(MachineFunction &MF) const { + if (HasError) { + report_fatal_error("failed to generate BPF instructions, see diagnostics"); + } + TargetLowering::finalizeLowering(MF); +} + bool BPFTargetLowering::isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS,