[llvm] r266958 - ThinLTO: Resolve linkonce_odr aliases just like functions

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 21 06:37:17 PDT 2016


On Thu, Apr 21, 2016 at 6:28 AM, Teresa Johnson <tejohnson at google.com>
wrote:

> I just added a comment to D19308 (for some reason, phab didn't email it?).
> In any case, this could be cleaned up as a post-commit fix. See
> http://reviews.llvm.org/D19308#inline-162966, copied here:
>
> I don't remember the history unfortunately.
>
> Just looked this up to refresh my memory. This was in the first version of
> D18346 <http://reviews.llvm.org/D18346>, and here is my comment as to why
> it wasn't legal to do the part that was converting weakany/linkonceany to
> available_externally in the multiple definition case:
> http://reviews.llvm.org/D18346?id=51265#inline-155935
>
> But as I pointed out later, you can still do the linkonceany->weakany
> conversion:
> http://reviews.llvm.org/D18346?id=51265#inline-156013
>
> I believe that is what is needed here when a linkonceany is exported, for
> correctness.
>
> What I am gonna do is moving forward with this patch, leaving the bug
> as-is, since it is already
> existing I think.
>
> I don't believe there is a bug in the current upstream head, just in the
> libLTO case once D19096 <http://reviews.llvm.org/D19096> goes in and
> prevents linkonce from being force imported.
>

I see that D19096 had gone in earlier yesterday evening. So I will amend
this to: it is broken in the libLTO case after that change. =)


> I'll implement in a new patch (or a few patches) the proper handling of
> the 4 points above.
>
> AFAICT the only place we are getting things wrong is with linkonce(any),
> due to your first point. And that should be easy to fix here - just do the
> conversion to weakany when the linkonceany is exported. (Then the name
> should probably be changed from ResolveODR to ResolveWeakLinkOnce or
> something more broad like that.)
>
> The last point can't be done via available_externally for
> linkonceany/weakany due to the issue I pointed out in the old patch in the
> first link above. It could be done via dropping the unselected defs (they
> can't be inlined anyway), but that is a compile time optimization, not a
> correctness issue.
>
>
>
>
> On Wed, Apr 20, 2016 at 10:47 PM, Mehdi Amini via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: mehdi_amini
>> Date: Thu Apr 21 00:47:17 2016
>> New Revision: 266958
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=266958&view=rev
>> Log:
>> ThinLTO: Resolve linkonce_odr aliases just like functions
>>
>> This help to streamline the process of handling importing since
>> we don't need to special case alias everywhere: just like
>> linkonce_odr function, make sure at least one alias is emitted
>> by turning it weak.
>>
>> Differential Revision: http://reviews.llvm.org/D19308
>>
>> From: Mehdi Amini <mehdi.amini at apple.com>
>>
>> Added:
>>     llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll
>>     llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll
>>     llvm/trunk/test/ThinLTO/X86/alias_import.ll
>>     llvm/trunk/test/ThinLTO/X86/alias_resolution.ll
>> Modified:
>>     llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>>     llvm/trunk/test/ThinLTO/X86/odr_resolution.ll
>>
>> Modified: llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp?rev=266958&r1=266957&r2=266958&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp (original)
>> +++ llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp Thu Apr 21 00:47:17 2016
>> @@ -122,10 +122,11 @@ bool IsFirstDefinitionForLinker(const Gl
>>    return true;
>>  }
>>
>> -static GlobalValue::LinkageTypes ResolveODR(const ModuleSummaryIndex
>> &Index,
>> -                                            StringRef ModuleIdentifier,
>> -                                            GlobalValue::GUID GUID,
>> -                                            const GlobalValueSummary
>> &GV) {
>> +static GlobalValue::LinkageTypes
>> +ResolveODR(const ModuleSummaryIndex &Index,
>> +           const FunctionImporter::ExportSetTy &ExportList,
>> +           StringRef ModuleIdentifier, GlobalValue::GUID GUID,
>> +           const GlobalValueSummary &GV) {
>>    auto HasMultipleCopies =
>>        [&](const GlobalValueInfoList &GVInfo) { return GVInfo.size() > 1;
>> };
>>
>> @@ -146,13 +147,19 @@ static GlobalValue::LinkageTypes Resolve
>>      auto &GVInfo = Index.findGlobalValueInfoList(GUID)->second;
>>      // We need to emit only one of these, the first module will keep
>>      // it, but turned into a weak while the others will drop it.
>> -    if (!HasMultipleCopies(GVInfo))
>> +    if (!HasMultipleCopies(GVInfo)) {
>> +      // Exported LinkonceODR needs to be promoted to not be discarded
>> +      if (GlobalValue::isDiscardableIfUnused(OriginalLinkage) &&
>> +          ExportList.count(GUID))
>> +        return GlobalValue::WeakODRLinkage;
>>        break;
>> +    }
>>      if (IsFirstDefinitionForLinker(GVInfo, Index, ModuleIdentifier))
>>        return GlobalValue::WeakODRLinkage;
>> -    else
>> -      return GlobalValue::AvailableExternallyLinkage;
>> -    break;
>> +    else if (isa<AliasSummary>(&GV))
>> +      // Alias can't be turned into available_externally.
>> +      return OriginalLinkage;
>> +    return GlobalValue::AvailableExternallyLinkage;
>>    }
>>    }
>>    return OriginalLinkage;
>> @@ -166,6 +173,7 @@ static GlobalValue::LinkageTypes Resolve
>>  /// one copy.
>>  static void ResolveODR(
>>      const ModuleSummaryIndex &Index,
>> +    const FunctionImporter::ExportSetTy &ExportList,
>>      const std::map<GlobalValue::GUID, GlobalValueSummary *>
>> &DefinedGlobals,
>>      StringRef ModuleIdentifier,
>>      DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR)
>> {
>> @@ -185,7 +193,8 @@ static void ResolveODR(
>>    for (auto &GV : DefinedGlobals) {
>>      if (GlobalInvolvedWithAlias.count(GV.second))
>>        continue;
>> -    auto NewLinkage = ResolveODR(Index, ModuleIdentifier, GV.first,
>> *GV.second);
>> +    auto NewLinkage =
>> +        ResolveODR(Index, ExportList, ModuleIdentifier, GV.first,
>> *GV.second);
>>      if (NewLinkage != GV.second->linkage()) {
>>        ResolvedODR[GV.first] = NewLinkage;
>>      }
>> @@ -213,6 +222,14 @@ void fixupODR(
>>                   << GV.getLinkage() << " to " << NewLinkage->second <<
>> "\n");
>>      GV.setLinkage(NewLinkage->second);
>>    }
>> +  for (auto &GV : TheModule.aliases()) {
>> +    auto NewLinkage = ResolvedODR.find(GV.getGUID());
>> +    if (NewLinkage == ResolvedODR.end())
>> +      continue;
>> +    DEBUG(dbgs() << "ODR fixing up linkage for `" << GV.getName() << "`
>> from "
>> +                 << GV.getLinkage() << " to " << NewLinkage->second <<
>> "\n");
>> +    GV.setLinkage(NewLinkage->second);
>> +  }
>>  }
>>
>>  static StringMap<MemoryBufferRef>
>> @@ -453,17 +470,25 @@ std::unique_ptr<ModuleSummaryIndex> Thin
>>   */
>>  void ThinLTOCodeGenerator::promote(Module &TheModule,
>>                                     ModuleSummaryIndex &Index) {
>> +  auto ModuleCount = Index.modulePaths().size();
>>    auto ModuleIdentifier = TheModule.getModuleIdentifier();
>>    // Collect for each module the list of function it defines (GUID ->
>> Summary).
>>    StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>>
>>        ModuleToDefinedGVSummaries;
>>    Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
>>
>> +  // Generate import/export list
>> +  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
>> +  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
>> +  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
>> ImportLists,
>> +                           ExportLists);
>> +  auto &ExportList = ExportLists[ModuleIdentifier];
>> +
>>    // Resolve the LinkOnceODR, trying to turn them into
>> "available_externally"
>>    // where possible.
>>    // This is a compile-time optimization.
>>    DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes> ResolvedODR;
>> -  ResolveODR(Index, ModuleToDefinedGVSummaries[ModuleIdentifier],
>> +  ResolveODR(Index, ExportList,
>> ModuleToDefinedGVSummaries[ModuleIdentifier],
>>               ModuleIdentifier, ResolvedODR);
>>    fixupODR(TheModule, ResolvedODR);
>>
>> @@ -577,9 +602,11 @@ void ThinLTOCodeGenerator::run() {
>>          Context.setDiscardValueNames(LTODiscardValueNames);
>>          Context.enableDebugTypeODRUniquing();
>>          auto ModuleIdentifier = ModuleBuffer.getBufferIdentifier();
>> +        auto &ExportList = ExportLists[ModuleIdentifier];
>>
>>          DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes>
>> ResolvedODR;
>> -        ResolveODR(*Index, ModuleToDefinedGVSummaries[ModuleIdentifier],
>> +        ResolveODR(*Index, ExportList,
>> +                   ModuleToDefinedGVSummaries[ModuleIdentifier],
>>                     ModuleIdentifier, ResolvedODR);
>>
>>          // Parse module now
>>
>> Added: llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll?rev=266958&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll (added)
>> +++ llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll Thu Apr 21
>> 00:47:17 2016
>> @@ -0,0 +1,64 @@
>> +
>> +
>> +
>> +
>> + at globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to
>> void (...)*)
>> + at globalfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @globalfunc to void (...)*)
>> +define void @globalfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc
>> to void (...)*)
>> + at internalfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @internalfunc to void (...)*)
>> + at internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @internalfunc to void (...)*)
>> + at internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @internalfunc to void (...)*)
>> + at internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @internalfunc to void (...)*)
>> +define internal void @internalfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at linkonceODRfuncAlias = alias void (...), bitcast (void ()*
>> @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...),
>> bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +define linkonce_odr void @linkonceODRfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to
>> void (...)*)
>> + at weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @weakODRfunc to void (...)*)
>> +define weak_odr void @weakODRfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc
>> to void (...)*)
>> + at linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkoncefunc to void (...)*)
>> + at linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkoncefunc to void (...)*)
>> + at linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @linkoncefunc to void (...)*)
>> + at linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @linkoncefunc to void (...)*)
>> +define linkonce void @linkoncefunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void
>> (...)*)
>> + at weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc
>> to void (...)*)
>> + at weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakfunc to void (...)*)
>> + at weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakfunc to void (...)*)
>> + at weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void
>> ()* @weakfunc to void (...)*)
>> +define weak void @weakfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>>
>> Added: llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll?rev=266958&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll (added)
>> +++ llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll Thu Apr 21
>> 00:47:17 2016
>> @@ -0,0 +1,64 @@
>> +
>> +
>> +
>> +
>> + at globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to
>> void (...)*)
>> + at globalfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> + at globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @globalfunc to void (...)*)
>> +define void @globalfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc
>> to void (...)*)
>> + at internalfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @internalfunc to void (...)*)
>> + at internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @internalfunc to void (...)*)
>> + at internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @internalfunc to void (...)*)
>> + at internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @internalfunc to void (...)*)
>> +define internal void @internalfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at linkonceODRfuncAlias = alias void (...), bitcast (void ()*
>> @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> + at linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...),
>> bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +define linkonce_odr void @linkonceODRfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to
>> void (...)*)
>> + at weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> + at weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @weakODRfunc to void (...)*)
>> +define weak_odr void @weakODRfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc
>> to void (...)*)
>> + at linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkoncefunc to void (...)*)
>> + at linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkoncefunc to void (...)*)
>> + at linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @linkoncefunc to void (...)*)
>> + at linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @linkoncefunc to void (...)*)
>> +define linkonce void @linkoncefunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void
>> (...)*)
>> + at weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc
>> to void (...)*)
>> + at weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakfunc to void (...)*)
>> + at weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakfunc to void (...)*)
>> + at weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void
>> ()* @weakfunc to void (...)*)
>> +define weak void @weakfunc() {
>> +entry:
>> +  ret void
>> +}
>> +
>>
>> Added: llvm/trunk/test/ThinLTO/X86/alias_import.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_import.ll?rev=266958&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/ThinLTO/X86/alias_import.ll (added)
>> +++ llvm/trunk/test/ThinLTO/X86/alias_import.ll Thu Apr 21 00:47:17 2016
>> @@ -0,0 +1,168 @@
>> +; RUN: opt -module-summary %s -o %t1.bc
>> +; RUN: opt -module-summary %p/Inputs/alias_import.ll -o %t2.bc
>> +; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc
>> +; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc
>> %t2.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE
>> +; RUN: llvm-lto -thinlto-action=import -thinlto-index %t.index.bc %t1.bc
>> -o - | llvm-dis -o - | FileCheck %s --check-prefix=IMPORT
>> +
>> +;
>> +; Alias can't point to "available_externally", so we can only import an
>> alias
>> +; when we can import the aliasee with a linkage that won't be
>> +; available_externally, i.e linkOnceODR. (FIXME this limitation could be
>> lifted)
>> +; PROMOTE-DAG: @globalfuncAlias = alias void (...), bitcast (void ()*
>> @globalfunc to void (...)*)
>> +; PROMOTE-DAG: @globalfuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @globalfunc to void (...)*)
>> +; PROMOTE-DAG: @globalfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @globalfunc to void (...)*)
>> +; PROMOTE-DAG: @globalfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @globalfunc to void (...)*)
>> +; PROMOTE-DAG: @globalfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @globalfunc to void (...)*)
>> +; PROMOTE-DAG: @internalfuncAlias = alias void (...), bitcast (void ()*
>> @internalfunc.llvm.0 to void (...)*)
>> +; PROMOTE-DAG: @internalfuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @internalfunc.llvm.0 to void (...)*)
>> +; PROMOTE-DAG: @internalfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
>> +; PROMOTE-DAG: @internalfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
>> +; PROMOTE-DAG: @internalfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)
>> +; PROMOTE-DAG: @linkoncefuncAlias = alias void (...), bitcast (void ()*
>> @linkoncefunc to void (...)*)
>> +; PROMOTE-DAG: @linkoncefuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @linkoncefunc to void (...)*)
>> +; PROMOTE-DAG: @linkoncefuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @linkoncefunc to void (...)*)
>> +; PROMOTE-DAG: @linkoncefuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @linkoncefunc to void (...)*)
>> +; PROMOTE-DAG: @linkoncefuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @linkoncefunc to void (...)*)
>> +; PROMOTE-DAG: @weakfuncAlias = alias void (...), bitcast (void ()*
>> @weakfunc to void (...)*)
>> +; PROMOTE-DAG: @weakfuncWeakAlias = weak alias void (...), bitcast (void
>> ()* @weakfunc to void (...)*)
>> +; PROMOTE-DAG: @weakfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @weakfunc to void (...)*)
>> +; PROMOTE-DAG: @weakfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakfunc to void (...)*)
>> +; PROMOTE-DAG: @weakfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @weakfunc to void (...)*)
>> +; PROMOTE-DAG: @weakODRfuncAlias = alias void (...), bitcast (void ()*
>> @weakODRfunc to void (...)*)
>> +; PROMOTE-DAG: @weakODRfuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @weakODRfunc to void (...)*)
>> +; PROMOTE-DAG: @weakODRfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @weakODRfunc to void (...)*)
>> +; PROMOTE-DAG: @weakODRfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakODRfunc to void (...)*)
>> +; PROMOTE-DAG: @weakODRfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @weakODRfunc to void (...)*)
>> +
>> +; Only alias to LinkonceODR aliasee can be imported
>> +; PROMOTE-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> +; PROMOTE-DAG: @linkonceODRfuncWeakAlias = weak alias void (...),
>> bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; PROMOTE-DAG: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; Amongst these that are imported, check that we promote only
>> linkonce->weak
>> +; PROMOTE-DAG: @linkonceODRfuncLinkonceAlias = linkonce alias void
>> (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; PROMOTE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +
>> +; These will be imported, check the linkage/renaming after promotion
>> +; PROMOTE-DAG: define void @globalfunc()
>> +; PROMOTE-DAG: define hidden void @internalfunc.llvm.0()
>> +; PROMOTE-DAG: define linkonce_odr void @linkonceODRfunc()
>> +; PROMOTE-DAG: define weak_odr void @weakODRfunc()
>> +; PROMOTE-DAG: define linkonce void @linkoncefunc()
>> +; PROMOTE-DAG: define weak void @weakfunc()
>> +
>> +; On the import side now, verify that aliases to a linkonce_odr are
>> imported, but the weak (never import weak)
>> +; IMPORT-DAG:  declare void @linkonceODRfuncWeakAlias
>> +; IMPORT-DAG:  @linkonceODRfuncAlias = alias void (...), bitcast (void
>> ()* @linkonceODRfunc to void (...)*)
>> +; IMPORT-DAG:  @linkonceODRfuncLinkonceAlias = linkonce alias void
>> (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; IMPORT-DAG:  @linkonceODRfuncWeakODRAlias = alias void (...), bitcast
>> (void ()* @linkonceODRfunc to void (...)*)
>> +; IMPORT-DAG:  @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias
>> void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; IMPORT-DAG:  define linkonce_odr void @linkonceODRfunc()
>> +
>> +
>> +; On the import side, these aliases are not imported (they don't point
>> to a linkonce_odr)
>> +; IMPORT-DAG: declare void @globalfuncAlias()
>> +; IMPORT-DAG: declare void @globalfuncWeakAlias()
>> +; IMPORT-DAG: declare void @globalfuncLinkonceAlias()
>> +; IMPORT-DAG: declare void @globalfuncWeakODRAlias()
>> +; IMPORT-DAG: declare void @globalfuncLinkonceODRAlias()
>> +; IMPORT-DAG: declare void @internalfuncAlias()
>> +; IMPORT-DAG: declare void @internalfuncWeakAlias()
>> +; IMPORT-DAG: declare void @internalfuncLinkonceAlias()
>> +; IMPORT-DAG: declare void @internalfuncWeakODRAlias()
>> +; IMPORT-DAG: declare void @internalfuncLinkonceODRAlias()
>> +; IMPORT-DAG: declare void @weakODRfuncAlias()
>> +; IMPORT-DAG: declare void @weakODRfuncWeakAlias()
>> +; IMPORT-DAG: declare void @weakODRfuncLinkonceAlias()
>> +; IMPORT-DAG: declare void @weakODRfuncWeakODRAlias()
>> +; IMPORT-DAG: declare void @weakODRfuncLinkonceODRAlias()
>> +; IMPORT-DAG: declare void @linkoncefuncAlias()
>> +; IMPORT-DAG: declare void @linkoncefuncWeakAlias()
>> +; IMPORT-DAG: declare void @linkoncefuncLinkonceAlias()
>> +; IMPORT-DAG: declare void @linkoncefuncWeakODRAlias()
>> +; IMPORT-DAG: declare void @linkoncefuncLinkonceODRAlias()
>> +; IMPORT-DAG: declare void @weakfuncAlias()
>> +; IMPORT-DAG: declare void @weakfuncWeakAlias()
>> +; IMPORT-DAG: declare void @weakfuncLinkonceAlias()
>> +; IMPORT-DAG: declare void @weakfuncWeakODRAlias()
>> +; IMPORT-DAG: declare void @weakfuncLinkonceODRAlias()
>> +
>> +
>> +
>> +define i32 @main() #0 {
>> +entry:
>> +  call void @globalfuncAlias()
>> +  call void @globalfuncWeakAlias()
>> +  call void @globalfuncLinkonceAlias()
>> +  call void @globalfuncWeakODRAlias()
>> +  call void @globalfuncLinkonceODRAlias()
>> +
>> +  call void @internalfuncAlias()
>> +  call void @internalfuncWeakAlias()
>> +  call void @internalfuncLinkonceAlias()
>> +  call void @internalfuncWeakODRAlias()
>> +  call void @internalfuncLinkonceODRAlias()
>> +  call void @linkonceODRfuncAlias()
>> +  call void @linkonceODRfuncWeakAlias()
>> +  call void @linkonceODRfuncLinkonceAlias()
>> +  call void @linkonceODRfuncWeakODRAlias()
>> +  call void @linkonceODRfuncLinkonceODRAlias()
>> +
>> +  call void @weakODRfuncAlias()
>> +  call void @weakODRfuncWeakAlias()
>> +  call void @weakODRfuncLinkonceAlias()
>> +  call void @weakODRfuncWeakODRAlias()
>> +  call void @weakODRfuncLinkonceODRAlias()
>> +
>> +  call void @linkoncefuncAlias()
>> +  call void @linkoncefuncWeakAlias()
>> +  call void @linkoncefuncLinkonceAlias()
>> +  call void @linkoncefuncWeakODRAlias()
>> +  call void @linkoncefuncLinkonceODRAlias()
>> +
>> +  call void @weakfuncAlias()
>> +  call void @weakfuncWeakAlias()
>> +  call void @weakfuncLinkonceAlias()
>> +  call void @weakfuncWeakODRAlias()
>> +  call void @weakfuncLinkonceODRAlias()
>> +
>> +  ret i32 0
>> +}
>> +
>> +
>> +declare void @globalfuncAlias()
>> +declare void @globalfuncWeakAlias()
>> +declare void @globalfuncLinkonceAlias()
>> +declare void @globalfuncWeakODRAlias()
>> +declare void @globalfuncLinkonceODRAlias()
>> +
>> +declare void @internalfuncAlias()
>> +declare void @internalfuncWeakAlias()
>> +declare void @internalfuncLinkonceAlias()
>> +declare void @internalfuncWeakODRAlias()
>> +declare void @internalfuncLinkonceODRAlias()
>> +
>> +declare void @linkonceODRfuncAlias()
>> +declare void @linkonceODRfuncWeakAlias()
>> +declare void @linkonceODRfuncLinkonceAlias()
>> +declare void @linkonceODRfuncWeakODRAlias()
>> +declare void @linkonceODRfuncLinkonceODRAlias()
>> +
>> +declare void @weakODRfuncAlias()
>> +declare void @weakODRfuncWeakAlias()
>> +declare void @weakODRfuncLinkonceAlias()
>> +declare void @weakODRfuncWeakODRAlias()
>> +declare void @weakODRfuncLinkonceODRAlias()
>> +
>> +declare void @linkoncefuncAlias()
>> +declare void @linkoncefuncWeakAlias()
>> +declare void @linkoncefuncLinkonceAlias()
>> +declare void @linkoncefuncWeakODRAlias()
>> +declare void @linkoncefuncLinkonceODRAlias()
>> +
>> +declare void @weakfuncAlias()
>> +declare void @weakfuncWeakAlias()
>> +declare void @weakfuncLinkonceAlias()
>> +declare void @weakfuncWeakODRAlias()
>> +declare void @weakfuncLinkonceODRAlias()
>> +
>> +
>>
>> Added: llvm/trunk/test/ThinLTO/X86/alias_resolution.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_resolution.ll?rev=266958&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/ThinLTO/X86/alias_resolution.ll (added)
>> +++ llvm/trunk/test/ThinLTO/X86/alias_resolution.ll Thu Apr 21 00:47:17
>> 2016
>> @@ -0,0 +1,82 @@
>> +; RUN: opt -module-summary %s -o %t1.bc
>> +; RUN: opt -module-summary %p/Inputs/alias_resolution.ll -o %t2.bc
>> +; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc
>> +; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc
>> %t2.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE_MOD2
>> --check-prefix=NOTPROMOTED
>> +; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc
>> %t1.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE
>> --check-prefix=NOTPROMOTED
>> +
>> +; There is no importing going on with this IR, but let's check the ODR
>> resolution for compile time
>> +
>> +; NOTPROMOTED: @linkonceODRfuncAlias = alias void (...), bitcast (void
>> ()* @linkonceODRfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @linkonceODRfuncWeakAlias = weak alias void (...),
>> bitcast (void ()* @linkonceODRfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @linkonceODRfuncLinkonceAlias = linkonce alias void
>> (...), bitcast (void ()* @linkonceODRfunc{{.*}} to void (...)*)
>> +; PROMOTE_MOD1: @linkonceODRfuncWeakODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @linkonceODRfuncWeakODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +; PROMOTE_MOD1: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias
>> void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)
>> +
>> +; NOTPROMOTED: @weakODRfuncAlias = alias void (...), bitcast (void ()*
>> @weakODRfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @weakODRfuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @weakODRfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @weakODRfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @weakODRfunc{{.*}} to void (...)*)
>> +; PROMOTE_MOD1: @weakODRfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakODRfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @weakODRfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakODRfunc to void (...)*)
>> +; PROMOTE_MOD1: @weakODRfuncLinkonceODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @weakODRfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @weakODRfunc to void (...)*)
>> +
>> +; NOTPROMOTED: @linkoncefuncAlias = alias void (...), bitcast (void ()*
>> @linkoncefunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @linkoncefuncWeakAlias = weak alias void (...), bitcast
>> (void ()* @linkoncefunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @linkoncefuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @linkoncefunc{{.*}} to void (...)*)
>> +; PROMOTE_MOD1: @linkoncefuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @linkoncefunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @linkoncefuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @linkoncefunc to void (...)*)
>> +; PROMOTE_MOD1: @linkoncefuncLinkonceODRAlias = weak_odr alias void
>> (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @linkoncefuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @linkoncefunc to void (...)*)
>> +
>> +; NOTPROMOTED: @weakfuncAlias = alias void (...), bitcast (void ()*
>> @weakfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @weakfuncWeakAlias = weak alias void (...), bitcast (void
>> ()* @weakfunc{{.*}} to void (...)*)
>> +; NOTPROMOTED: @weakfuncLinkonceAlias = linkonce alias void (...),
>> bitcast (void ()* @weakfunc{{.*}} to void (...)*)
>> +; FIXME: The "resolution" should turn one of these to linkonce_odr
>> +; PROMOTE_MOD1: @weakfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @weakfuncWeakODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakfunc to void (...)*)
>> +; PROMOTE_MOD1: @weakfuncLinkonceODRAlias = weak_odr alias void (...),
>> bitcast (void ()* @weakfunc.mod1 to void (...)*)
>> +; PROMOTE_MOD2: @weakfuncLinkonceODRAlias = linkonce_odr alias void
>> (...), bitcast (void ()* @weakfunc to void (...)*)
>> +
>> +
>> + at linkonceODRfuncAlias = alias void (...), bitcast (void ()*
>> @linkonceODRfunc.mod1 to void (...)*)
>> + at linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkonceODRfunc.mod1 to void (...)*)
>> + at linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkonceODRfunc.mod1 to void (...)*)
>> + at linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void
>> ()* @linkonceODRfunc.mod1 to void (...)*)
>> + at linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...),
>> bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)
>> +define linkonce_odr void @linkonceODRfunc.mod1() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakODRfuncAlias = alias void (...), bitcast (void ()*
>> @weakODRfunc.mod1 to void (...)*)
>> + at weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @weakODRfunc.mod1 to void (...)*)
>> + at weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakODRfunc.mod1 to void (...)*)
>> + at weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakODRfunc.mod1 to void (...)*)
>> + at weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @weakODRfunc.mod1 to void (...)*)
>> +define weak_odr void @weakODRfunc.mod1() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at linkoncefuncAlias = alias void (...), bitcast (void ()*
>> @linkoncefunc.mod1 to void (...)*)
>> + at linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @linkoncefunc.mod1 to void (...)*)
>> + at linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void
>> ()* @linkoncefunc.mod1 to void (...)*)
>> + at linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @linkoncefunc.mod1 to void (...)*)
>> + at linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast
>> (void ()* @linkoncefunc.mod1 to void (...)*)
>> +define linkonce void @linkoncefunc.mod1() {
>> +entry:
>> +  ret void
>> +}
>> +
>> + at weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc.mod1 to
>> void (...)*)
>> + at weakfuncWeakAlias = weak alias void (...), bitcast (void ()*
>> @weakfunc.mod1 to void (...)*)
>> + at weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()*
>> @weakfunc.mod1 to void (...)*)
>> + at weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()*
>> @weakfunc.mod1 to void (...)*)
>> + at weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void
>> ()* @weakfunc.mod1 to void (...)*)
>> +define weak void @weakfunc.mod1() {
>> +entry:
>> +  ret void
>> +}
>> +
>>
>> Modified: llvm/trunk/test/ThinLTO/X86/odr_resolution.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/odr_resolution.ll?rev=266958&r1=266957&r2=266958&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/ThinLTO/X86/odr_resolution.ll (original)
>> +++ llvm/trunk/test/ThinLTO/X86/odr_resolution.ll Thu Apr 21 00:47:17 2016
>> @@ -10,8 +10,8 @@
>>  target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
>>  target triple = "x86_64-apple-macosx10.11.0"
>>
>> -; Alias are not optimized
>> -; MOD1: @linkoncealias = linkonce_odr alias void (), void ()*
>> @linkonceodrfuncwithalias
>> +; Alias are resolved, but can't be turned into "available_externally"
>> +; MOD1: @linkoncealias = weak_odr alias void (), void ()*
>> @linkonceodrfuncwithalias
>>  ; MOD2: @linkoncealias = linkonce_odr alias void (), void ()*
>> @linkonceodrfuncwithalias
>>  @linkoncealias = linkonce_odr alias void (), void ()*
>> @linkonceodrfuncwithalias
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> Teresa Johnson |  Software Engineer |  tejohnson at google.com |
> 408-460-2413
>



-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |  408-460-2413
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160421/280eaba3/attachment.html>


More information about the llvm-commits mailing list