diff --git a/clang/lib/Parse/ParseStmtAsm.cpp b/clang/lib/Parse/ParseStmtAsm.cpp --- a/clang/lib/Parse/ParseStmtAsm.cpp +++ b/clang/lib/Parse/ParseStmtAsm.cpp @@ -577,20 +577,22 @@ TheTarget->createMCAsmInfo(*MRI, TT, MCOptions)); // Get the instruction descriptor. std::unique_ptr MII(TheTarget->createMCInstrInfo()); - std::unique_ptr MOFI(new llvm::MCObjectFileInfo()); std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr)); // Target MCTargetDesc may not be linked in clang-based tools. + + llvm::SourceMgr TempSrcMgr; + llvm::MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &TempSrcMgr); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); + if (!MAI || !MII || !MOFI || !STI) { Diag(AsmLoc, diag::err_msasm_unable_to_create_target) << "target MC unavailable"; return EmptyStmt(); } - llvm::SourceMgr TempSrcMgr; - llvm::MCContext Ctx(TheTriple, MAI.get(), MRI.get(), MOFI.get(), STI.get(), - &TempSrcMgr); - MOFI->initMCObjectFileInfo(Ctx, /*PIC=*/false); std::unique_ptr Buffer = llvm::MemoryBuffer::getMemBuffer(AsmString, ""); 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 @@ -383,10 +383,6 @@ if (!Opts.SplitDwarfOutput.empty()) DwoOS = getOutputStream(Opts.SplitDwarfOutput, Diags, IsBinary); - // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and - // MCObjectFileInfo needs a MCContext reference in order to initialize itself. - std::unique_ptr MOFI(new MCObjectFileInfo()); - // Build up the feature string from the target feature list. std::string FS = llvm::join(Opts.Features, ","); @@ -394,8 +390,8 @@ TheTarget->createMCSubtargetInfo(Opts.Triple, Opts.CPU, FS)); assert(STI && "Unable to create subtarget info!"); - MCContext Ctx(Triple(Opts.Triple), MAI.get(), MRI.get(), MOFI.get(), - STI.get(), &SrcMgr, &MCOptions); + MCContext Ctx(Triple(Opts.Triple), MAI.get(), MRI.get(), STI.get(), &SrcMgr, + &MCOptions); bool PIC = false; if (Opts.RelocationModel == "static") { @@ -408,7 +404,12 @@ PIC = false; } - MOFI->initMCObjectFileInfo(Ctx, PIC); + // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and + // MCObjectFileInfo needs a MCContext reference in order to initialize itself. + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, PIC)); + Ctx.setObjectFileInfo(MOFI.get()); + if (Opts.SaveTemporaryLabels) Ctx.setAllowTemporaryLabels(false); if (Opts.GenDwarfForAssembly) diff --git a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp --- a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp +++ b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp @@ -904,9 +904,9 @@ if (!asm_info_up) return Instance(); - std::unique_ptr context_up(new llvm::MCContext( - llvm::Triple(triple), asm_info_up.get(), reg_info_up.get(), - /*MOFI=*/nullptr, subtarget_info_up.get())); + std::unique_ptr context_up( + new llvm::MCContext(llvm::Triple(triple), asm_info_up.get(), + reg_info_up.get(), subtarget_info_up.get())); if (!context_up) return Instance(); diff --git a/lldb/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp b/lldb/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp --- a/lldb/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp +++ b/lldb/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp @@ -160,8 +160,7 @@ assert(m_asm_info.get() && m_subtype_info.get()); m_context = std::make_unique( - triple, m_asm_info.get(), m_reg_info.get(), /*MOFI=*/nullptr, - m_subtype_info.get()); + triple, m_asm_info.get(), m_reg_info.get(), m_subtype_info.get()); assert(m_context.get()); m_disasm.reset(target->createMCDisassembler(*m_subtype_info, *m_context)); diff --git a/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp b/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp --- a/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp +++ b/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp @@ -164,8 +164,7 @@ assert(m_asm_info.get() && m_subtype_info.get()); m_context = std::make_unique( - triple, m_asm_info.get(), m_reg_info.get(), /*MOFI=*/nullptr, - m_subtype_info.get()); + triple, m_asm_info.get(), m_reg_info.get(), m_subtype_info.get()); assert(m_context.get()); m_disasm.reset(target->createMCDisassembler(*m_subtype_info, *m_context)); diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h --- a/llvm/include/llvm/MC/MCContext.h +++ b/llvm/include/llvm/MC/MCContext.h @@ -393,8 +393,7 @@ public: explicit MCContext(const Triple &TheTriple, const MCAsmInfo *MAI, - const MCRegisterInfo *MRI, const MCObjectFileInfo *MOFI, - const MCSubtargetInfo *MSTI, + const MCRegisterInfo *MRI, const MCSubtargetInfo *MSTI, const SourceMgr *Mgr = nullptr, MCTargetOptions const *TargetOpts = nullptr, bool DoAutoReset = true); @@ -416,6 +415,8 @@ this->DiagHandler = DiagHandler; } + void setObjectFileInfo(const MCObjectFileInfo *Mofi) { MOFI = Mofi; } + const MCAsmInfo *getAsmInfo() const { return MAI; } const MCRegisterInfo *getRegisterInfo() const { return MRI; } diff --git a/llvm/include/llvm/Support/TargetRegistry.h b/llvm/include/llvm/Support/TargetRegistry.h --- a/llvm/include/llvm/Support/TargetRegistry.h +++ b/llvm/include/llvm/Support/TargetRegistry.h @@ -23,6 +23,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/iterator_range.h" +#include "llvm/MC/MCObjectFileInfo.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormattedStream.h" @@ -130,6 +131,9 @@ using MCAsmInfoCtorFnTy = MCAsmInfo *(*)(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options); + using MCObjectFileInfoCtorFnTy = MCObjectFileInfo *(*)(MCContext &Ctx, + bool PIC, + bool LargeCodeModel); using MCInstrInfoCtorFnTy = MCInstrInfo *(*)(); using MCInstrAnalysisCtorFnTy = MCInstrAnalysis *(*)(const MCInstrInfo *Info); using MCRegInfoCtorFnTy = MCRegisterInfo *(*)(const Triple &TT); @@ -227,6 +231,9 @@ /// registered. MCAsmInfoCtorFnTy MCAsmInfoCtorFn; + /// Constructor function for this target's MCObjectFileInfo, if registered. + MCObjectFileInfoCtorFnTy MCObjectFileInfoCtorFn; + /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, /// if registered. MCInstrInfoCtorFnTy MCInstrInfoCtorFn; @@ -350,6 +357,19 @@ return MCAsmInfoCtorFn(MRI, Triple(TheTriple), Options); } + /// Create a MCObjectFileInfo implementation for the specified target + /// triple. + /// + MCObjectFileInfo *createMCObjectFileInfo(MCContext &Ctx, bool PIC, + bool LargeCodeModel = false) const { + if (!MCObjectFileInfoCtorFn) { + MCObjectFileInfo *MOFI = new MCObjectFileInfo(); + MOFI->initMCObjectFileInfo(Ctx, PIC, LargeCodeModel); + return MOFI; + } + return MCObjectFileInfoCtorFn(Ctx, PIC, LargeCodeModel); + } + /// createMCInstrInfo - Create a MCInstrInfo implementation. /// MCInstrInfo *createMCInstrInfo() const { @@ -724,6 +744,19 @@ T.MCAsmInfoCtorFn = Fn; } + /// Register a MCObjectFileInfo implementation for the given target. + /// + /// Clients are responsible for ensuring that registration doesn't occur + /// while another thread is attempting to access the registry. Typically + /// this is done by initializing all targets at program startup. + /// + /// @param T - The target being registered. + /// @param Fn - A function to construct a MCObjectFileInfo for the target. + static void RegisterMCObjectFileInfo(Target &T, + Target::MCObjectFileInfoCtorFnTy Fn) { + T.MCObjectFileInfoCtorFn = Fn; + } + /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the /// given target. /// @@ -991,6 +1024,39 @@ } }; +/// Helper template for registering a target object file info implementation. +/// This invokes the static "Create" method on the class to actually do the +/// construction. Usage: +/// +/// extern "C" void LLVMInitializeFooTarget() { +/// extern Target TheFooTarget; +/// RegisterMCObjectFileInfo X(TheFooTarget); +/// } +template struct RegisterMCObjectFileInfo { + RegisterMCObjectFileInfo(Target &T) { + TargetRegistry::RegisterMCObjectFileInfo(T, &Allocator); + } + +private: + static MCObjectFileInfo *Allocator(MCContext &Ctx, bool PIC, + bool LargeCodeModel = false) { + return new MCObjectFileInfoImpl(Ctx, PIC, LargeCodeModel); + } +}; + +/// Helper template for registering a target object file info implementation. +/// This invokes the specified function to do the construction. Usage: +/// +/// extern "C" void LLVMInitializeFooTarget() { +/// extern Target TheFooTarget; +/// RegisterMCObjectFileInfoFn X(TheFooTarget, TheFunction); +/// } +struct RegisterMCObjectFileInfoFn { + RegisterMCObjectFileInfoFn(Target &T, Target::MCObjectFileInfoCtorFnTy Fn) { + TargetRegistry::RegisterMCObjectFileInfo(T, Fn); + } +}; + /// RegisterMCInstrInfo - Helper template for registering a target instruction /// info implementation. This invokes the static "Create" method on the class /// to actually do the construction. Usage: diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp +++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp @@ -218,9 +218,10 @@ MachineModuleInfo::MachineModuleInfo(MachineModuleInfo &&MMI) : TM(std::move(MMI.TM)), Context(MMI.TM.getTargetTriple(), MMI.TM.getMCAsmInfo(), - MMI.TM.getMCRegisterInfo(), MMI.TM.getObjFileLowering(), - MMI.TM.getMCSubtargetInfo(), nullptr, nullptr, false), + MMI.TM.getMCRegisterInfo(), MMI.TM.getMCSubtargetInfo(), nullptr, + nullptr, false), MachineFunctions(std::move(MMI.MachineFunctions)) { + Context.setObjectFileInfo(MMI.TM.getObjFileLowering()); ObjFileMMI = MMI.ObjFileMMI; CurCallSite = MMI.CurCallSite; UsesMSVCFloatingPoint = MMI.UsesMSVCFloatingPoint; @@ -234,17 +235,19 @@ MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM) : TM(*TM), Context(TM->getTargetTriple(), TM->getMCAsmInfo(), - TM->getMCRegisterInfo(), TM->getObjFileLowering(), - TM->getMCSubtargetInfo(), nullptr, nullptr, false) { + TM->getMCRegisterInfo(), TM->getMCSubtargetInfo(), + nullptr, nullptr, false) { + Context.setObjectFileInfo(TM->getObjFileLowering()); initialize(); } MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM, MCContext *ExtContext) : TM(*TM), Context(TM->getTargetTriple(), TM->getMCAsmInfo(), - TM->getMCRegisterInfo(), TM->getObjFileLowering(), - TM->getMCSubtargetInfo(), nullptr, nullptr, false), + TM->getMCRegisterInfo(), TM->getMCSubtargetInfo(), + nullptr, nullptr, false), ExternalContext(ExtContext) { + Context.setObjectFileInfo(TM->getObjFileLowering()); initialize(); } diff --git a/llvm/lib/DWARFLinker/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/DWARFStreamer.cpp --- a/llvm/lib/DWARFLinker/DWARFStreamer.cpp +++ b/llvm/lib/DWARFLinker/DWARFStreamer.cpp @@ -54,10 +54,9 @@ if (!MSTI) return error("no subtarget info for target " + TripleName, Context), false; - MOFI.reset(new MCObjectFileInfo); - MC.reset( - new MCContext(TheTriple, MAI.get(), MRI.get(), MOFI.get(), MSTI.get())); - MOFI->initMCObjectFileInfo(*MC, /*PIC=*/false); + MC.reset(new MCContext(TheTriple, MAI.get(), MRI.get(), MSTI.get())); + MOFI.reset(TheTarget->createMCObjectFileInfo(*MC, /*PIC=*/false)); + MC->setObjectFileInfo(MOFI.get()); MAB = TheTarget->createMCAsmBackend(*MSTI, *MRI, MCOptions); if (!MAB) diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -63,12 +63,12 @@ } MCContext::MCContext(const Triple &TheTriple, const MCAsmInfo *mai, - const MCRegisterInfo *mri, const MCObjectFileInfo *mofi, - const MCSubtargetInfo *msti, const SourceMgr *mgr, - MCTargetOptions const *TargetOpts, bool DoAutoReset) + const MCRegisterInfo *mri, const MCSubtargetInfo *msti, + const SourceMgr *mgr, MCTargetOptions const *TargetOpts, + bool DoAutoReset) : TT(TheTriple), SrcMgr(mgr), InlineSrcMgr(nullptr), - DiagHandler(defaultDiagHandler), MAI(mai), MRI(mri), MOFI(mofi), - MSTI(msti), Symbols(Allocator), UsedNames(Allocator), + DiagHandler(defaultDiagHandler), MAI(mai), MRI(mri), MSTI(msti), + Symbols(Allocator), UsedNames(Allocator), InlineAsmUsedLabelNames(Allocator), CurrentDwarfLoc(0, 0, 0, DWARF2_FLAG_IS_STMT, 0, 0), AutoReset(DoAutoReset), TargetOptions(TargetOpts) { diff --git a/llvm/lib/MC/MCDisassembler/Disassembler.cpp b/llvm/lib/MC/MCDisassembler/Disassembler.cpp --- a/llvm/lib/MC/MCDisassembler/Disassembler.cpp +++ b/llvm/lib/MC/MCDisassembler/Disassembler.cpp @@ -74,8 +74,8 @@ return nullptr; // Set up the MCContext for creating symbols and MCExpr's. - std::unique_ptr Ctx(new MCContext(Triple(TT), MAI.get(), MRI.get(), - /*MOFI=*/nullptr, STI.get())); + std::unique_ptr Ctx( + new MCContext(Triple(TT), MAI.get(), MRI.get(), STI.get())); if (!Ctx) return nullptr; diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp b/llvm/lib/Object/ModuleSymbolTable.cpp --- a/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/llvm/lib/Object/ModuleSymbolTable.cpp @@ -99,10 +99,11 @@ if (!MCII) return; - MCObjectFileInfo MOFI; - MCContext MCCtx(TT, MAI.get(), MRI.get(), &MOFI, STI.get()); - MOFI.initMCObjectFileInfo(MCCtx, /*PIC=*/false); - MOFI.setSDKVersion(M.getSDKVersion()); + MCContext MCCtx(TT, MAI.get(), MRI.get(), STI.get()); + std::unique_ptr MOFI( + T->createMCObjectFileInfo(MCCtx, /*PIC=*/false)); + MOFI->setSDKVersion(M.getSDKVersion()); + MCCtx.setObjectFileInfo(MOFI.get()); RecordStreamer Streamer(MCCtx, M); T->createNullTargetStreamer(Streamer); diff --git a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h --- a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h +++ b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h @@ -207,7 +207,6 @@ std::unique_ptr AsmInfo; std::unique_ptr SubtargetInfo; std::unique_ptr MII; - MCObjectFileInfo MOFI; std::unique_ptr Context; std::unique_ptr Disassembler; std::unique_ptr MIA; diff --git a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp --- a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp +++ b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp @@ -408,7 +408,7 @@ return make_error("Failed to initialise MII."); Context.reset(new MCContext(Triple(TripleName), AsmInfo.get(), - RegisterInfo.get(), &MOFI, SubtargetInfo.get())); + RegisterInfo.get(), SubtargetInfo.get())); Disassembler.reset( ObjectTarget->createMCDisassembler(*SubtargetInfo, *Context)); diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -880,9 +880,10 @@ if (!MSTI) return error("no subtarget info for target " + TripleName, Context); - MCObjectFileInfo MOFI; - MCContext MC(*ErrOrTriple, MAI.get(), MRI.get(), &MOFI, MSTI.get()); - MOFI.initMCObjectFileInfo(MC, /*PIC=*/false); + MCContext MC(*ErrOrTriple, MAI.get(), MRI.get(), MSTI.get()); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(MC, /*PIC=*/false)); + MC.setObjectFileInfo(MOFI.get()); MCTargetOptions Options; auto MAB = TheTarget->createMCAsmBackend(*MSTI, *MRI, Options); diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.h b/llvm/tools/llvm-exegesis/lib/Analysis.h --- a/llvm/tools/llvm-exegesis/lib/Analysis.h +++ b/llvm/tools/llvm-exegesis/lib/Analysis.h @@ -112,7 +112,6 @@ const char *Separator) const; const InstructionBenchmarkClustering &Clustering_; - MCObjectFileInfo ObjectFileInfo_; std::unique_ptr Context_; std::unique_ptr SubtargetInfo_; std::unique_ptr InstrInfo_; diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -176,9 +176,9 @@ Triple(FirstPoint.LLVMTriple), 0 /*default variant*/, *AsmInfo_, *InstrInfo_, *RegInfo_)); - Context_ = std::make_unique( - Triple(FirstPoint.LLVMTriple), AsmInfo_.get(), RegInfo_.get(), - &ObjectFileInfo_, SubtargetInfo_.get()); + Context_ = + std::make_unique(Triple(FirstPoint.LLVMTriple), AsmInfo_.get(), + RegInfo_.get(), SubtargetInfo_.get()); Disasm_.reset(Target.createMCDisassembler(*SubtargetInfo_, *Context_)); assert(Disasm_ && "cannot create MCDisassembler. missing call to " "InitializeXXXTargetDisassembler ?"); 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 @@ -61,10 +61,9 @@ } bool LLVMState::canAssemble(const MCInst &Inst) const { - MCObjectFileInfo ObjectFileInfo; MCContext Context(TheTargetMachine->getTargetTriple(), TheTargetMachine->getMCAsmInfo(), - TheTargetMachine->getMCRegisterInfo(), &ObjectFileInfo, + TheTargetMachine->getMCRegisterInfo(), TheTargetMachine->getMCSubtargetInfo()); std::unique_ptr CodeEmitter( TheTargetMachine->getTarget().createMCCodeEmitter( diff --git a/llvm/tools/llvm-exegesis/lib/SnippetFile.cpp b/llvm/tools/llvm-exegesis/lib/SnippetFile.cpp --- a/llvm/tools/llvm-exegesis/lib/SnippetFile.cpp +++ b/llvm/tools/llvm-exegesis/lib/SnippetFile.cpp @@ -130,13 +130,13 @@ BenchmarkCode Result; - MCObjectFileInfo ObjectFileInfo; const TargetMachine &TM = State.getTargetMachine(); MCContext Context(TM.getTargetTriple(), TM.getMCAsmInfo(), - TM.getMCRegisterInfo(), &ObjectFileInfo, - TM.getMCSubtargetInfo()); + TM.getMCRegisterInfo(), TM.getMCSubtargetInfo()); + std::unique_ptr ObjectFileInfo( + TM.getTarget().createMCObjectFileInfo(Context, /*PIC=*/false)); + Context.setObjectFileInfo(ObjectFileInfo.get()); Context.initInlineSourceManager(); - ObjectFileInfo.initMCObjectFileInfo(Context, /*PIC=*/false); BenchmarkCodeStreamer Streamer(&Context, TM.getMCRegisterInfo(), &Result); std::string Error; diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -1256,8 +1256,7 @@ TripleName, inconvertibleErrorCode())); - MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), /*MOFI=*/nullptr, - STI.get()); + MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), STI.get()); std::unique_ptr Disassembler( TheTarget->createMCDisassembler(*STI, Ctx)); diff --git a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp --- a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp +++ b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp @@ -173,10 +173,10 @@ std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); - MCObjectFileInfo MOFI; - MCContext Ctx(TheTriple, MAI.get(), MRI.get(), &MOFI, STI.get(), &SrcMgr); - static const bool UsePIC = false; - MOFI.initMCObjectFileInfo(Ctx, UsePIC); + MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &SrcMgr); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); const unsigned OutputAsmVariant = 0; std::unique_ptr MCII(TheTarget->createMCInstrInfo()); 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 @@ -394,10 +394,11 @@ // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and // MCObjectFileInfo needs a MCContext reference in order to initialize itself. - MCObjectFileInfo MOFI; - MCContext Ctx(TheTriple, MAI.get(), MRI.get(), &MOFI, STI.get(), &SrcMgr, + MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &SrcMgr, &MCOptions); - MOFI.initMCObjectFileInfo(Ctx, PIC, LargeCodeModel); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, PIC, LargeCodeModel)); + Ctx.setObjectFileInfo(MOFI.get()); if (SaveTempLabels) Ctx.setAllowTemporaryLabels(false); 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 @@ -371,15 +371,15 @@ TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); assert(MAI && "Unable to create target asm info!"); - MCObjectFileInfo MOFI; SourceMgr SrcMgr; // Tell SrcMgr about this buffer, which is what the parser will pick up. SrcMgr.AddNewSourceBuffer(std::move(*BufferPtr), SMLoc()); - MCContext Ctx(TheTriple, MAI.get(), MRI.get(), &MOFI, STI.get(), &SrcMgr); - - MOFI.initMCObjectFileInfo(Ctx, /*PIC=*/false); + MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &SrcMgr); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); std::unique_ptr BOS; diff --git a/llvm/tools/llvm-ml/Disassembler.cpp b/llvm/tools/llvm-ml/Disassembler.cpp --- a/llvm/tools/llvm-ml/Disassembler.cpp +++ b/llvm/tools/llvm-ml/Disassembler.cpp @@ -142,8 +142,7 @@ } // Set up the MCContext for creating symbols and MCExpr's. - MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), /*MOFI=*/nullptr, - &STI); + MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), &STI); std::unique_ptr DisAsm( T.createMCDisassembler(STI, Ctx)); 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 @@ -281,10 +281,10 @@ // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and // MCObjectFileInfo needs a MCContext reference in order to initialize itself. - MCObjectFileInfo MOFI; - MCContext Ctx(TheTriple, MAI.get(), MRI.get(), &MOFI, STI.get(), &SrcMgr); - MOFI.initMCObjectFileInfo(Ctx, /*PIC=*/false, - /*LargeCodeModel=*/true); + MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &SrcMgr); + std::unique_ptr MOFI(TheTarget->createMCObjectFileInfo( + Ctx, /*PIC=*/false, /*LargeCodeModel=*/true)); + Ctx.setObjectFileInfo(MOFI.get()); if (InputArgs.hasArg(OPT_save_temp_labels)) Ctx.setAllowTemporaryLabels(false); 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 @@ -7228,8 +7228,7 @@ std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MachOMCPU, FeaturesStr)); CHECK_TARGET_INFO_CREATION(STI); - MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), /*MOFI=*/nullptr, - STI.get()); + MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), STI.get()); std::unique_ptr DisAsm( TheTarget->createMCDisassembler(*STI, Ctx)); CHECK_TARGET_INFO_CREATION(DisAsm); @@ -7280,8 +7279,7 @@ FeaturesStr)); CHECK_THUMB_TARGET_INFO_CREATION(ThumbSTI); ThumbCtx.reset(new MCContext(Triple(ThumbTripleName), ThumbAsmInfo.get(), - ThumbMRI.get(), /*MOFI=*/nullptr, - ThumbSTI.get())); + ThumbMRI.get(), ThumbSTI.get())); ThumbDisAsm.reset(ThumbTarget->createMCDisassembler(*ThumbSTI, *ThumbCtx)); CHECK_THUMB_TARGET_INFO_CREATION(ThumbDisAsm); MCContext *PtrThumbCtx = ThumbCtx.get(); diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1581,10 +1581,11 @@ if (!MII) reportError(Obj->getFileName(), "no instruction info for target " + TripleName); - MCObjectFileInfo MOFI; - MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), &MOFI, STI.get()); + MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), STI.get()); // FIXME: for now initialize MCObjectFileInfo with default values - MOFI.initMCObjectFileInfo(Ctx, /*PIC=*/false); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); std::unique_ptr DisAsm( TheTarget->createMCDisassembler(*STI, Ctx)); diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp --- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp +++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp @@ -332,9 +332,10 @@ if (!MII) exitWithError("no instruction info for target " + TripleName, FileName); - MCObjectFileInfo MOFI; - MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), &MOFI, STI.get()); - MOFI.initMCObjectFileInfo(Ctx, /*PIC=*/false); + MCContext Ctx(Triple(TripleName), AsmInfo.get(), MRI.get(), STI.get()); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); DisAsm.reset(TheTarget->createMCDisassembler(*STI, Ctx)); if (!DisAsm) exitWithError("no disassembler for target " + TripleName, FileName); 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 @@ -757,8 +757,7 @@ if (!MAI) ErrorAndExit("Unable to create target asm info!"); - MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), /*MOFI=*/nullptr, - STI.get()); + MCContext Ctx(Triple(TripleName), MAI.get(), MRI.get(), STI.get()); std::unique_ptr Disassembler( TheTarget->createMCDisassembler(*STI, Ctx)); diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp --- a/llvm/tools/sancov/sancov.cpp +++ b/llvm/tools/sancov/sancov.cpp @@ -726,8 +726,7 @@ TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); failIfEmpty(AsmInfo, "no asm info for target " + TripleName); - std::unique_ptr MOFI(new MCObjectFileInfo); - MCContext Ctx(TheTriple, AsmInfo.get(), MRI.get(), MOFI.get(), STI.get()); + MCContext Ctx(TheTriple, AsmInfo.get(), MRI.get(), STI.get()); std::unique_ptr DisAsm( TheTarget->createMCDisassembler(*STI, Ctx)); failIfEmpty(DisAsm, "no disassembler info for target " + TripleName); diff --git a/llvm/unittests/CodeGen/MachineInstrTest.cpp b/llvm/unittests/CodeGen/MachineInstrTest.cpp --- a/llvm/unittests/CodeGen/MachineInstrTest.cpp +++ b/llvm/unittests/CodeGen/MachineInstrTest.cpp @@ -37,7 +37,7 @@ Triple TheTriple(/*ArchStr=*/"", /*VendorStr=*/"", /*OSStr=*/"", /*EnvironmentStr=*/"elf"); return std::make_unique(TheTriple, AsmInfo, nullptr, nullptr, - nullptr, nullptr, nullptr, false); + nullptr, nullptr, false); } // This test makes sure that MachineInstr::isIdenticalTo handles Defs correctly diff --git a/llvm/unittests/CodeGen/MachineOperandTest.cpp b/llvm/unittests/CodeGen/MachineOperandTest.cpp --- a/llvm/unittests/CodeGen/MachineOperandTest.cpp +++ b/llvm/unittests/CodeGen/MachineOperandTest.cpp @@ -319,7 +319,7 @@ TEST(MachineOperandTest, PrintMCSymbol) { MCAsmInfo MAI; Triple T = Triple("unknown-unknown-unknown"); - MCContext Ctx(T, &MAI, /*MRI=*/nullptr, /*MOFI=*/nullptr, /*MSTI=*/nullptr); + MCContext Ctx(T, &MAI, /*MRI=*/nullptr, /*MSTI=*/nullptr); MCSymbol *Sym = Ctx.getOrCreateSymbol("foo"); // Create a MachineOperand with a metadata and print it. diff --git a/llvm/unittests/CodeGen/TestAsmPrinter.cpp b/llvm/unittests/CodeGen/TestAsmPrinter.cpp --- a/llvm/unittests/CodeGen/TestAsmPrinter.cpp +++ b/llvm/unittests/CodeGen/TestAsmPrinter.cpp @@ -57,8 +57,9 @@ Triple TheTriple(TripleName); MC.reset(new MCContext(TheTriple, TM->getMCAsmInfo(), TM->getMCRegisterInfo(), - TM->getObjFileLowering(), TM->getMCSubtargetInfo())); + TM->getMCSubtargetInfo())); TM->getObjFileLowering()->Initialize(*MC, *TM); + MC->setObjectFileInfo(TM->getObjFileLowering()); MS = new StrictMock(MC.get()); diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp --- a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp @@ -464,9 +464,10 @@ return make_error("no target machine for target " + TripleName, inconvertibleErrorCode()); + MC.reset(new MCContext(TheTriple, MAI.get(), MRI.get(), MSTI.get())); TLOF = TM->getObjFileLowering(); - MC.reset(new MCContext(TheTriple, MAI.get(), MRI.get(), TLOF, MSTI.get())); TLOF->Initialize(*MC, *TM); + MC->setObjectFileInfo(TLOF); MCE = TheTarget->createMCCodeEmitter(*MII, *MRI, *MC); if (!MCE) diff --git a/llvm/unittests/MC/DwarfLineTables.cpp b/llvm/unittests/MC/DwarfLineTables.cpp --- a/llvm/unittests/MC/DwarfLineTables.cpp +++ b/llvm/unittests/MC/DwarfLineTables.cpp @@ -41,7 +41,7 @@ MCTargetOptions MCOptions; MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); Ctx = std::make_unique(Triple(TripleName), MAI.get(), MRI.get(), - /*MOFI=*/nullptr, /*MSTI=*/nullptr); + /*MSTI=*/nullptr); } operator bool() { return Ctx.get(); } diff --git a/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp b/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp --- a/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp +++ b/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp @@ -62,6 +62,7 @@ std::unique_ptr MRI; std::unique_ptr MUPMAI; std::unique_ptr MII; + std::unique_ptr MOFI; std::unique_ptr Str; std::unique_ptr Parser; std::unique_ptr Ctx; @@ -74,7 +75,6 @@ const Target *TheTarget; const MCTargetOptions MCOptions; - MCObjectFileInfo MOFI; SystemZAsmLexerTest() { // We will use the SystemZ triple, because of missing @@ -112,9 +112,11 @@ SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc()); EXPECT_EQ(Buffer, nullptr); - Ctx.reset(new MCContext(Triple, MUPMAI.get(), MRI.get(), &MOFI, STI.get(), - &SrcMgr, &MCOptions)); - MOFI.initMCObjectFileInfo(*Ctx, /*PIC=*/false, /*LargeCodeModel=*/false); + Ctx.reset(new MCContext(Triple, MUPMAI.get(), MRI.get(), STI.get(), &SrcMgr, + &MCOptions)); + MOFI.reset(TheTarget->createMCObjectFileInfo(*Ctx, /*PIC=*/false, + /*LargeCodeModel=*/false)); + Ctx->setObjectFileInfo(MOFI.get()); Str.reset(TheTarget->createNullStreamer(*Ctx)); diff --git a/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp b/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp --- a/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp +++ b/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp @@ -168,9 +168,10 @@ target->createMCAsmInfo(*mri, this->triple, mcOptions)); mai->setRelaxELFRelocations(true); - llvm::MCObjectFileInfo mofi; - llvm::MCContext ctx(triple, mai.get(), mri.get(), &mofi, &srcMgr, &mcOptions); - mofi.initMCObjectFileInfo(ctx, /*PIC=*/false, /*LargeCodeModel=*/false); + llvm::MCContext ctx(triple, mai.get(), mri.get(), &srcMgr, &mcOptions); + std::unique_ptr mofi(target->createMCObjectFileInfo( + ctx, /*PIC=*/false, /*LargeCodeModel=*/false)); + ctx.setObjectFileInfo(mofi.get()); SmallString<128> cwd; if (!llvm::sys::fs::current_path(cwd))