[llvm] r293918 - [ThinLTO] Add an auto-hide feature
Yung, Douglas via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 2 12:36:49 PST 2017
Hi Mehdi,
I don't know if you are aware, but this commit caused an LLD test to fail (lld :: ELF/lto/thin-archivecollision.ll) and is causing the PS4 bots to be red (http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/4911). Can you take a look?
Douglas Yung
> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Mehdi Amini via llvm-commits
> Sent: Thursday, February 02, 2017 10:32
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r293918 - [ThinLTO] Add an auto-hide feature
>
> Author: mehdi_amini
> Date: Thu Feb 2 12:31:35 2017
> New Revision: 293918
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293918&view=rev
> Log:
> [ThinLTO] Add an auto-hide feature
>
> When a symbol is not exported outside of the DSO, it is can be hidden. Usually
> we try to internalize as much as possible, but it is not always possible, for
> instance a symbol can be referenced outside of the LTO unit, or there can be
> cross-module reference in ThinLTO.
>
> This is a recommit of r293912 after fixing build failures.
>
> Differential Revision: https://reviews.llvm.org/D28978
>
> Added:
> llvm/trunk/test/ThinLTO/X86/Inputs/weak_autohide.ll
> llvm/trunk/test/ThinLTO/X86/weak_autohide.ll
> Modified:
> llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h
> llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h
> llvm/trunk/include/llvm/LTO/LTO.h
> llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
> llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> llvm/trunk/lib/LTO/LTO.cpp
> llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
> llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp
> llvm/trunk/test/ThinLTO/X86/deadstrip.ll
>
> Modified: llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h?rev=293918&r1=293917&r
> 2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h (original)
> +++ llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h Thu Feb 2 12:31:35
> +++ 2017
> @@ -126,11 +126,14 @@ public:
> /// llvm.global_ctors that the linker does not know about.
> unsigned LiveRoot : 1;
>
> + /// Indicate if the global value should be hidden.
> + unsigned AutoHide : 1;
> +
> /// Convenience Constructors
> explicit GVFlags(GlobalValue::LinkageTypes Linkage,
> - bool NotEligibleToImport, bool LiveRoot)
> + bool NotEligibleToImport, bool LiveRoot, bool
> + AutoHide)
> : Linkage(Linkage), NotEligibleToImport(NotEligibleToImport),
> - LiveRoot(LiveRoot) {}
> + LiveRoot(LiveRoot), AutoHide(AutoHide) {}
> };
>
> private:
> @@ -198,6 +201,9 @@ public:
> Flags.Linkage = Linkage;
> }
>
> + /// Sets the visibility to be autohidden.
> + void setAutoHide() { Flags.AutoHide = true; }
> +
> /// Return true if this global value can't be imported.
> bool notEligibleToImport() const { return Flags.NotEligibleToImport; }
>
>
> Modified: llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h?rev=293918&r1=2939
> 17&r2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h (original)
> +++ llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h Thu Feb 2
> +++ 12:31:35 2017
> @@ -79,7 +79,7 @@ template <> struct CustomMappingTraits<G
> auto &Elem = V[KeyInt];
> for (auto &FSum : FSums) {
> GlobalValueSummary::GVFlags GVFlags(GlobalValue::ExternalLinkage,
> false,
> - false);
> + false, /* AutoHide */ false);
> Elem.push_back(llvm::make_unique<FunctionSummary>(
> GVFlags, 0, ArrayRef<ValueInfo>{},
> ArrayRef<FunctionSummary::EdgeTy>{}, std::move(FSum.TypeTests)));
>
> Modified: llvm/trunk/include/llvm/LTO/LTO.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/LTO/LTO.h?rev=293918&r1=293917&r2=293918&view=
> diff
> ==============================================================================
> --- llvm/trunk/include/llvm/LTO/LTO.h (original)
> +++ llvm/trunk/include/llvm/LTO/LTO.h Thu Feb 2 12:31:35 2017
> @@ -52,12 +52,18 @@ void thinLTOResolveWeakForLinkerInIndex(
> function_ref<void(StringRef, GlobalValue::GUID,
> GlobalValue::LinkageTypes)>
> recordNewLinkage);
>
> +/// This enum is used for the returned value of the callback passed to
> +/// thinLTOInternalizeAndPromoteInIndex, it indicates if a symbol can
> +be made /// Internal (only referenced from its defining object), Hidden
> +( /// outside the DSO), or Exported (exposed as public API for the DSO).
> +enum SummaryResolution { Internal, Hidden, Exported };
> +
> /// Update the linkages in the given \p Index to mark exported values /// as
> external and non-exported values as internal. The ThinLTO backends /// must
> apply the changes to the Module via thinLTOInternalizeModule.
> void thinLTOInternalizeAndPromoteInIndex(
> ModuleSummaryIndex &Index,
> - function_ref<bool(StringRef, GlobalValue::GUID)> isExported);
> + function_ref<SummaryResolution(StringRef, GlobalValue::GUID)>
> + isExported);
>
> namespace lto {
>
>
> Modified: llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp?rev=293918&r1=293917
> &r2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp Thu Feb 2
> +++ 12:31:35 2017
> @@ -190,7 +190,8 @@ computeFunctionSummary(ModuleSummaryInde
> // FIXME: refactor this to use the same code that inliner is using.
> F.isVarArg();
> GlobalValueSummary::GVFlags Flags(F.getLinkage(), NotEligibleForImport,
> - /* LiveRoot = */ false);
> + /* LiveRoot = */ false,
> + /* AutoHide */ false);
> auto FuncSummary = llvm::make_unique<FunctionSummary>(
> Flags, NumInsts, RefEdges.takeVector(), CallGraphEdges.takeVector(),
> TypeTests.takeVector());
> @@ -207,7 +208,8 @@ computeVariableSummary(ModuleSummaryInde
> findRefEdges(&V, RefEdges, Visited);
> bool NonRenamableLocal = isNonRenamableLocal(V);
> GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal,
> - /* LiveRoot = */ false);
> + /* LiveRoot = */ false,
> + /* AutoHide */ false);
> auto GVarSummary =
> llvm::make_unique<GlobalVarSummary>(Flags, RefEdges.takeVector());
> if (NonRenamableLocal)
> @@ -220,7 +222,8 @@ computeAliasSummary(ModuleSummaryIndex &
> DenseSet<GlobalValue::GUID> &CantBePromoted) {
> bool NonRenamableLocal = isNonRenamableLocal(A);
> GlobalValueSummary::GVFlags Flags(A.getLinkage(), NonRenamableLocal,
> - /* LiveRoot = */ false);
> + /* LiveRoot = */ false,
> + /* AutoHide */ false);
> auto AS = llvm::make_unique<AliasSummary>(Flags, ArrayRef<ValueInfo>{});
> auto *Aliasee = A.getBaseObject();
> auto *AliaseeSummary = Index.getGlobalValueSummary(*Aliasee);
> @@ -339,7 +342,8 @@ ModuleSummaryIndex llvm::buildModuleSumm
> assert(GV->isDeclaration() && "Def in module asm already has
> definition");
> GlobalValueSummary::GVFlags GVFlags(GlobalValue::InternalLinkage,
> /* NotEligibleToImport */ true,
> - /* LiveRoot */ true);
> + /* LiveRoot */ true,
> + /* AutoHide */ false);
> CantBePromoted.insert(GlobalValue::getGUID(Name));
> // Create the appropriate summary type.
> if (isa<Function>(GV)) {
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=293918&r1=293917&r
> 2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Thu Feb 2 12:31:35
> +++ 2017
> @@ -800,13 +800,14 @@ static GlobalValueSummary::GVFlags getDe
> // like getDecodedLinkage() above. Any future change to the linkage enum
> and
> // to getDecodedLinkage() will need to be taken into account here as above.
> auto Linkage = GlobalValue::LinkageTypes(RawFlags & 0xF); // 4 bits
> - RawFlags = RawFlags >> 4;
> - bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
> + bool NotEligibleToImport = ((RawFlags >> 4) & 0x1) || Version < 3;
> // The LiveRoot flag wasn't introduced until version 3. For dead stripping
> // to work correctly on earlier versions, we must conservatively treat all
> // values as live.
> - bool LiveRoot = (RawFlags & 0x2) || Version < 3;
> - return GlobalValueSummary::GVFlags(Linkage, NotEligibleToImport, LiveRoot);
> + bool LiveRoot = ((RawFlags >> 5) & 0x1) || Version < 3; bool
> + AutoHide = (RawFlags >> 6) & 0x1; return
> + GlobalValueSummary::GVFlags(Linkage, NotEligibleToImport, LiveRoot,
> + AutoHide);
> }
>
> static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val) {
>
> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=293918&r1=293917&r
> 2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Thu Feb 2 12:31:35
> +++ 2017
> @@ -971,13 +971,13 @@ static unsigned getEncodedLinkage(const static uint64_t
> getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {
> uint64_t RawFlags = 0;
>
> - RawFlags |= Flags.NotEligibleToImport; // bool
> - RawFlags |= (Flags.LiveRoot << 1);
> // Linkage don't need to be remapped at that time for the summary. Any
> future
> // change to the getEncodedLinkage() function will need to be taken into
> // account here as well.
> - RawFlags = (RawFlags << 4) | Flags.Linkage; // 4 bits
> -
> + RawFlags |= Flags.Linkage; // 4 bits linkage
> + RawFlags |= (Flags.NotEligibleToImport << 4); // bool
> + RawFlags |= (Flags.LiveRoot << 5); // bool
> + RawFlags |= (Flags.AutoHide << 6); // bool
> return RawFlags;
> }
>
>
> Modified: llvm/trunk/lib/LTO/LTO.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/LTO/LTO.cpp?rev=293918&r1=293917&r2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTO.cpp (original)
> +++ llvm/trunk/lib/LTO/LTO.cpp Thu Feb 2 12:31:35 2017
> @@ -199,11 +199,14 @@ void llvm::thinLTOResolveWeakForLinkerIn
>
> static void thinLTOInternalizeAndPromoteGUID(
> GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID,
> - function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
> + function_ref<SummaryResolution(StringRef, GlobalValue::GUID)>
> + isExported) {
> for (auto &S : GVSummaryList) {
> - if (isExported(S->modulePath(), GUID)) {
> + auto ExportResolution = isExported(S->modulePath(), GUID);
> + if (ExportResolution != Internal) {
> if (GlobalValue::isLocalLinkage(S->linkage()))
> S->setLinkage(GlobalValue::ExternalLinkage);
> + if (ExportResolution == Hidden)
> + S->setAutoHide();
> } else if (!GlobalValue::isLocalLinkage(S->linkage()))
> S->setLinkage(GlobalValue::InternalLinkage);
> }
> @@ -213,7 +216,7 @@ static void thinLTOInternalizeAndPromote // as external
> and non-exported values as internal.
> void llvm::thinLTOInternalizeAndPromoteInIndex(
> ModuleSummaryIndex &Index,
> - function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
> + function_ref<SummaryResolution(StringRef, GlobalValue::GUID)>
> + isExported) {
> for (auto &I : Index)
> thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported); } @@ -
> 921,11 +924,20 @@ Error LTO::runThinLTO(AddStreamFn AddStr
> const GlobalValueSummary *S) {
> return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath();
> };
> - auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID)
> {
> + auto isExported = [&](StringRef ModuleIdentifier,
> + GlobalValue::GUID GUID) -> SummaryResolution
> + {
> const auto &ExportList = ExportLists.find(ModuleIdentifier);
> - return (ExportList != ExportLists.end() &&
> - ExportList->second.count(GUID)) ||
> - ExportedGUIDs.count(GUID);
> + if ((ExportList != ExportLists.end() && ExportList->second.count(GUID))
> ||
> + ExportedGUIDs.count(GUID)) {
> + // We could do better by hiding when a symbol is in
> + // GUIDPreservedSymbols because it is only referenced from regular
> LTO
> + // or from native files and not outside the final binary, but that's
> + // something the native linker could do as gwell.
> + if (GUIDPreservedSymbols.count(GUID))
> + return Exported;
> + return Hidden;
> + }
> + return Internal;
> };
> thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported);
>
>
> Modified: llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp?rev=293918&r1=293917&r2=29
> 3918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp Thu Feb 2 12:31:35 2017
> @@ -234,16 +234,16 @@ static void optimizeModule(Module &TheMo
>
> // Convert the PreservedSymbols map from "Name" based to "GUID" based.
> static DenseSet<GlobalValue::GUID>
> -computeGUIDPreservedSymbols(const StringSet<> &PreservedSymbols,
> - const Triple &TheTriple) {
> - DenseSet<GlobalValue::GUID> GUIDPreservedSymbols(PreservedSymbols.size());
> - for (auto &Entry : PreservedSymbols) {
> +convertSymbolNamesToGUID(const StringSet<> &NamedSymbols,
> + const Triple &TheTriple) {
> + DenseSet<GlobalValue::GUID> GUIDSymbols(NamedSymbols.size());
> + for (auto &Entry : NamedSymbols) {
> StringRef Name = Entry.first();
> if (TheTriple.isOSBinFormatMachO() && Name.size() > 0 && Name[0] == '_')
> Name = Name.drop_front();
> - GUIDPreservedSymbols.insert(GlobalValue::getGUID(Name));
> + GUIDSymbols.insert(GlobalValue::getGUID(Name));
> }
> - return GUIDPreservedSymbols;
> + return GUIDSymbols;
> }
>
> std::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule, @@ -554,10
> +554,7 @@ void ThinLTOCodeGenerator::preserveSymbo
> }
>
> void ThinLTOCodeGenerator::crossReferenceSymbol(StringRef Name) {
> - // FIXME: At the moment, we don't take advantage of this extra information,
> - // we're conservatively considering cross-references as preserved.
> - // CrossReferencedSymbols.insert(Name);
> - PreservedSymbols.insert(Name);
> + CrossReferencedSymbols.insert(Name);
> }
>
> // TargetMachine factory
> @@ -620,7 +617,7 @@ void ThinLTOCodeGenerator::promote(Modul
> Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
>
> // Convert the preserved symbols set from string to GUID
> - auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
> + auto GUIDPreservedSymbols = convertSymbolNamesToGUID(
> PreservedSymbols, Triple(TheModule.getTargetTriple()));
>
> // Compute "dead" symbols, we don't want to import/export these!
> @@ -641,11 +638,13 @@ void ThinLTOCodeGenerator::promote(Modul
>
> // Promote the exported values in the index, so that they are promoted
> // in the module.
> - auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
> + auto isExported = [&](StringRef ModuleIdentifier,
> + GlobalValue::GUID GUID) -> SummaryResolution {
> const auto &ExportList = ExportLists.find(ModuleIdentifier);
> - return (ExportList != ExportLists.end() &&
> - ExportList->second.count(GUID)) ||
> - GUIDPreservedSymbols.count(GUID);
> + if ((ExportList != ExportLists.end() && ExportList->second.count(GUID))
> ||
> + GUIDPreservedSymbols.count(GUID))
> + return Exported;
> + return Internal;
> };
> thinLTOInternalizeAndPromoteInIndex(Index, isExported);
>
> @@ -665,7 +664,7 @@ void ThinLTOCodeGenerator::crossModuleIm
> Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
>
> // Convert the preserved symbols set from string to GUID
> - auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
> + auto GUIDPreservedSymbols = convertSymbolNamesToGUID(
> PreservedSymbols, Triple(TheModule.getTargetTriple()));
>
> // Compute "dead" symbols, we don't want to import/export these!
> @@ -739,7 +738,7 @@ void ThinLTOCodeGenerator::internalize(M
>
> // Convert the preserved symbols set from string to GUID
> auto GUIDPreservedSymbols =
> - computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple);
> + convertSymbolNamesToGUID(PreservedSymbols, TMBuilder.TheTriple);
>
> // Collect for each module the list of function it defines (GUID ->
> Summary).
> StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
> @@ -761,11 +760,13 @@ void ThinLTOCodeGenerator::internalize(M
> return;
>
> // Internalization
> - auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
> + auto isExported = [&](StringRef ModuleIdentifier,
> + GlobalValue::GUID GUID) -> SummaryResolution {
> const auto &ExportList = ExportLists.find(ModuleIdentifier);
> - return (ExportList != ExportLists.end() &&
> - ExportList->second.count(GUID)) ||
> - GUIDPreservedSymbols.count(GUID);
> + if ((ExportList != ExportLists.end() && ExportList->second.count(GUID))
> ||
> + GUIDPreservedSymbols.count(GUID))
> + return Exported;
> + return Internal;
> };
> thinLTOInternalizeAndPromoteInIndex(Index, isExported);
> thinLTOInternalizeModule(TheModule,
> @@ -894,7 +895,9 @@ void ThinLTOCodeGenerator::run() {
> // Convert the preserved symbols set from string to GUID, this is needed
> for
> // computing the caching hash and the internalization.
> auto GUIDPreservedSymbols =
> - computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple);
> + convertSymbolNamesToGUID(PreservedSymbols, TMBuilder.TheTriple);
> + auto GUIDCrossRefSymbols =
> + convertSymbolNamesToGUID(CrossReferencedSymbols,
> + TMBuilder.TheTriple);
>
> // Compute "dead" symbols, we don't want to import/export these!
> auto DeadSymbols = computeDeadSymbols(*Index, GUIDPreservedSymbols); @@ -
> 916,11 +919,16 @@ void ThinLTOCodeGenerator::run() {
> // impacts the caching.
> resolveWeakForLinkerInIndex(*Index, ResolvedODR);
>
> - auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
> + auto isExported = [&](StringRef ModuleIdentifier,
> + GlobalValue::GUID GUID) -> SummaryResolution {
> + if (GUIDPreservedSymbols.count(GUID))
> + return Exported;
> + if (GUIDCrossRefSymbols.count(GUID))
> + return Hidden;
> const auto &ExportList = ExportLists.find(ModuleIdentifier);
> - return (ExportList != ExportLists.end() &&
> - ExportList->second.count(GUID)) ||
> - GUIDPreservedSymbols.count(GUID);
> + if (ExportList != ExportLists.end() && ExportList->second.count(GUID))
> + return Hidden;
> + return Internal;
> };
>
> // Use global summary-based analysis to identify symbols that can be
>
> Modified: llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp?rev=293918&r1=293917&
> r2=293918&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp Thu Feb 2 12:31:35
> +++ 2017
> @@ -650,6 +650,13 @@ void llvm::thinLTOInternalizeModule(Modu
> return !GlobalValue::isLocalLinkage(Linkage);
> };
>
> + // Try to auto-hide the symbols.
> + for (auto &GO : TheModule.global_objects()) {
> + const auto &GS = DefinedGlobals.find(GO.getGUID());
> + if (GS != DefinedGlobals.end() && GS->second->flags().AutoHide)
> + GO.setVisibility(GlobalValue::HiddenVisibility);
> + }
> +
> // FIXME: See if we can just internalize directly here via linkage changes
> // based on the index, rather than invoking internalizeModule.
> llvm::internalizeModule(TheModule, MustPreserveGV);
>
> Added: llvm/trunk/test/ThinLTO/X86/Inputs/weak_autohide.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/ThinLTO/X86/Inputs/weak_autohide.ll?rev=293918&view=au
> to
> ==============================================================================
> --- llvm/trunk/test/ThinLTO/X86/Inputs/weak_autohide.ll (added)
> +++ llvm/trunk/test/ThinLTO/X86/Inputs/weak_autohide.ll Thu Feb 2
> +++ 12:31:35 2017
> @@ -0,0 +1,6 @@
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.11.0"
> +
> +define weak_odr void @weakodrfunc() {
> + ret void
> +}
>
> Modified: llvm/trunk/test/ThinLTO/X86/deadstrip.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/ThinLTO/X86/deadstrip.ll?rev=293918&r1=293917&r2=29391
> 8&view=diff
> ==============================================================================
> --- llvm/trunk/test/ThinLTO/X86/deadstrip.ll (original)
> +++ llvm/trunk/test/ThinLTO/X86/deadstrip.ll Thu Feb 2 12:31:35 2017
> @@ -3,7 +3,7 @@
> ; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc
>
> ; RUN: llvm-lto -exported-symbol=_main -thinlto-action=promote %t1.bc -
> thinlto-index=%t.index.bc -o - | llvm-lto -exported-symbol=_main -thinlto-
> action=internalize -thinlto-index %t.index.bc -thinlto-module-id=%t1.bc - -o -
> | llvm-dis -o - | FileCheck %s -; RUN: llvm-lto -exported-symbol=_main -
> thinlto-action=promote %t2.bc -thinlto-index=%t.index.bc -o - | llvm-lto -
> exported-symbol=_main -thinlto-action=internalize -thinlto-index %t.index.bc -
> thinlto-module-id=%t2.bc - -o - | llvm-dis -o - | FileCheck %s --check-
> prefix=CHECK2
> +; RUN: llvm-lto -exported-symbol=_main -thinlto-action=promote %t2.bc
> +-thinlto-index=%t.index.bc -o - | llvm-lto -exported-symbol=_main
> +-thinlto-action=internalize -thinlto-index %t.index.bc
> +-thinlto-module-id=%t2.bc - -o - | llvm-dis -o - | FileCheck %s
> +--check-prefix=CHECK2-LTO
>
> ; RUN: llvm-lto -exported-symbol=_main -thinlto-action=run %t1.bc %t2.bc ;
> RUN: llvm-nm %t1.bc.thinlto.o | FileCheck %s --check-prefix=CHECK-NM @@ -19,7
> +19,7 @@
> ; RUN: -r %t2.bc,_dead_func,pl \
> ; RUN: -r %t2.bc,_another_dead_func,pl
> ; RUN: llvm-dis < %t.out.0.3.import.bc | FileCheck %s -; RUN: llvm-dis <
> %t.out.1.3.import.bc | FileCheck %s --check-prefix=CHECK2
> +; RUN: llvm-dis < %t.out.1.3.import.bc | FileCheck %s
> +--check-prefix=CHECK2-LTO2
> ; RUN: llvm-nm %t.out.1 | FileCheck %s --check-prefix=CHECK2-NM
>
> ; Dead-stripping on the index allows to internalize these, @@ -34,7 +34,8 @@
>
> ; Make sure we didn't internalize @boo, which is reachable via ;
> llvm.global_ctors -; CHECK2: define void @boo()
> +; CHECK2-LTO: define void @boo()
> +; CHECK2-LTO2: define hidden void @boo()
> ; We should have eventually revoved @baz since it was internalized and unused
> ; CHECK2-NM-NOT: _baz
>
>
> Added: llvm/trunk/test/ThinLTO/X86/weak_autohide.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/ThinLTO/X86/weak_autohide.ll?rev=293918&view=auto
> ==============================================================================
> --- llvm/trunk/test/ThinLTO/X86/weak_autohide.ll (added)
> +++ llvm/trunk/test/ThinLTO/X86/weak_autohide.ll Thu Feb 2 12:31:35
> +++ 2017
> @@ -0,0 +1,24 @@
> +; RUN: opt -module-summary %s -o %t1.bc ; RUN: opt -module-summary
> +%p/Inputs/weak_autohide.ll -o %t2.bc
> +
> +; RUN: llvm-lto2 %t1.bc %t2.bc -o %t.o -save-temps \
> +; RUN: -r=%t1.bc,_strong_func,pxl \
> +; RUN: -r=%t1.bc,_weakodrfunc,pl \
> +; RUN: -r=%t2.bc,_weakodrfunc,l
> +; RUN: llvm-dis < %t.o.0.2.internalize.bc | FileCheck %s
> +--check-prefix=AUTOHIDE
> +
> +
> +; AUTOHIDE: weak_odr hidden void @weakodrfunc
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.11.0"
> +
> +define weak_odr void @weakodrfunc() #0 {
> + ret void
> +}
> +
> +define void @strong_func() #0 {
> + call void @weakodrfunc()
> + ret void
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list