[llvm] r293918 - [ThinLTO] Add an auto-hide feature

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 2 15:32:34 PST 2017


Sorry I missed this notification. Thanks for letting me know, I just reverted in r293961. I just likely need to update this test (I don’t build lld usually).

(in general feel free to revert my patched if they break something)

Best,

Mehdi



> On Feb 2, 2017, at 12:36 PM, Yung, Douglas <douglas.yung at sony.com> wrote:
> 
> 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