<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">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" class="gmail-phui-tag-view gmail-phui-tag-type-object gmail-" style="text-decoration:none;color:rgb(0,0,0);font-weight:bold"><span class="gmail-phui-tag-core-closed" style="text-decoration:line-through;color:rgba(0,0,0,0.498039)"><span class="gmail-phui-tag-core gmail-phui-tag-color-object" 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" class="gmail-remarkup-link" rel="noreferrer" style="text-decoration:none;color:rgb(24,85,157)">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" class="gmail-remarkup-link" rel="noreferrer" style="text-decoration:none;color:rgb(24,85,157)">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" class="gmail-phui-tag-view gmail-phui-tag-type-object gmail-" style="text-decoration:none;color:rgb(0,0,0);font-weight:bold"><span class="gmail-phui-tag-core gmail-phui-tag-color-object" 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><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"><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">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">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>-- <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>