diff --git a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp --- a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp +++ b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp @@ -107,11 +107,16 @@ std::string E; const Target *TheTarget = TargetRegistry::lookupTarget(codegen::getMArch(), ModuleTriple, E); - TargetMachine *Machine = TheTarget->createTargetMachine( + if (!TheTarget) + ErrorAndExit(E); + + std::unique_ptr TM(TheTarget->createTargetMachine( M->getTargetTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(), Options, codegen::getExplicitRelocModel(), - codegen::getExplicitCodeModel(), OLvl); - std::unique_ptr TM(Machine); + codegen::getExplicitCodeModel(), OLvl)); + if (!TM) + ErrorAndExit("Could not create target machine"); + codegen::setFunctionAttributes(codegen::getCPUStr(), codegen::getFeaturesStr(), *M); diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -428,8 +428,11 @@ std::unique_ptr Str; std::unique_ptr MCII(TheTarget->createMCInstrInfo()); + assert(MCII && "Unable to create instruction info!"); + std::unique_ptr STI( TheTarget->createMCSubtargetInfo(Opts.Triple, Opts.CPU, FS)); + assert(STI && "Unable to create subtarget info!"); raw_pwrite_stream *Out = FDOS.get(); std::unique_ptr BOS; @@ -468,6 +471,8 @@ TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx)); std::unique_ptr MAB( TheTarget->createMCAsmBackend(*STI, *MRI, MCOptions)); + assert(MAB && "Unable to create asm backend!"); + std::unique_ptr OW = DwoOS ? MAB->createDwoObjectWriter(*Out, *DwoOS) : MAB->createObjectWriter(*Out); diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -307,6 +307,7 @@ std::unique_ptr STI(TM.getTarget().createMCSubtargetInfo( TM.getTargetTriple().str(), TM.getTargetCPU(), TM.getTargetFeatureString())); + assert(STI && "Unable to create subtarget info"); OutStreamer->AddComment("Start of file scope inline assembly"); OutStreamer->AddBlankLine(); emitInlineAsm(M.getModuleInlineAsm() + "\n", diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -147,6 +147,7 @@ // we only need MCInstrInfo for asm parsing. We create one unconditionally // because it's not subtarget dependent. std::unique_ptr MII(TM.getTarget().createMCInstrInfo()); + assert(MII && "Failed to create instruction info"); std::unique_ptr TAP(TM.getTarget().createMCAsmParser( STI, *Parser, *MII, MCOptions)); if (!TAP) diff --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/llvm/lib/CodeGen/LLVMTargetMachine.cpp --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -40,13 +40,16 @@ void LLVMTargetMachine::initAsmInfo() { MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str())); + assert(MRI && "Unable to create reg info"); MII.reset(TheTarget.createMCInstrInfo()); + assert(MII && "Unable to create instruction info"); // FIXME: Having an MCSubtargetInfo on the target machine is a hack due // to some backends having subtarget feature dependent module level // code generation. This is similar to the hack in the AsmPrinter for // module level assembly etc. STI.reset(TheTarget.createMCSubtargetInfo( getTargetTriple().str(), getTargetCPU(), getTargetFeatureString())); + assert(STI && "Unable to create subtarget info"); MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo( *MRI, getTargetTriple().str(), Options.MCOptions); diff --git a/llvm/lib/CodeGen/ParallelCG.cpp b/llvm/lib/CodeGen/ParallelCG.cpp --- a/llvm/lib/CodeGen/ParallelCG.cpp +++ b/llvm/lib/CodeGen/ParallelCG.cpp @@ -28,6 +28,8 @@ function_ref()> TMFactory, CodeGenFileType FileType) { std::unique_ptr TM = TMFactory(); + assert(TM && "Failed to create target machine!"); + legacy::PassManager CodeGenPasses; if (TM->addPassesToEmitFile(CodeGenPasses, OS, nullptr, FileType)) report_fatal_error("Failed to setup codegen"); diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -199,9 +199,11 @@ else CodeModel = M.getCodeModel(); - return std::unique_ptr(TheTarget->createTargetMachine( + std::unique_ptr TM(TheTarget->createTargetMachine( TheTriple, Conf.CPU, Features.getString(), Conf.Options, RelocModel, CodeModel, Conf.CGOptLevel)); + assert(TM && "Failed to create target machine"); + return TM; } static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -374,10 +374,13 @@ } TargetMach = createTargetMachine(); + assert(TargetMach && "Unable to create target machine"); + return true; } std::unique_ptr LTOCodeGenerator::createTargetMachine() { + assert(MArch && "MArch is not set!"); return std::unique_ptr(MArch->createTargetMachine( TripleStr, MCpu, FeatureStr, Options, RelocModel, None, CGOptLevel)); } diff --git a/llvm/lib/LTO/LTOModule.cpp b/llvm/lib/LTO/LTOModule.cpp --- a/llvm/lib/LTO/LTOModule.cpp +++ b/llvm/lib/LTO/LTOModule.cpp @@ -46,6 +46,7 @@ LTOModule::LTOModule(std::unique_ptr M, MemoryBufferRef MBRef, llvm::TargetMachine *TM) : Mod(std::move(M)), MBRef(MBRef), _target(TM) { + assert(_target && "target machine is null"); SymTab.addModule(Mod.get()); } diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -575,9 +575,12 @@ Features.getDefaultSubtargetFeatures(TheTriple); std::string FeatureStr = Features.getString(); - return std::unique_ptr( + std::unique_ptr TM( TheTarget->createTargetMachine(TheTriple.str(), MCpu, FeatureStr, Options, RelocModel, None, CGOptLevel)); + assert(TM && "Cannot create target machine"); + + return TM; } /** diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -320,6 +320,7 @@ assert(TT.isOSBinFormatELF()); std::unique_ptr STI( TM.getTarget().createMCSubtargetInfo(TT.str(), "", "")); + assert(STI && "Unable to create subtarget info"); MCSymbol *HwasanTagMismatchV1Sym = OutContext.getOrCreateSymbol("__hwasan_tag_mismatch"); diff --git a/llvm/tools/llvm-exegesis/lib/LlvmState.cpp b/llvm/tools/llvm-exegesis/lib/LlvmState.cpp --- a/llvm/tools/llvm-exegesis/lib/LlvmState.cpp +++ b/llvm/tools/llvm-exegesis/lib/LlvmState.cpp @@ -31,6 +31,7 @@ TheTargetMachine.reset( static_cast(TheTarget->createTargetMachine( Triple, CpuName, Features, Options, Reloc::Model::Static))); + assert(TheTargetMachine && "unable to create target machine"); TheExegesisTarget = ExegesisTarget::lookup(TheTargetMachine->getTargetTriple()); if (!TheExegesisTarget) { errs() << "no exegesis target for " << Triple << ", using default\n"; @@ -67,6 +68,7 @@ TheTargetMachine->getTarget().createMCCodeEmitter( *TheTargetMachine->getMCInstrInfo(), *TheTargetMachine->getMCRegisterInfo(), Context)); + assert(CodeEmitter && "unable to create code emitter"); SmallVector Tmp; raw_svector_ostream OS(Tmp); SmallVector Fixups; diff --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp --- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp +++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp @@ -427,6 +427,7 @@ } std::unique_ptr InstrInfo(TheTarget->createMCInstrInfo()); + assert(InstrInfo && "Unable to create instruction info!"); const auto Clustering = ExitOnErr(InstructionBenchmarkClustering::create( Points, AnalysisClusteringAlgorithm, AnalysisDbscanNumPoints, diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -469,8 +469,11 @@ std::unique_ptr Str; std::unique_ptr MCII(TheTarget->createMCInstrInfo()); + assert(MCII && "Unable to create instruction info!"); + std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); + assert(STI && "Unable to create subtarget info!"); MCInstPrinter *IP = nullptr; if (FileType == OFT_AssemblyFile) { diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -330,6 +330,7 @@ std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MCPU, MATTR)); + assert(STI && "Unable to create subtarget info!"); if (!STI->isCPUStringValid(MCPU)) return 1; @@ -373,6 +374,7 @@ std::unique_ptr BOS; std::unique_ptr MCII(TheTarget->createMCInstrInfo()); + assert(MCII && "Unable to create instruction info!"); std::unique_ptr MCIA( TheTarget->createMCInstrAnalysis(MCII.get())); @@ -443,9 +445,11 @@ std::unique_ptr MCE( TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx)); + assert(MCE && "Unable to create code emitter!"); std::unique_ptr MAB(TheTarget->createMCAsmBackend( *STI, *MRI, mc::InitMCTargetOptionsFromFlags())); + assert(MAB && "Unable to create asm backend!"); for (const std::unique_ptr &Region : Regions) { // Skip empty code regions. diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -315,8 +315,11 @@ std::unique_ptr Str; std::unique_ptr MCII(TheTarget->createMCInstrInfo()); + assert(MCII && "Unable to create instruction info!"); + std::unique_ptr STI(TheTarget->createMCSubtargetInfo( TripleName, /*CPU=*/"", /*Features=*/"")); + assert(STI && "Unable to create subtarget info!"); MCInstPrinter *IP = nullptr; if (FileType == OFT_AssemblyFile) { diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -7200,10 +7200,32 @@ else MachOMCPU = MCPU; +#define CHECK_TARGET_INFO_CREATION(NAME) \ + do { \ + if (!NAME) { \ + WithColor::error(errs(), "llvm-objdump") \ + << "couldn't initialize disassembler for target " << TripleName \ + << '\n'; \ + return; \ + } \ + } while (false) +#define CHECK_THUMB_TARGET_INFO_CREATION(NAME) \ + do { \ + if (!NAME) { \ + WithColor::error(errs(), "llvm-objdump") \ + << "couldn't initialize disassembler for target " << ThumbTripleName \ + << '\n'; \ + return; \ + } \ + } while (false) + std::unique_ptr InstrInfo(TheTarget->createMCInstrInfo()); + CHECK_TARGET_INFO_CREATION(InstrInfo); std::unique_ptr ThumbInstrInfo; - if (ThumbTarget) + if (ThumbTarget) { ThumbInstrInfo.reset(ThumbTarget->createMCInstrInfo()); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbInstrInfo); + } // Package up features to be passed to target/subtarget std::string FeaturesStr; @@ -7218,13 +7240,17 @@ // Set up disassembler. std::unique_ptr MRI( TheTarget->createMCRegInfo(TripleName)); + CHECK_TARGET_INFO_CREATION(MRI); std::unique_ptr AsmInfo( TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); + CHECK_TARGET_INFO_CREATION(AsmInfo); std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MachOMCPU, FeaturesStr)); + CHECK_TARGET_INFO_CREATION(STI); MCContext Ctx(AsmInfo.get(), MRI.get(), nullptr); std::unique_ptr DisAsm( TheTarget->createMCDisassembler(*STI, Ctx)); + CHECK_TARGET_INFO_CREATION(DisAsm); std::unique_ptr Symbolizer; struct DisassembleInfo SymbolizerInfo(nullptr, nullptr, nullptr, false); std::unique_ptr RelInfo( @@ -7238,6 +7264,7 @@ int AsmPrinterVariant = AsmInfo->getAssemblerDialect(); std::unique_ptr IP(TheTarget->createMCInstPrinter( Triple(TripleName), AsmPrinterVariant, *AsmInfo, *InstrInfo, *MRI)); + CHECK_TARGET_INFO_CREATION(IP); // Set the display preference for hex vs. decimal immediates. IP->setPrintImmHex(PrintImmHex); // Comment stream and backing vector. @@ -7250,12 +7277,6 @@ // comment causing different diffs with the 'C' disassembler library API. // IP->setCommentStream(CommentStream); - if (!AsmInfo || !STI || !DisAsm || !IP) { - WithColor::error(errs(), "llvm-objdump") - << "couldn't initialize disassembler for target " << TripleName << '\n'; - return; - } - // Set up separate thumb disassembler if needed. std::unique_ptr ThumbMRI; std::unique_ptr ThumbAsmInfo; @@ -7268,13 +7289,17 @@ std::unique_ptr ThumbRelInfo; if (ThumbTarget) { ThumbMRI.reset(ThumbTarget->createMCRegInfo(ThumbTripleName)); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbMRI); ThumbAsmInfo.reset( ThumbTarget->createMCAsmInfo(*ThumbMRI, ThumbTripleName, MCOptions)); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbAsmInfo); ThumbSTI.reset( ThumbTarget->createMCSubtargetInfo(ThumbTripleName, MachOMCPU, FeaturesStr)); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbSTI); ThumbCtx.reset(new MCContext(ThumbAsmInfo.get(), ThumbMRI.get(), nullptr)); ThumbDisAsm.reset(ThumbTarget->createMCDisassembler(*ThumbSTI, *ThumbCtx)); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbDisAsm); MCContext *PtrThumbCtx = ThumbCtx.get(); ThumbRelInfo.reset( ThumbTarget->createMCRelocationInfo(ThumbTripleName, *PtrThumbCtx)); @@ -7288,16 +7313,13 @@ ThumbIP.reset(ThumbTarget->createMCInstPrinter( Triple(ThumbTripleName), ThumbAsmPrinterVariant, *ThumbAsmInfo, *ThumbInstrInfo, *ThumbMRI)); + CHECK_THUMB_TARGET_INFO_CREATION(ThumbIP); // Set the display preference for hex vs. decimal immediates. ThumbIP->setPrintImmHex(PrintImmHex); } - if (ThumbTarget && (!ThumbAsmInfo || !ThumbSTI || !ThumbDisAsm || !ThumbIP)) { - WithColor::error(errs(), "llvm-objdump") - << "couldn't initialize disassembler for target " << ThumbTripleName - << '\n'; - return; - } +#undef CHECK_TARGET_INFO_CREATION +#undef CHECK_THUMB_TARGET_INFO_CREATION MachO::mach_header Header = MachOOF->getHeader(); diff --git a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp --- a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -764,6 +764,8 @@ ErrorAndExit("Unable to create disassembler!"); std::unique_ptr MII(TheTarget->createMCInstrInfo()); + if (!MII) + ErrorAndExit("Unable to create target instruction info!"); std::unique_ptr InstPrinter( TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI)); diff --git a/mlir/lib/Conversion/GPUCommon/ConvertKernelFuncToBlob.cpp b/mlir/lib/Conversion/GPUCommon/ConvertKernelFuncToBlob.cpp --- a/mlir/lib/Conversion/GPUCommon/ConvertKernelFuncToBlob.cpp +++ b/mlir/lib/Conversion/GPUCommon/ConvertKernelFuncToBlob.cpp @@ -130,6 +130,10 @@ } targetMachine.reset(target->createTargetMachine(triple.str(), targetChip, features, {}, {})); + if (targetMachine == nullptr) { + emitError(loc, "connot initialize target machine"); + return {}; + } } llvmModule.setDataLayout(targetMachine->createDataLayout()); diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp --- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp @@ -130,6 +130,10 @@ std::unique_ptr machine(target->createTargetMachine( targetTriple, cpu, features.getString(), {}, {})); + if (!machine) { + errs() << "Unable to create target machine\n"; + return true; + } llvmModule->setDataLayout(machine->createDataLayout()); llvmModule->setTargetTriple(targetTriple); return false;