diff options
author | Teresa Johnson <tejohnson@google.com> | 2017-01-04 14:27:31 +0000 |
---|---|---|
committer | Teresa Johnson <tejohnson@google.com> | 2017-01-04 14:27:31 +0000 |
commit | 621de7b4c7ebba84f6834a0ac3d3f60a97974a0f (patch) | |
tree | 4dc2e0c6ad782baae742ad01f1bda5b25e99f372 /tools/llvm-link | |
parent | 83cba7a17fcfcc6c507b4982eaee0dccfc5c5954 (diff) |
[ThinLTO] Rework llvm-link to use the FunctionImporter
Summary:
Change llvm-link to use the FunctionImporter handling, instead of
manually invoking the Linker. We still need to load the module
in llvm-link to do the desired testing for invalid import requests
(weak functions), and to get the GUID (in case the function is local).
Also change the drop-debug-info test to use llvm-link so that importing
is forced (in order to test debug info handling) and independent of
import logic changes.
Reviewers: mehdi_amini
Subscribers: mgorny, llvm-commits, aprantl
Differential Revision: https://reviews.llvm.org/D28277
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290964 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-link')
-rw-r--r-- | tools/llvm-link/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tools/llvm-link/LLVMBuild.txt | 2 | ||||
-rw-r--r-- | tools/llvm-link/llvm-link.cpp | 51 |
3 files changed, 18 insertions, 36 deletions
diff --git a/tools/llvm-link/CMakeLists.txt b/tools/llvm-link/CMakeLists.txt index 5aae69b4ca0..73177922324 100644 --- a/tools/llvm-link/CMakeLists.txt +++ b/tools/llvm-link/CMakeLists.txt @@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS Object Support TransformUtils + IPO ) add_llvm_tool(llvm-link diff --git a/tools/llvm-link/LLVMBuild.txt b/tools/llvm-link/LLVMBuild.txt index 1dba5c0adb3..c7476043164 100644 --- a/tools/llvm-link/LLVMBuild.txt +++ b/tools/llvm-link/LLVMBuild.txt @@ -19,4 +19,4 @@ type = Tool name = llvm-link parent = Tools -required_libraries = AsmParser BitReader BitWriter IRReader Linker Object TransformUtils +required_libraries = AsmParser BitReader BitWriter IRReader Linker Object TransformUtils IPO 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; |