diff options
Diffstat (limited to 'tools/llvm-link/llvm-link.cpp')
-rw-r--r-- | tools/llvm-link/llvm-link.cpp | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp index 43431ac3398..e89696e7e7c 100644 --- a/tools/llvm-link/llvm-link.cpp +++ b/tools/llvm-link/llvm-link.cpp @@ -33,6 +33,7 @@ #include "llvm/Support/SourceMgr.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Transforms/IPO/FunctionImport.h" #include "llvm/Transforms/Utils/FunctionImportUtils.h" #include <memory> @@ -202,19 +203,20 @@ static void diagnosticHandler(const DiagnosticInfo &DI, void *C) { } /// Import any functions requested via the -import option. -static bool importFunctions(const char *argv0, LLVMContext &Context, - Linker &L) { +static bool importFunctions(const char *argv0, Module &DestModule) { if (SummaryIndex.empty()) return true; std::unique_ptr<ModuleSummaryIndex> Index = ExitOnErr(llvm::getModuleSummaryIndexForFile(SummaryIndex)); // Map of Module -> List of globals to import from the Module - std::map<StringRef, DenseSet<const GlobalValue *>> ModuleToGlobalsToImportMap; - auto ModuleLoader = [&Context](const char *argv0, - const std::string &Identifier) { - return loadFile(argv0, Identifier, Context, false); + FunctionImporter::ImportMapTy ImportList; + + auto ModuleLoader = [&DestModule](const char *argv0, + const std::string &Identifier) { + return loadFile(argv0, Identifier, DestModule.getContext(), false); }; + ModuleLazyLoaderCache ModuleLoaderCache(ModuleLoader); for (const auto &Import : Imports) { // Identify the requested function and its bitcode source file. @@ -253,35 +255,14 @@ static bool importFunctions(const char *argv0, LLVMContext &Context, if (Verbose) errs() << "Importing " << FunctionName << " from " << FileName << "\n"; - auto &Entry = ModuleToGlobalsToImportMap[SrcModule.getModuleIdentifier()]; - Entry.insert(F); - - ExitOnErr(F->materialize()); - } - - // Do the actual import of globals now, one Module at a time - for (auto &GlobalsToImportPerModule : ModuleToGlobalsToImportMap) { - // Get the module for the import - auto &GlobalsToImport = GlobalsToImportPerModule.second; - std::unique_ptr<Module> SrcModule = - ModuleLoaderCache.takeModule(GlobalsToImportPerModule.first); - assert(&Context == &SrcModule->getContext() && "Context mismatch"); - - // If modules were created with lazy metadata loading, materialize it - // now, before linking it (otherwise this will be a noop). - ExitOnErr(SrcModule->materializeMetadata()); - UpgradeDebugInfo(*SrcModule); - - // Linkage Promotion and renaming - if (renameModuleForThinLTO(*SrcModule, *Index, &GlobalsToImport)) - return true; - - // Instruct the linker to not automatically import linkonce defintion. - unsigned Flags = Linker::Flags::DontForceLinkLinkonceODR; - - if (L.linkInModule(std::move(SrcModule), Flags, &GlobalsToImport)) - return false; + auto &Entry = ImportList[FileName]; + Entry.insert(std::make_pair(F->getGUID(), /* (Unused) threshold */ 1.0)); } + auto CachedModuleLoader = [&](StringRef Identifier) { + return ModuleLoaderCache.takeModule(Identifier); + }; + FunctionImporter Importer(*Index, CachedModuleLoader); + ExitOnErr(Importer.importFunctions(DestModule, ImportList)); return true; } @@ -374,7 +355,7 @@ int main(int argc, char **argv) { return 1; // Import any functions requested via -import - if (!importFunctions(argv[0], Context, L)) + if (!importFunctions(argv[0], *Composite)) return 1; if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite; |