Index: ELF/Driver.h =================================================================== --- ELF/Driver.h +++ ELF/Driver.h @@ -27,6 +27,7 @@ void main(ArrayRef Args); void addFile(StringRef Path); void addLibrary(StringRef Name); + llvm::LLVMContext Context; private: std::vector getArchiveMembers(MemoryBufferRef MB); Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -262,6 +262,12 @@ initLLVM(Args); readConfigs(Args); + // This is a flag to discard all but GlobalValue names. + // We want to enable it by default because it saves memory. + // Disable it only when a developer option (-save-temps) is given. + Context.setDiscardValueNames(!Config->SaveTemps); + Context.enableDebugTypeODRUniquing(); + if (!Config->Reproduce.empty()) logCommandline(ArgsArr); Index: ELF/InputFiles.h =================================================================== --- ELF/InputFiles.h +++ ELF/InputFiles.h @@ -22,6 +22,7 @@ #include "llvm/Object/Archive.h" #include "llvm/Object/ELF.h" #include "llvm/Object/IRObjectFile.h" +#include "llvm/Object/IRObjectFile.h" #include "llvm/Support/StringSaver.h" #include @@ -224,6 +225,7 @@ void parse(llvm::DenseSet &ComdatGroups); ArrayRef getSymbols() { return SymbolBodies; } static bool shouldSkip(const llvm::object::BasicSymbolRef &Sym); + std::unique_ptr Obj; private: std::vector SymbolBodies; Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "InputFiles.h" +#include "Driver.h" #include "Error.h" #include "InputSection.h" #include "Symbols.h" @@ -15,7 +16,6 @@ #include "llvm/CodeGen/Analysis.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" -#include "llvm/Object/IRObjectFile.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -594,8 +594,7 @@ } void BitcodeFile::parse(DenseSet &ComdatGroups) { - LLVMContext Context; - std::unique_ptr Obj = check(IRObjectFile::create(MB, Context)); + Obj = check(IRObjectFile::create(MB, Driver->Context)); const Module &M = Obj->getModule(); DenseSet KeptComdats; Index: ELF/LTO.h =================================================================== --- ELF/LTO.h +++ ELF/LTO.h @@ -24,7 +24,6 @@ #include "lld/Core/LLVM.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringSet.h" -#include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Linker/IRMover.h" @@ -44,7 +43,6 @@ std::vector> runSplitCodegen( const std::function()> &TMFactory); - llvm::LLVMContext Context; std::unique_ptr Combined; llvm::IRMover Mover; std::vector> OwningData; Index: ELF/LTO.cpp =================================================================== --- ELF/LTO.cpp +++ ELF/LTO.cpp @@ -9,6 +9,7 @@ #include "LTO.h" #include "Config.h" +#include "Driver.h" #include "Error.h" #include "InputFiles.h" #include "Symbols.h" @@ -86,18 +87,11 @@ } BitcodeCompiler::BitcodeCompiler() - : Combined(new llvm::Module("ld-temp.o", Context)), Mover(*Combined) { - // This is a flag to discard all but GlobalValue names. - // We want to enable it by default because it saves memory. - // Disable it only when a developer option (-save-temps) is given. - Context.setDiscardValueNames(!Config->SaveTemps); - - Context.enableDebugTypeODRUniquing(); -} + : Combined(new llvm::Module("ld-temp.o", Driver->Context)), + Mover(*Combined) {} void BitcodeCompiler::add(BitcodeFile &F) { - std::unique_ptr Obj = - check(IRObjectFile::create(F.MB, Context)); + std::unique_ptr Obj = std::move(F.Obj); std::vector Keep; unsigned BodyIndex = 0; ArrayRef Bodies = F.getSymbols();