diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/LTO/LTO.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 132 |
2 files changed, 52 insertions, 85 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 1accbf40b96..99318c19a89 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -420,11 +420,6 @@ StringRef InputFile::getName() const { return Mods[0].getModuleIdentifier(); } -BitcodeModule &InputFile::getSingleBitcodeModule() { - assert(Mods.size() == 1 && "Expect only one bitcode module"); - return Mods[0]; -} - LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel, Config &Conf) : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel), diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp index 0423db85b81..d4ee66a53e0 100644 --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -135,13 +135,14 @@ static void computePrevailingCopies( } } -static StringMap<lto::InputFile *> -generateModuleMap(std::vector<std::unique_ptr<lto::InputFile>> &Modules) { - StringMap<lto::InputFile *> ModuleMap; - for (auto &M : Modules) { - assert(ModuleMap.find(M->getName()) == ModuleMap.end() && +static StringMap<MemoryBufferRef> +generateModuleMap(const std::vector<ThinLTOBuffer> &Modules) { + StringMap<MemoryBufferRef> ModuleMap; + for (auto &ModuleBuffer : Modules) { + assert(ModuleMap.find(ModuleBuffer.getBufferIdentifier()) == + ModuleMap.end() && "Expect unique Buffer Identifier"); - ModuleMap[M->getName()] = M.get(); + ModuleMap[ModuleBuffer.getBufferIdentifier()] = ModuleBuffer.getMemBuffer(); } return ModuleMap; } @@ -174,19 +175,18 @@ static void verifyLoadedModule(Module &TheModule) { } } -static std::unique_ptr<Module> loadModuleFromInput(lto::InputFile *Input, - LLVMContext &Context, - bool Lazy, - bool IsImporting) { - auto &Mod = Input->getSingleBitcodeModule(); +static std::unique_ptr<Module> +loadModuleFromBuffer(const MemoryBufferRef &Buffer, LLVMContext &Context, + bool Lazy, bool IsImporting) { SMDiagnostic Err; Expected<std::unique_ptr<Module>> ModuleOrErr = - Lazy ? Mod.getLazyModule(Context, - /* ShouldLazyLoadMetadata */ true, IsImporting) - : Mod.parseModule(Context); + Lazy + ? getLazyBitcodeModule(Buffer, Context, + /* ShouldLazyLoadMetadata */ true, IsImporting) + : parseBitcodeFile(Buffer, Context); if (!ModuleOrErr) { handleAllErrors(ModuleOrErr.takeError(), [&](ErrorInfoBase &EIB) { - SMDiagnostic Err = SMDiagnostic(Mod.getModuleIdentifier(), + SMDiagnostic Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error, EIB.message()); Err.print("ThinLTO", errs()); }); @@ -194,17 +194,16 @@ static std::unique_ptr<Module> loadModuleFromInput(lto::InputFile *Input, } if (!Lazy) verifyLoadedModule(*ModuleOrErr.get()); - return std::move(*ModuleOrErr); + return std::move(ModuleOrErr.get()); } static void crossImportIntoModule(Module &TheModule, const ModuleSummaryIndex &Index, - StringMap<lto::InputFile*> &ModuleMap, + StringMap<MemoryBufferRef> &ModuleMap, const FunctionImporter::ImportMapTy &ImportList) { auto Loader = [&](StringRef Identifier) { - auto &Input = ModuleMap[Identifier]; - return loadModuleFromInput(Input, TheModule.getContext(), - /*Lazy=*/true, /*IsImporting*/ true); + return loadModuleFromBuffer(ModuleMap[Identifier], TheModule.getContext(), + /*Lazy=*/true, /*IsImporting*/ true); }; FunctionImporter Importer(Index, Loader); @@ -249,15 +248,6 @@ static void optimizeModule(Module &TheModule, TargetMachine &TM, PM.run(TheModule); } -static void -addUsedSymbolToPreservedGUID(const lto::InputFile &File, - DenseSet<GlobalValue::GUID> &PreservedGUID) { - for (const auto &Sym : File.symbols()) { - if (Sym.isUsed()) - PreservedGUID.insert(GlobalValue::getGUID(Sym.getIRName())); - } -} - // Convert the PreservedSymbols map from "Name" based to "GUID" based. static DenseSet<GlobalValue::GUID> computeGUIDPreservedSymbols(const StringSet<> &PreservedSymbols, @@ -391,7 +381,7 @@ public: static std::unique_ptr<MemoryBuffer> ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index, - StringMap<lto::InputFile *> &ModuleMap, TargetMachine &TM, + StringMap<MemoryBufferRef> &ModuleMap, TargetMachine &TM, const FunctionImporter::ImportMapTy &ImportList, const FunctionImporter::ExportSetTy &ExportList, const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols, @@ -498,13 +488,15 @@ static void initTMBuilder(TargetMachineBuilder &TMBuilder, } // end anonymous namespace void ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) { - MemoryBufferRef Buffer(Data, Identifier); + ThinLTOBuffer Buffer(Data, Identifier); + LLVMContext Context; + StringRef TripleStr; + ErrorOr<std::string> TripleOrErr = expectedToErrorOrAndEmitErrors( + Context, getBitcodeTargetTriple(Buffer.getMemBuffer())); - auto InputOrError = lto::InputFile::create(Buffer); - if (!InputOrError) - report_fatal_error("ThinLTO cannot create input file"); + if (TripleOrErr) + TripleStr = *TripleOrErr; - auto TripleStr = (*InputOrError)->getTargetTriple(); Triple TheTriple(TripleStr); if (Modules.empty()) @@ -516,7 +508,7 @@ void ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) { initTMBuilder(TMBuilder, Triple(TMBuilder.TheTriple.merge(TheTriple))); } - Modules.emplace_back(std::move(*InputOrError)); + Modules.push_back(Buffer); } void ThinLTOCodeGenerator::preserveSymbol(StringRef Name) { @@ -557,10 +549,9 @@ std::unique_ptr<ModuleSummaryIndex> ThinLTOCodeGenerator::linkCombinedIndex() { std::unique_ptr<ModuleSummaryIndex> CombinedIndex = llvm::make_unique<ModuleSummaryIndex>(/*HaveGVs=*/false); uint64_t NextModuleId = 0; - for (auto &Mod : Modules) { - auto &M = Mod->getSingleBitcodeModule(); - if (Error Err = - M.readSummary(*CombinedIndex, Mod->getName(), NextModuleId++)) { + for (auto &ModuleBuffer : Modules) { + if (Error Err = readModuleSummaryIndex(ModuleBuffer.getMemBuffer(), + *CombinedIndex, NextModuleId++)) { // FIXME diagnose logAllUnhandledErrors( std::move(Err), errs(), @@ -602,8 +593,8 @@ static void computeDeadSymbolsInIndex( * Perform promotion and renaming of exported internal functions. * Index is updated to reflect linkage changes from weak resolution. */ -void ThinLTOCodeGenerator::promote(Module &TheModule, ModuleSummaryIndex &Index, - const lto::InputFile &File) { +void ThinLTOCodeGenerator::promote(Module &TheModule, + ModuleSummaryIndex &Index) { auto ModuleCount = Index.modulePaths().size(); auto ModuleIdentifier = TheModule.getModuleIdentifier(); @@ -615,9 +606,6 @@ void ThinLTOCodeGenerator::promote(Module &TheModule, ModuleSummaryIndex &Index, auto GUIDPreservedSymbols = computeGUIDPreservedSymbols( PreservedSymbols, Triple(TheModule.getTargetTriple())); - // Add used symbol to the preserved symbols. - addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols); - // Compute "dead" symbols, we don't want to import/export these! computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols); @@ -631,22 +619,21 @@ void ThinLTOCodeGenerator::promote(Module &TheModule, ModuleSummaryIndex &Index, StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR; resolvePrevailingInIndex(Index, ResolvedODR); + thinLTOResolvePrevailingInModule( + TheModule, ModuleToDefinedGVSummaries[ModuleIdentifier]); + // Promote the exported values in the index, so that they are promoted // in the module. internalizeAndPromoteInIndex(ExportLists, GUIDPreservedSymbols, Index); promoteModule(TheModule, Index); - - thinLTOResolvePrevailingInModule( - TheModule, ModuleToDefinedGVSummaries[ModuleIdentifier]); } /** * Perform cross-module importing for the module identified by ModuleIdentifier. */ void ThinLTOCodeGenerator::crossModuleImport(Module &TheModule, - ModuleSummaryIndex &Index, - const lto::InputFile &File) { + ModuleSummaryIndex &Index) { auto ModuleMap = generateModuleMap(Modules); auto ModuleCount = Index.modulePaths().size(); @@ -658,8 +645,6 @@ void ThinLTOCodeGenerator::crossModuleImport(Module &TheModule, auto GUIDPreservedSymbols = computeGUIDPreservedSymbols( PreservedSymbols, Triple(TheModule.getTargetTriple())); - addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols); - // Compute "dead" symbols, we don't want to import/export these! computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols); @@ -678,8 +663,7 @@ void ThinLTOCodeGenerator::crossModuleImport(Module &TheModule, */ void ThinLTOCodeGenerator::gatherImportedSummariesForModule( Module &TheModule, ModuleSummaryIndex &Index, - std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex, - const lto::InputFile &File) { + std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex) { auto ModuleCount = Index.modulePaths().size(); auto ModuleIdentifier = TheModule.getModuleIdentifier(); @@ -691,8 +675,6 @@ void ThinLTOCodeGenerator::gatherImportedSummariesForModule( auto GUIDPreservedSymbols = computeGUIDPreservedSymbols( PreservedSymbols, Triple(TheModule.getTargetTriple())); - addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols); - // Compute "dead" symbols, we don't want to import/export these! computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols); @@ -711,8 +693,7 @@ void ThinLTOCodeGenerator::gatherImportedSummariesForModule( * Emit the list of files needed for importing into module. */ void ThinLTOCodeGenerator::emitImports(Module &TheModule, StringRef OutputName, - ModuleSummaryIndex &Index, - const lto::InputFile &File) { + ModuleSummaryIndex &Index) { auto ModuleCount = Index.modulePaths().size(); auto ModuleIdentifier = TheModule.getModuleIdentifier(); @@ -724,8 +705,6 @@ void ThinLTOCodeGenerator::emitImports(Module &TheModule, StringRef OutputName, auto GUIDPreservedSymbols = computeGUIDPreservedSymbols( PreservedSymbols, Triple(TheModule.getTargetTriple())); - addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols); - // Compute "dead" symbols, we don't want to import/export these! computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols); @@ -751,8 +730,7 @@ void ThinLTOCodeGenerator::emitImports(Module &TheModule, StringRef OutputName, * Perform internalization. Index is updated to reflect linkage changes. */ void ThinLTOCodeGenerator::internalize(Module &TheModule, - ModuleSummaryIndex &Index, - const lto::InputFile &File) { + ModuleSummaryIndex &Index) { initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple())); auto ModuleCount = Index.modulePaths().size(); auto ModuleIdentifier = TheModule.getModuleIdentifier(); @@ -761,8 +739,6 @@ void ThinLTOCodeGenerator::internalize(Module &TheModule, auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple); - addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols); - // Collect for each module the list of function it defines (GUID -> Summary). StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); @@ -854,14 +830,15 @@ void ThinLTOCodeGenerator::run() { // Perform only parallel codegen and return. ThreadPool Pool; int count = 0; - for (auto &Mod : Modules) { + for (auto &ModuleBuffer : Modules) { Pool.async([&](int count) { LLVMContext Context; Context.setDiscardValueNames(LTODiscardValueNames); // Parse module now - auto TheModule = loadModuleFromInput(Mod.get(), Context, false, - /*IsImporting*/ false); + auto TheModule = + loadModuleFromBuffer(ModuleBuffer.getMemBuffer(), Context, false, + /*IsImporting*/ false); // CodeGen auto OutputBuffer = codegenModule(*TheModule, *TMBuilder.create()); @@ -904,10 +881,6 @@ void ThinLTOCodeGenerator::run() { auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple); - // Add used symbol from inputs to the preserved symbols. - for (const auto &M : Modules) - addUsedSymbolToPreservedGUID(*M, GUIDPreservedSymbols); - // Compute "dead" symbols, we don't want to import/export these! computeDeadSymbolsInIndex(*Index, GUIDPreservedSymbols); @@ -940,7 +913,7 @@ void ThinLTOCodeGenerator::run() { // GVSummary and ResolvedODR maps to enable threaded access to these maps // below. for (auto &Module : Modules) { - auto ModuleIdentifier = Module->getName(); + auto ModuleIdentifier = Module.getBufferIdentifier(); ExportLists[ModuleIdentifier]; ImportLists[ModuleIdentifier]; ResolvedODR[ModuleIdentifier]; @@ -954,10 +927,8 @@ void ThinLTOCodeGenerator::run() { ModulesOrdering.resize(Modules.size()); std::iota(ModulesOrdering.begin(), ModulesOrdering.end(), 0); llvm::sort(ModulesOrdering, [&](int LeftIndex, int RightIndex) { - auto LSize = - Modules[LeftIndex]->getSingleBitcodeModule().getBuffer().size(); - auto RSize = - Modules[RightIndex]->getSingleBitcodeModule().getBuffer().size(); + auto LSize = Modules[LeftIndex].getBuffer().size(); + auto RSize = Modules[RightIndex].getBuffer().size(); return LSize > RSize; }); @@ -965,9 +936,9 @@ void ThinLTOCodeGenerator::run() { { ThreadPool Pool(ThreadCount); for (auto IndexCount : ModulesOrdering) { - auto &Mod = Modules[IndexCount]; + auto &ModuleBuffer = Modules[IndexCount]; Pool.async([&](int count) { - auto ModuleIdentifier = Mod->getName(); + auto ModuleIdentifier = ModuleBuffer.getBufferIdentifier(); auto &ExportList = ExportLists[ModuleIdentifier]; auto &DefinedGVSummaries = ModuleToDefinedGVSummaries[ModuleIdentifier]; @@ -1011,8 +982,9 @@ void ThinLTOCodeGenerator::run() { } // Parse module now - auto TheModule = loadModuleFromInput(Mod.get(), Context, false, - /*IsImporting*/ false); + auto TheModule = + loadModuleFromBuffer(ModuleBuffer.getMemBuffer(), Context, false, + /*IsImporting*/ false); // Save temps: original file. saveTempBitcode(*TheModule, SaveTempsDir, count, ".0.original.bc"); |

