<div dir="ltr">Hi Mehdi,<div><br></div><div>In looking at doing something similar here for gold, I noticed this never got addressed. I think as noted below that a LinkOnceAny should be converted to WeakAny if it is exported. It isn't an issue currently on the gold side due to the lazy linking strategy in the module linker, but it is a possible issue on the libLTO side. Probably rare to cause an actual bug since it can't be inlined and therefore is unlikely to be exported but eliminated in the original module, but something that should be fixed for completeness.</div><div><br></div><div>Teresa</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Apr 21, 2016 at 6:37 AM, Teresa Johnson <span dir="ltr"><<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Thu, Apr 21, 2016 at 6:28 AM, Teresa Johnson <span dir="ltr"><<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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 <a href="http://reviews.llvm.org/D19308#inline-162966" target="_blank">http://reviews.llvm.org/D19308#inline-162966</a>, copied here:<div><br></div><div><blockquote style="margin:0px 0px 12px;padding:8px 12px;border-width:0px 0px 0px 3px;border-left-style:solid;border-left-color:rgb(140,152,184);color:rgb(70,76,92);font-style:italic;font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px;background-color:rgb(242,244,249)"><p style="margin:0px;padding:0px;border:0px">I don't remember the history unfortunately.</p></blockquote><p style="margin:0px 0px 12px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">Just looked this up to refresh my memory. This was in the first version of <a href="http://reviews.llvm.org/D18346" style="text-decoration:none;color:rgb(0,0,0);font-weight:bold" target="_blank"><span style="text-decoration:line-through;color:rgba(0,0,0,0.498039)"><span style="color:rgb(0,0,0);border:1px solid rgb(231,231,231);border-radius:3px;padding:0px 4px;background-color:rgb(231,231,231)">D18346</span></span></a>, 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:<br><a href="http://reviews.llvm.org/D18346?id=51265#inline-155935" rel="noreferrer" style="text-decoration:none;color:rgb(24,85,157)" target="_blank">http://reviews.llvm.org/D18346?id=51265#inline-155935</a></p><p style="margin:0px 0px 12px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">But as I pointed out later, you can still do the linkonceany->weakany conversion:<br><a href="http://reviews.llvm.org/D18346?id=51265#inline-156013" rel="noreferrer" style="text-decoration:none;color:rgb(24,85,157)" target="_blank">http://reviews.llvm.org/D18346?id=51265#inline-156013</a></p><p style="margin:0px 0px 12px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">I believe that is what is needed here when a linkonceany is exported, for correctness.</p><blockquote style="margin:4px 0px 12px;padding:8px 12px;border-width:0px 0px 0px 3px;border-left-style:solid;border-left-color:rgb(140,152,184);color:rgb(70,76,92);font-style:italic;font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px;background-color:rgb(242,244,249)"><p style="margin:0px;padding:0px;border:0px">What I am gonna do is moving forward with this patch, leaving the bug as-is, since it is already<br>existing I think.</p></blockquote><p style="margin:0px 0px 12px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">I don't believe there is a bug in the current upstream head, just in the libLTO case once <a href="http://reviews.llvm.org/D19096" style="text-decoration:none;color:rgb(0,0,0);font-weight:bold" target="_blank"><span style="color:inherit;border:1px solid rgb(231,231,231);border-radius:3px;padding:0px 4px;background-color:rgb(231,231,231)">D19096</span></a> goes in and prevents linkonce from being force imported.</p></div></div></blockquote><div><br></div></span><div>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. =)</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><blockquote style="margin:4px 0px 12px;padding:8px 12px;border-width:0px 0px 0px 3px;border-left-style:solid;border-left-color:rgb(140,152,184);color:rgb(70,76,92);font-style:italic;font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px;background-color:rgb(242,244,249)"><p style="margin:0px;padding:0px;border:0px">I'll implement in a new patch (or a few patches) the proper handling of the 4 points above.</p></blockquote><p style="margin:0px 0px 12px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">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.)</p><p style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">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.</p><p style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px"><br></p><p style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0);font-family:'segoe ui','segoe ui web regular','segoe ui symbol','helvetica neue',helvetica,arial,sans-serif;font-size:13px;line-height:18.85px"><br></p></div></div><div class="gmail_extra"><div><div><br><div class="gmail_quote">On Wed, Apr 20, 2016 at 10:47 PM, Mehdi Amini via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mehdi_amini<br>
Date: Thu Apr 21 00:47:17 2016<br>
New Revision: 266958<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=266958&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=266958&view=rev</a><br>
Log:<br>
ThinLTO: Resolve linkonce_odr aliases just like functions<br>
<br>
This help to streamline the process of handling importing since<br>
we don't need to special case alias everywhere: just like<br>
linkonce_odr function, make sure at least one alias is emitted<br>
by turning it weak.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D19308" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19308</a><br>
<br>
From: Mehdi Amini <<a href="mailto:mehdi.amini@apple.com" target="_blank">mehdi.amini@apple.com</a>><br>
<br>
Added:<br>
    llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll<br>
    llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll<br>
    llvm/trunk/test/ThinLTO/X86/alias_import.ll<br>
    llvm/trunk/test/ThinLTO/X86/alias_resolution.ll<br>
Modified:<br>
    llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp<br>
    llvm/trunk/test/ThinLTO/X86/odr_resolution.ll<br>
<br>
Modified: llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp?rev=266958&r1=266957&r2=266958&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp?rev=266958&r1=266957&r2=266958&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp (original)<br>
+++ llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp Thu Apr 21 00:47:17 2016<br>
@@ -122,10 +122,11 @@ bool IsFirstDefinitionForLinker(const Gl<br>
   return true;<br>
 }<br>
<br>
-static GlobalValue::LinkageTypes ResolveODR(const ModuleSummaryIndex &Index,<br>
-                                            StringRef ModuleIdentifier,<br>
-                                            GlobalValue::GUID GUID,<br>
-                                            const GlobalValueSummary &GV) {<br>
+static GlobalValue::LinkageTypes<br>
+ResolveODR(const ModuleSummaryIndex &Index,<br>
+           const FunctionImporter::ExportSetTy &ExportList,<br>
+           StringRef ModuleIdentifier, GlobalValue::GUID GUID,<br>
+           const GlobalValueSummary &GV) {<br>
   auto HasMultipleCopies =<br>
       [&](const GlobalValueInfoList &GVInfo) { return GVInfo.size() > 1; };<br>
<br>
@@ -146,13 +147,19 @@ static GlobalValue::LinkageTypes Resolve<br>
     auto &GVInfo = Index.findGlobalValueInfoList(GUID)->second;<br>
     // We need to emit only one of these, the first module will keep<br>
     // it, but turned into a weak while the others will drop it.<br>
-    if (!HasMultipleCopies(GVInfo))<br>
+    if (!HasMultipleCopies(GVInfo)) {<br>
+      // Exported LinkonceODR needs to be promoted to not be discarded<br>
+      if (GlobalValue::isDiscardableIfUnused(OriginalLinkage) &&<br>
+          ExportList.count(GUID))<br>
+        return GlobalValue::WeakODRLinkage;<br>
       break;<br>
+    }<br>
     if (IsFirstDefinitionForLinker(GVInfo, Index, ModuleIdentifier))<br>
       return GlobalValue::WeakODRLinkage;<br>
-    else<br>
-      return GlobalValue::AvailableExternallyLinkage;<br>
-    break;<br>
+    else if (isa<AliasSummary>(&GV))<br>
+      // Alias can't be turned into available_externally.<br>
+      return OriginalLinkage;<br>
+    return GlobalValue::AvailableExternallyLinkage;<br>
   }<br>
   }<br>
   return OriginalLinkage;<br>
@@ -166,6 +173,7 @@ static GlobalValue::LinkageTypes Resolve<br>
 /// one copy.<br>
 static void ResolveODR(<br>
     const ModuleSummaryIndex &Index,<br>
+    const FunctionImporter::ExportSetTy &ExportList,<br>
     const std::map<GlobalValue::GUID, GlobalValueSummary *> &DefinedGlobals,<br>
     StringRef ModuleIdentifier,<br>
     DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR) {<br>
@@ -185,7 +193,8 @@ static void ResolveODR(<br>
   for (auto &GV : DefinedGlobals) {<br>
     if (GlobalInvolvedWithAlias.count(GV.second))<br>
       continue;<br>
-    auto NewLinkage = ResolveODR(Index, ModuleIdentifier, GV.first, *GV.second);<br>
+    auto NewLinkage =<br>
+        ResolveODR(Index, ExportList, ModuleIdentifier, GV.first, *GV.second);<br>
     if (NewLinkage != GV.second->linkage()) {<br>
       ResolvedODR[GV.first] = NewLinkage;<br>
     }<br>
@@ -213,6 +222,14 @@ void fixupODR(<br>
                  << GV.getLinkage() << " to " << NewLinkage->second << "\n");<br>
     GV.setLinkage(NewLinkage->second);<br>
   }<br>
+  for (auto &GV : TheModule.aliases()) {<br>
+    auto NewLinkage = ResolvedODR.find(GV.getGUID());<br>
+    if (NewLinkage == ResolvedODR.end())<br>
+      continue;<br>
+    DEBUG(dbgs() << "ODR fixing up linkage for `" << GV.getName() << "` from "<br>
+                 << GV.getLinkage() << " to " << NewLinkage->second << "\n");<br>
+    GV.setLinkage(NewLinkage->second);<br>
+  }<br>
 }<br>
<br>
 static StringMap<MemoryBufferRef><br>
@@ -453,17 +470,25 @@ std::unique_ptr<ModuleSummaryIndex> Thin<br>
  */<br>
 void ThinLTOCodeGenerator::promote(Module &TheModule,<br>
                                    ModuleSummaryIndex &Index) {<br>
+  auto ModuleCount = Index.modulePaths().size();<br>
   auto ModuleIdentifier = TheModule.getModuleIdentifier();<br>
   // Collect for each module the list of function it defines (GUID -> Summary).<br>
   StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>><br>
       ModuleToDefinedGVSummaries;<br>
   Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);<br>
<br>
+  // Generate import/export list<br>
+  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);<br>
+  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);<br>
+  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,<br>
+                           ExportLists);<br>
+  auto &ExportList = ExportLists[ModuleIdentifier];<br>
+<br>
   // Resolve the LinkOnceODR, trying to turn them into "available_externally"<br>
   // where possible.<br>
   // This is a compile-time optimization.<br>
   DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes> ResolvedODR;<br>
-  ResolveODR(Index, ModuleToDefinedGVSummaries[ModuleIdentifier],<br>
+  ResolveODR(Index, ExportList, ModuleToDefinedGVSummaries[ModuleIdentifier],<br>
              ModuleIdentifier, ResolvedODR);<br>
   fixupODR(TheModule, ResolvedODR);<br>
<br>
@@ -577,9 +602,11 @@ void ThinLTOCodeGenerator::run() {<br>
         Context.setDiscardValueNames(LTODiscardValueNames);<br>
         Context.enableDebugTypeODRUniquing();<br>
         auto ModuleIdentifier = ModuleBuffer.getBufferIdentifier();<br>
+        auto &ExportList = ExportLists[ModuleIdentifier];<br>
<br>
         DenseMap<GlobalValue::GUID, GlobalValue::LinkageTypes> ResolvedODR;<br>
-        ResolveODR(*Index, ModuleToDefinedGVSummaries[ModuleIdentifier],<br>
+        ResolveODR(*Index, ExportList,<br>
+                   ModuleToDefinedGVSummaries[ModuleIdentifier],<br>
                    ModuleIdentifier, ResolvedODR);<br>
<br>
         // Parse module now<br>
<br>
Added: llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll?rev=266958&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll?rev=266958&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll (added)<br>
+++ llvm/trunk/test/ThinLTO/X86/Inputs/alias_import.ll Thu Apr 21 00:47:17 2016<br>
@@ -0,0 +1,64 @@<br>
+<br>
+<br>
+<br>
+<br>
+@globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncWeakAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+define void @globalfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncWeakAlias = weak alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+define internal void @internalfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+define linkonce_odr void @linkonceODRfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+define weak_odr void @weakODRfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+define linkonce void @linkoncefunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+define weak void @weakfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
<br>
Added: llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll?rev=266958&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll?rev=266958&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll (added)<br>
+++ llvm/trunk/test/ThinLTO/X86/Inputs/alias_resolution.ll Thu Apr 21 00:47:17 2016<br>
@@ -0,0 +1,64 @@<br>
+<br>
+<br>
+<br>
+<br>
+@globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncWeakAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+@globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+define void @globalfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncWeakAlias = weak alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+@internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @internalfunc to void (...)*)<br>
+define internal void @internalfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+@linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+define linkonce_odr void @linkonceODRfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+@weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+define weak_odr void @weakODRfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+@linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+define linkonce void @linkoncefunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+@weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+define weak void @weakfunc() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
<br>
Added: llvm/trunk/test/ThinLTO/X86/alias_import.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_import.ll?rev=266958&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_import.ll?rev=266958&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ThinLTO/X86/alias_import.ll (added)<br>
+++ llvm/trunk/test/ThinLTO/X86/alias_import.ll Thu Apr 21 00:47:17 2016<br>
@@ -0,0 +1,168 @@<br>
+; RUN: opt -module-summary %s -o %t1.bc<br>
+; RUN: opt -module-summary %p/Inputs/alias_import.ll -o %t2.bc<br>
+; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc<br>
+; RUN: llvm-lto -thinlto-action=promote -thinlto-index %t.index.bc %t2.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=PROMOTE<br>
+; RUN: llvm-lto -thinlto-action=import -thinlto-index %t.index.bc %t1.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=IMPORT<br>
+<br>
+;<br>
+; Alias can't point to "available_externally", so we can only import an alias<br>
+; when we can import the aliasee with a linkage that won't be<br>
+; available_externally, i.e linkOnceODR. (FIXME this limitation could be lifted)<br>
+; PROMOTE-DAG: @globalfuncAlias = alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+; PROMOTE-DAG: @globalfuncWeakAlias = weak alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+; PROMOTE-DAG: @globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+; PROMOTE-DAG: @globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+; PROMOTE-DAG: @globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*)<br>
+; PROMOTE-DAG: @internalfuncAlias = alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)<br>
+; PROMOTE-DAG: @internalfuncWeakAlias = weak alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)<br>
+; PROMOTE-DAG: @internalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)<br>
+; PROMOTE-DAG: @internalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)<br>
+; PROMOTE-DAG: @internalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @internalfunc.llvm.0 to void (...)*)<br>
+; PROMOTE-DAG: @linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE-DAG: @linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE-DAG: @linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE-DAG: @linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE-DAG: @linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE-DAG: @weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+<br>
+; Only alias to LinkonceODR aliasee can be imported<br>
+; PROMOTE-DAG: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; Amongst these that are imported, check that we promote only linkonce->weak<br>
+; PROMOTE-DAG: @linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; PROMOTE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+<br>
+; These will be imported, check the linkage/renaming after promotion<br>
+; PROMOTE-DAG: define void @globalfunc()<br>
+; PROMOTE-DAG: define hidden void @internalfunc.llvm.0()<br>
+; PROMOTE-DAG: define linkonce_odr void @linkonceODRfunc()<br>
+; PROMOTE-DAG: define weak_odr void @weakODRfunc()<br>
+; PROMOTE-DAG: define linkonce void @linkoncefunc()<br>
+; PROMOTE-DAG: define weak void @weakfunc()<br>
+<br>
+; On the import side now, verify that aliases to a linkonce_odr are imported, but the weak (never import weak)<br>
+; IMPORT-DAG:  declare void @linkonceODRfuncWeakAlias<br>
+; IMPORT-DAG:  @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; IMPORT-DAG:  @linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; IMPORT-DAG:  @linkonceODRfuncWeakODRAlias = alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; IMPORT-DAG:  @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; IMPORT-DAG:  define linkonce_odr void @linkonceODRfunc()<br>
+<br>
+<br>
+; On the import side, these aliases are not imported (they don't point to a linkonce_odr)<br>
+; IMPORT-DAG: declare void @globalfuncAlias()<br>
+; IMPORT-DAG: declare void @globalfuncWeakAlias()<br>
+; IMPORT-DAG: declare void @globalfuncLinkonceAlias()<br>
+; IMPORT-DAG: declare void @globalfuncWeakODRAlias()<br>
+; IMPORT-DAG: declare void @globalfuncLinkonceODRAlias()<br>
+; IMPORT-DAG: declare void @internalfuncAlias()<br>
+; IMPORT-DAG: declare void @internalfuncWeakAlias()<br>
+; IMPORT-DAG: declare void @internalfuncLinkonceAlias()<br>
+; IMPORT-DAG: declare void @internalfuncWeakODRAlias()<br>
+; IMPORT-DAG: declare void @internalfuncLinkonceODRAlias()<br>
+; IMPORT-DAG: declare void @weakODRfuncAlias()<br>
+; IMPORT-DAG: declare void @weakODRfuncWeakAlias()<br>
+; IMPORT-DAG: declare void @weakODRfuncLinkonceAlias()<br>
+; IMPORT-DAG: declare void @weakODRfuncWeakODRAlias()<br>
+; IMPORT-DAG: declare void @weakODRfuncLinkonceODRAlias()<br>
+; IMPORT-DAG: declare void @linkoncefuncAlias()<br>
+; IMPORT-DAG: declare void @linkoncefuncWeakAlias()<br>
+; IMPORT-DAG: declare void @linkoncefuncLinkonceAlias()<br>
+; IMPORT-DAG: declare void @linkoncefuncWeakODRAlias()<br>
+; IMPORT-DAG: declare void @linkoncefuncLinkonceODRAlias()<br>
+; IMPORT-DAG: declare void @weakfuncAlias()<br>
+; IMPORT-DAG: declare void @weakfuncWeakAlias()<br>
+; IMPORT-DAG: declare void @weakfuncLinkonceAlias()<br>
+; IMPORT-DAG: declare void @weakfuncWeakODRAlias()<br>
+; IMPORT-DAG: declare void @weakfuncLinkonceODRAlias()<br>
+<br>
+<br>
+<br>
+define i32 @main() #0 {<br>
+entry:<br>
+  call void @globalfuncAlias()<br>
+  call void @globalfuncWeakAlias()<br>
+  call void @globalfuncLinkonceAlias()<br>
+  call void @globalfuncWeakODRAlias()<br>
+  call void @globalfuncLinkonceODRAlias()<br>
+<br>
+  call void @internalfuncAlias()<br>
+  call void @internalfuncWeakAlias()<br>
+  call void @internalfuncLinkonceAlias()<br>
+  call void @internalfuncWeakODRAlias()<br>
+  call void @internalfuncLinkonceODRAlias()<br>
+  call void @linkonceODRfuncAlias()<br>
+  call void @linkonceODRfuncWeakAlias()<br>
+  call void @linkonceODRfuncLinkonceAlias()<br>
+  call void @linkonceODRfuncWeakODRAlias()<br>
+  call void @linkonceODRfuncLinkonceODRAlias()<br>
+<br>
+  call void @weakODRfuncAlias()<br>
+  call void @weakODRfuncWeakAlias()<br>
+  call void @weakODRfuncLinkonceAlias()<br>
+  call void @weakODRfuncWeakODRAlias()<br>
+  call void @weakODRfuncLinkonceODRAlias()<br>
+<br>
+  call void @linkoncefuncAlias()<br>
+  call void @linkoncefuncWeakAlias()<br>
+  call void @linkoncefuncLinkonceAlias()<br>
+  call void @linkoncefuncWeakODRAlias()<br>
+  call void @linkoncefuncLinkonceODRAlias()<br>
+<br>
+  call void @weakfuncAlias()<br>
+  call void @weakfuncWeakAlias()<br>
+  call void @weakfuncLinkonceAlias()<br>
+  call void @weakfuncWeakODRAlias()<br>
+  call void @weakfuncLinkonceODRAlias()<br>
+<br>
+  ret i32 0<br>
+}<br>
+<br>
+<br>
+declare void @globalfuncAlias()<br>
+declare void @globalfuncWeakAlias()<br>
+declare void @globalfuncLinkonceAlias()<br>
+declare void @globalfuncWeakODRAlias()<br>
+declare void @globalfuncLinkonceODRAlias()<br>
+<br>
+declare void @internalfuncAlias()<br>
+declare void @internalfuncWeakAlias()<br>
+declare void @internalfuncLinkonceAlias()<br>
+declare void @internalfuncWeakODRAlias()<br>
+declare void @internalfuncLinkonceODRAlias()<br>
+<br>
+declare void @linkonceODRfuncAlias()<br>
+declare void @linkonceODRfuncWeakAlias()<br>
+declare void @linkonceODRfuncLinkonceAlias()<br>
+declare void @linkonceODRfuncWeakODRAlias()<br>
+declare void @linkonceODRfuncLinkonceODRAlias()<br>
+<br>
+declare void @weakODRfuncAlias()<br>
+declare void @weakODRfuncWeakAlias()<br>
+declare void @weakODRfuncLinkonceAlias()<br>
+declare void @weakODRfuncWeakODRAlias()<br>
+declare void @weakODRfuncLinkonceODRAlias()<br>
+<br>
+declare void @linkoncefuncAlias()<br>
+declare void @linkoncefuncWeakAlias()<br>
+declare void @linkoncefuncLinkonceAlias()<br>
+declare void @linkoncefuncWeakODRAlias()<br>
+declare void @linkoncefuncLinkonceODRAlias()<br>
+<br>
+declare void @weakfuncAlias()<br>
+declare void @weakfuncWeakAlias()<br>
+declare void @weakfuncLinkonceAlias()<br>
+declare void @weakfuncWeakODRAlias()<br>
+declare void @weakfuncLinkonceODRAlias()<br>
+<br>
+<br>
<br>
Added: llvm/trunk/test/ThinLTO/X86/alias_resolution.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_resolution.ll?rev=266958&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/alias_resolution.ll?rev=266958&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ThinLTO/X86/alias_resolution.ll (added)<br>
+++ llvm/trunk/test/ThinLTO/X86/alias_resolution.ll Thu Apr 21 00:47:17 2016<br>
@@ -0,0 +1,82 @@<br>
+; RUN: opt -module-summary %s -o %t1.bc<br>
+; RUN: opt -module-summary %p/Inputs/alias_resolution.ll -o %t2.bc<br>
+; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc<br>
+; 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<br>
+; 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<br>
+<br>
+; There is no importing going on with this IR, but let's check the ODR resolution for compile time<br>
+<br>
+; NOTPROMOTED: @linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc{{.*}} to void (...)*)<br>
+; PROMOTE_MOD1: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+; PROMOTE_MOD1: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*)<br>
+<br>
+; NOTPROMOTED: @weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc{{.*}} to void (...)*)<br>
+; PROMOTE_MOD1: @weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+; PROMOTE_MOD1: @weakODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc to void (...)*)<br>
+<br>
+; NOTPROMOTED: @linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc{{.*}} to void (...)*)<br>
+; PROMOTE_MOD1: @linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+; PROMOTE_MOD1: @linkoncefuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc to void (...)*)<br>
+<br>
+; NOTPROMOTED: @weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc{{.*}} to void (...)*)<br>
+; NOTPROMOTED: @weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc{{.*}} to void (...)*)<br>
+; FIXME: The "resolution" should turn one of these to linkonce_odr<br>
+; PROMOTE_MOD1: @weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+; PROMOTE_MOD1: @weakfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+; PROMOTE_MOD2: @weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc to void (...)*)<br>
+<br>
+<br>
+@linkonceODRfuncAlias = alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+@linkonceODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+@linkonceODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+@linkonceODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+@linkonceODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkonceODRfunc.mod1 to void (...)*)<br>
+define linkonce_odr void @linkonceODRfunc.mod1() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakODRfuncAlias = alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+@weakODRfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+@weakODRfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+@weakODRfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+@weakODRfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakODRfunc.mod1 to void (...)*)<br>
+define weak_odr void @weakODRfunc.mod1() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@linkoncefuncAlias = alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+@linkoncefuncWeakAlias = weak alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+@linkoncefuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+@linkoncefuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+@linkoncefuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @linkoncefunc.mod1 to void (...)*)<br>
+define linkonce void @linkoncefunc.mod1() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+@weakfuncAlias = alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+@weakfuncWeakAlias = weak alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+@weakfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+@weakfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+@weakfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @weakfunc.mod1 to void (...)*)<br>
+define weak void @weakfunc.mod1() {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
<br>
Modified: llvm/trunk/test/ThinLTO/X86/odr_resolution.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/odr_resolution.ll?rev=266958&r1=266957&r2=266958&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/odr_resolution.ll?rev=266958&r1=266957&r2=266958&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/ThinLTO/X86/odr_resolution.ll (original)<br>
+++ llvm/trunk/test/ThinLTO/X86/odr_resolution.ll Thu Apr 21 00:47:17 2016<br>
@@ -10,8 +10,8 @@<br>
 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-apple-macosx10.11.0"<br>
<br>
-; Alias are not optimized<br>
-; MOD1: @linkoncealias = linkonce_odr alias void (), void ()* @linkonceodrfuncwithalias<br>
+; Alias are resolved, but can't be turned into "available_externally"<br>
+; MOD1: @linkoncealias = weak_odr alias void (), void ()* @linkonceodrfuncwithalias<br>
 ; MOD2: @linkoncealias = linkonce_odr alias void (), void ()* @linkonceodrfuncwithalias<br>
 @linkoncealias = linkonce_odr alias void (), void ()* @linkonceodrfuncwithalias<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span><font color="#888888">-- <br><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td></tr></tbody></table></span></div>
</font></span></div>
</blockquote></div></div></div><div><div class="h5"><br><br clear="all"><div><br></div>-- <br><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td></tr></tbody></table></span></div>
</div></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> 408-460-2413</td></tr></tbody></table></span></div>
</div>