From: Mehdi Amini Date: Tue, 26 Apr 2016 10:35:01 +0000 (+0000) Subject: ThinLTOCodeGenerator: preserve linkonce when in "MustPreserved" set X-Git-Tag: android-x86-7.1-r4~34543 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e1abe9da1be37a81567540757fd5f755897edb3e;p=android-x86%2Fexternal-llvm.git ThinLTOCodeGenerator: preserve linkonce when in "MustPreserved" set If the linker specifically requested for a linkonce to be preserved, we need to make sure we won't drop it even if all the uses in the current module disappear. From: Mehdi Amini git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267543 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/LTO/ThinLTOCodeGenerator.cpp b/lib/LTO/ThinLTOCodeGenerator.cpp index 51dcc084b49..f4430081dd9 100644 --- a/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/lib/LTO/ThinLTOCodeGenerator.cpp @@ -137,6 +137,7 @@ bool IsFirstDefinitionForLinker(const GlobalValueSummaryList &GVSummaryList, static GlobalValue::LinkageTypes ResolveODR(const ModuleSummaryIndex &Index, const FunctionImporter::ExportSetTy &ExportList, + const DenseSet &GUIDPreservedSymbols, StringRef ModuleIdentifier, GlobalValue::GUID GUID, const GlobalValueSummary &GV) { auto HasMultipleCopies = [&](const GlobalValueSummaryList &GVSummaryList) { @@ -163,7 +164,7 @@ ResolveODR(const ModuleSummaryIndex &Index, if (!HasMultipleCopies(GVSummaryList)) { // Exported LinkonceODR needs to be promoted to not be discarded if (GlobalValue::isDiscardableIfUnused(OriginalLinkage) && - ExportList.count(GUID)) + (ExportList.count(GUID) || GUIDPreservedSymbols.count(GUID))) return GlobalValue::WeakODRLinkage; break; } @@ -187,6 +188,7 @@ ResolveODR(const ModuleSummaryIndex &Index, static void ResolveODR( const ModuleSummaryIndex &Index, const FunctionImporter::ExportSetTy &ExportList, + const DenseSet &GUIDPreservedSymbols, const GVSummaryMapTy &DefinedGlobals, StringRef ModuleIdentifier, std::map &ResolvedODR) { if (Index.modulePaths().size() == 1) @@ -206,7 +208,7 @@ static void ResolveODR( if (GlobalInvolvedWithAlias.count(GV.second)) continue; auto NewLinkage = - ResolveODR(Index, ExportList, ModuleIdentifier, GV.first, *GV.second); + ResolveODR(Index, ExportList, GUIDPreservedSymbols, ModuleIdentifier, GV.first, *GV.second); if (NewLinkage != GV.second->linkage()) { ResolvedODR[GV.first] = NewLinkage; } @@ -681,13 +683,17 @@ void ThinLTOCodeGenerator::promote(Module &TheModule, ExportLists); auto &ExportList = ExportLists[ModuleIdentifier]; + // Convert the preserved symbols set from string to GUID + auto GUIDPreservedSymbols = + computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple); + // Resolve the LinkOnceODR, trying to turn them into "available_externally" // where possible. // This is a compile-time optimization. // We use a std::map here to be able to have a defined ordering when // producing a hash for the cache entry. std::map ResolvedODR; - ResolveODR(Index, ExportList, ModuleToDefinedGVSummaries[ModuleIdentifier], + ResolveODR(Index, ExportList, GUIDPreservedSymbols, ModuleToDefinedGVSummaries[ModuleIdentifier], ModuleIdentifier, ResolvedODR); fixupODR(TheModule, ResolvedODR); @@ -841,7 +847,7 @@ void ThinLTOCodeGenerator::run() { // We use a std::map here to be able to have a defined ordering when // producing a hash for the cache entry. std::map ResolvedODR; - ResolveODR(*Index, ExportList, DefinedFunctions, ModuleIdentifier, + ResolveODR(*Index, ExportList, GUIDPreservedSymbols, DefinedFunctions, ModuleIdentifier, ResolvedODR); // The module may be cached, this helps handling it. diff --git a/test/ThinLTO/X86/odr_resolution.ll b/test/ThinLTO/X86/odr_resolution.ll index 4292dfcba03..a2e0997b4b6 100644 --- a/test/ThinLTO/X86/odr_resolution.ll +++ b/test/ThinLTO/X86/odr_resolution.ll @@ -6,6 +6,8 @@ ; Verify that only one ODR is selected across modules, but non ODR are not affected. ; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=MOD1 ; RUN: llvm-lto -thinlto-action=promote %t2.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=MOD2 +; When exported, we always preserve a linkonce +; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - --exported-symbol=linkonceodrfuncInSingleModule | llvm-dis -o - | FileCheck %s --check-prefix=EXPORTED target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" @@ -48,3 +50,9 @@ entry: ret void } +; MOD1: define linkonce_odr void @linkonceodrfuncInSingleModule() +; EXPORTED: define weak_odr void @linkonceodrfuncInSingleModule() +define linkonce_odr void @linkonceodrfuncInSingleModule() #0 { +entry: + ret void +}