[llvm] r290964 - [ThinLTO] Rework llvm-link to use the FunctionImporter
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 4 06:27:31 PST 2017
Author: tejohnson
Date: Wed Jan 4 08:27:31 2017
New Revision: 290964
URL: http://llvm.org/viewvc/llvm-project?rev=290964&view=rev
Log:
[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
Modified:
llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll
llvm/trunk/tools/llvm-link/CMakeLists.txt
llvm/trunk/tools/llvm-link/LLVMBuild.txt
llvm/trunk/tools/llvm-link/llvm-link.cpp
Modified: llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll?rev=290964&r1=290963&r2=290964&view=diff
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll (original)
+++ llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll Wed Jan 4 08:27:31 2017
@@ -3,7 +3,7 @@
; The imported module has out-of-date debug information, let's make sure we can
; drop them without crashing when materializing later.
-; RUN: llvm-lto -thinlto-action=import %t.bc -thinlto-index=%t.index.bc -o - | llvm-dis -o - | FileCheck %s
+; RUN: llvm-link %t.bc -summary-index=%t.index.bc -import=globalfunc:%p/Inputs/drop-debug-info.bc | llvm-dis -o - | FileCheck %s
; CHECK: define available_externally void @globalfunc
; CHECK-NOT: llvm.dbg.value
@@ -17,4 +17,4 @@ entry:
ret i32 0
}
-declare void @globalfunc(...)
\ No newline at end of file
+declare void @globalfunc(...)
Modified: llvm/trunk/tools/llvm-link/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/CMakeLists.txt?rev=290964&r1=290963&r2=290964&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-link/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-link/CMakeLists.txt Wed Jan 4 08:27:31 2017
@@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS
Object
Support
TransformUtils
+ IPO
)
add_llvm_tool(llvm-link
Modified: llvm/trunk/tools/llvm-link/LLVMBuild.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/LLVMBuild.txt?rev=290964&r1=290963&r2=290964&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-link/LLVMBuild.txt (original)
+++ llvm/trunk/tools/llvm-link/LLVMBuild.txt Wed Jan 4 08:27:31 2017
@@ -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
Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=290964&r1=290963&r2=290964&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-link/llvm-link.cpp (original)
+++ llvm/trunk/tools/llvm-link/llvm-link.cpp Wed Jan 4 08:27:31 2017
@@ -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 Diag
}
/// 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 *
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;
More information about the llvm-commits
mailing list