From a06bb017cf114e17ce0260d4eef6e4ed49de568d Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 3 Feb 2017 17:01:14 +0000 Subject: [PATCH] IRMover: Merge flags LinkModuleInlineAsm and IsPerformingImport. Currently these flags are always the inverse of each other, so there is no need to keep them separate. Differential Revision: https://reviews.llvm.org/D29471 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294016 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Linker/IRMover.h | 6 +----- lib/LTO/LTO.cpp | 1 - lib/Linker/IRMover.cpp | 21 +++++++++++---------- lib/Linker/LinkModules.cpp | 1 - lib/Transforms/IPO/FunctionImport.cpp | 2 +- 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/include/llvm/Linker/IRMover.h b/include/llvm/Linker/IRMover.h index 2a187cbc42f..235ada47cef 100644 --- a/include/llvm/Linker/IRMover.h +++ b/include/llvm/Linker/IRMover.h @@ -71,15 +71,11 @@ public: /// not present in ValuesToLink. The GlobalValue and a ValueAdder callback /// are passed as an argument, and the callback is expected to be called /// if the GlobalValue needs to be added to the \p ValuesToLink and linked. - /// - \p LinkModuleInlineAsm is true if the ModuleInlineAsm string in Src - /// should be linked with (concatenated into) the ModuleInlineAsm string - /// for the destination module. It should be true for full LTO, but not - /// when importing for ThinLTO, otherwise we can have duplicate symbols. /// - \p IsPerformingImport is true when this IR link is to perform ThinLTO /// function importing from Src. Error move(std::unique_ptr Src, ArrayRef ValuesToLink, std::function AddLazyFor, - bool LinkModuleInlineAsm, bool IsPerformingImport); + bool IsPerformingImport); Module &getModule() { return Composite; } private: diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index bf30fec5d20..9a9240f64c1 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -540,7 +540,6 @@ Error LTO::addRegularLTO(BitcodeModule BM, const SymbolResolution *&ResI, return RegularLTO.Mover->move(std::move(*MOrErr), Keep, [](GlobalValue &, IRMover::ValueAdder) {}, - /* LinkModuleInlineAsm */ true, /* IsPerformingImport */ false); } diff --git a/lib/Linker/IRMover.cpp b/lib/Linker/IRMover.cpp index 468d86d6e0d..15a46a2d042 100644 --- a/lib/Linker/IRMover.cpp +++ b/lib/Linker/IRMover.cpp @@ -395,11 +395,12 @@ class IRLinker { Worklist.push_back(GV); } - /// Flag whether the ModuleInlineAsm string in Src should be linked with - /// (concatenated into) the ModuleInlineAsm string for the destination - /// module. It should be true for full LTO, but not when importing for - /// ThinLTO, otherwise we can have duplicate symbols. - bool LinkModuleInlineAsm; + /// Whether we are importing globals for ThinLTO, as opposed to linking the + /// source module. If this flag is set, it means that we can rely on some + /// other object file to define any non-GlobalValue entities defined by the + /// source module. This currently causes us to not link retained types in + /// debug info metadata and module inline asm. + bool IsPerformingImport; /// Set to true when all global value body linking is complete (including /// lazy linking). Used to prevent metadata linking from creating new @@ -491,10 +492,10 @@ public: IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr SrcM, ArrayRef ValuesToLink, std::function AddLazyFor, - bool LinkModuleInlineAsm, bool IsPerformingImport) + bool IsPerformingImport) : DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(std::move(AddLazyFor)), TypeMap(Set), GValMaterializer(*this), LValMaterializer(*this), - SharedMDs(SharedMDs), LinkModuleInlineAsm(LinkModuleInlineAsm), + SharedMDs(SharedMDs), IsPerformingImport(IsPerformingImport), Mapper(ValueMap, RF_MoveDistinctMDs | RF_IgnoreMissingLocals, &TypeMap, &GValMaterializer), AliasMCID(Mapper.registerAlternateMappingContext(AliasValueMap, @@ -1294,7 +1295,7 @@ Error IRLinker::run() { DstM.setTargetTriple(mergeTriples(SrcTriple, DstTriple)); // Append the module inline asm string. - if (LinkModuleInlineAsm && !SrcM->getModuleInlineAsm().empty()) { + if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) { if (DstM.getModuleInlineAsm().empty()) DstM.setModuleInlineAsm(SrcM->getModuleInlineAsm()); else @@ -1433,10 +1434,10 @@ IRMover::IRMover(Module &M) : Composite(M) { Error IRMover::move( std::unique_ptr Src, ArrayRef ValuesToLink, std::function AddLazyFor, - bool LinkModuleInlineAsm, bool IsPerformingImport) { + bool IsPerformingImport) { IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes, std::move(Src), ValuesToLink, std::move(AddLazyFor), - LinkModuleInlineAsm, IsPerformingImport); + IsPerformingImport); Error E = TheIRLinker.run(); Composite.dropTriviallyDeadConstantArrays(); return E; diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 50936fa55f7..f11fd54f4af 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -538,7 +538,6 @@ bool ModuleLinker::run() { [this](GlobalValue &GV, IRMover::ValueAdder Add) { addLazyFor(GV, Add); }, - /* LinkModuleInlineAsm */ true, /* IsPerformingImport */ false)) { handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); diff --git a/lib/Transforms/IPO/FunctionImport.cpp b/lib/Transforms/IPO/FunctionImport.cpp index 6f01a2c4b9b..76cfbf81bd1 100644 --- a/lib/Transforms/IPO/FunctionImport.cpp +++ b/lib/Transforms/IPO/FunctionImport.cpp @@ -774,7 +774,7 @@ Expected FunctionImporter::importFunctions( if (Mover.move(std::move(SrcModule), GlobalsToImport.getArrayRef(), [](GlobalValue &, IRMover::ValueAdder) {}, - /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/true)) + /*IsPerformingImport=*/true)) report_fatal_error("Function Import: link error"); ImportedCount += GlobalsToImport.size(); -- 2.50.1