summaryrefslogtreecommitdiff
path: root/tools/llvm-link
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2017-01-04 14:27:31 +0000
committerTeresa Johnson <tejohnson@google.com>2017-01-04 14:27:31 +0000
commit621de7b4c7ebba84f6834a0ac3d3f60a97974a0f (patch)
tree4dc2e0c6ad782baae742ad01f1bda5b25e99f372 /tools/llvm-link
parent83cba7a17fcfcc6c507b4982eaee0dccfc5c5954 (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.txt1
-rw-r--r--tools/llvm-link/LLVMBuild.txt2
-rw-r--r--tools/llvm-link/llvm-link.cpp51
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;