[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