<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Sun, Feb 28, 2016 at 9:21 AM NAKAMURA Takumi via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: chapuni<br>
Date: Sun Feb 28 11:17:00 2016<br>
New Revision: 262188<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=262188&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=262188&view=rev</a><br>
Log:<br>
[PM] Appease mingw32's auto-import DLL build with minimal tweaks, with fix for clang.<br></blockquote><div><br></div><div>As I mentioned to you in IRC, I really dislike this change.</div><div><br></div><div>I think this needs discussion and at least some substantial changes in the way of comments to explain what is going on and why it is needed.</div><div><br></div><div>If we needed to get your bot working again, I would frankly have been happier to just revert my patch. But now we have to live with this patch instead because the merge conflicts at this point will be a nightmare.</div><div><br></div><div><br></div><div>So, can you please try to walk everyone through what the requirement is here? Your commit log does not contain a lot of details... My best guess based on the nature of your change is that mingw32 has a DLL building mode which is buggy because it doesn't produce a strong definition of the static object in the base class the derived class is defined.</div><div><br></div><div>If that is the case, I am really concerned about continuing to support this configuration with LLVM. We have had numerous, painful problems supporting mingw in the past, and this seems like it is handcuffing us unreasonably.</div><div><br></div><div>And if I understand correctly, mingw32 works just fine when not using a particular DLL configuration?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
char AnalysisBase::ID should be declared as extern and defined in one module.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Analysis/AliasAnalysis.h<br>
    llvm/trunk/include/llvm/Analysis/AssumptionCache.h<br>
    llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h<br>
    llvm/trunk/include/llvm/Analysis/DominanceFrontier.h<br>
    llvm/trunk/include/llvm/Analysis/LazyCallGraph.h<br>
    llvm/trunk/include/llvm/Analysis/LoopInfo.h<br>
    llvm/trunk/include/llvm/Analysis/LoopPassManager.h<br>
    llvm/trunk/include/llvm/Analysis/PostDominators.h<br>
    llvm/trunk/include/llvm/Analysis/RegionInfo.h<br>
    llvm/trunk/include/llvm/Analysis/ScalarEvolution.h<br>
    llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h<br>
    llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h<br>
    llvm/trunk/include/llvm/IR/Dominators.h<br>
    llvm/trunk/include/llvm/IR/PassManager.h<br>
    llvm/trunk/lib/Analysis/AliasAnalysis.cpp<br>
    llvm/trunk/lib/Analysis/AssumptionCache.cpp<br>
    llvm/trunk/lib/Analysis/CGSCCPassManager.cpp<br>
    llvm/trunk/lib/Analysis/DominanceFrontier.cpp<br>
    llvm/trunk/lib/Analysis/LazyCallGraph.cpp<br>
    llvm/trunk/lib/Analysis/LoopInfo.cpp<br>
    llvm/trunk/lib/Analysis/LoopPassManager.cpp<br>
    llvm/trunk/lib/Analysis/PostDominators.cpp<br>
    llvm/trunk/lib/Analysis/RegionInfo.cpp<br>
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp<br>
    llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp<br>
    llvm/trunk/lib/Analysis/TargetTransformInfo.cpp<br>
    llvm/trunk/lib/IR/Dominators.cpp<br>
    llvm/trunk/lib/IR/PassManager.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Sun Feb 28 11:17:00 2016<br>
@@ -1024,6 +1024,8 @@ private:<br>
   }<br>
 };<br>
<br>
+extern template class AnalysisBase<AAManager>;<br>
+<br>
 /// A wrapper pass to provide the legacy pass manager access to a suitably<br>
 /// prepared AAResults object.<br>
 class AAResultsWrapperPass : public FunctionPass {<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/AssumptionCache.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Sun Feb 28 11:17:00 2016<br>
@@ -105,6 +105,8 @@ struct AssumptionAnalysis : AnalysisBase<br>
   AssumptionCache run(Function &F) { return AssumptionCache(F); }<br>
 };<br>
<br>
+extern template class AnalysisBase<AssumptionAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c AssumptionAnalysis results.<br>
 class AssumptionPrinterPass : public PassBase<AssumptionPrinterPass> {<br>
   raw_ostream &OS;<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Sun Feb 28 11:17:00 2016<br>
@@ -48,12 +48,16 @@ extern template class InnerAnalysisManag<br>
 typedef InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module><br>
     CGSCCAnalysisManagerModuleProxy;<br>
<br>
+extern template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;<br>
+<br>
 extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,<br>
                                                 LazyCallGraph::SCC>;<br>
 /// A proxy from a \c ModuleAnalysisManager to an \c SCC.<br>
 typedef OuterAnalysisManagerProxy<ModuleAnalysisManager, LazyCallGraph::SCC><br>
     ModuleAnalysisManagerCGSCCProxy;<br>
<br>
+extern template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;<br>
+<br>
 /// \brief The core module pass which does a post-order walk of the SCCs and<br>
 /// runs a CGSCC pass over each one.<br>
 ///<br>
@@ -144,6 +148,8 @@ extern template class InnerAnalysisManag<br>
 typedef InnerAnalysisManagerProxy<FunctionAnalysisManager, LazyCallGraph::SCC><br>
     FunctionAnalysisManagerCGSCCProxy;<br>
<br>
+extern template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;<br>
+<br>
 extern template class OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>;<br>
 /// A proxy from a \c CGSCCAnalysisManager to a \c Function.<br>
 typedef OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function><br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/DominanceFrontier.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/DominanceFrontier.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/DominanceFrontier.h Sun Feb 28 11:17:00 2016<br>
@@ -176,6 +176,8 @@ struct DominanceFrontierAnalysis : Analy<br>
   DominanceFrontier run(Function &F, AnalysisManager<Function> *AM);<br>
 };<br>
<br>
+extern template class AnalysisBase<DominanceFrontierAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c DominanceFrontier.<br>
 class DominanceFrontierPrinterPass<br>
     : public PassBase<DominanceFrontierPrinterPass> {<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/LazyCallGraph.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Sun Feb 28 11:17:00 2016<br>
@@ -906,6 +906,8 @@ struct LazyCallGraphAnalysis : AnalysisB<br>
   LazyCallGraph run(Module &M) { return LazyCallGraph(M); }<br>
 };<br>
<br>
+extern template class AnalysisBase<LazyCallGraphAnalysis>;<br>
+<br>
 /// A pass which prints the call graph to a \c raw_ostream.<br>
 ///<br>
 /// This is primarily useful for testing the analysis.<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Sun Feb 28 11:17:00 2016<br>
@@ -793,6 +793,8 @@ struct LoopAnalysis : AnalysisBase<LoopA<br>
   LoopInfo run(Function &F, AnalysisManager<Function> *AM);<br>
 };<br>
<br>
+extern template class AnalysisBase<LoopAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c LoopAnalysis results.<br>
 class LoopPrinterPass : public PassBase<LoopPrinterPass> {<br>
   raw_ostream &OS;<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/LoopPassManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LoopPassManager.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LoopPassManager.h Sun Feb 28 11:17:00 2016<br>
@@ -43,6 +43,8 @@ extern template class InnerAnalysisManag<br>
 typedef InnerAnalysisManagerProxy<LoopAnalysisManager, Function><br>
     LoopAnalysisManagerFunctionProxy;<br>
<br>
+extern template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;<br>
+<br>
 extern template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>;<br>
 /// A proxy from a \c FunctionAnalysisManager to a \c Loop.<br>
 typedef OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop><br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/PostDominators.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/PostDominators.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/PostDominators.h Sun Feb 28 11:17:00 2016<br>
@@ -46,6 +46,8 @@ struct PostDominatorTreeAnalysis : Analy<br>
   PostDominatorTree run(Function &F);<br>
 };<br>
<br>
+extern template class AnalysisBase<PostDominatorTreeAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c PostDominatorTree.<br>
 class PostDominatorTreePrinterPass<br>
     : public PassBase<PostDominatorTreePrinterPass> {<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/RegionInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/RegionInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/RegionInfo.h Sun Feb 28 11:17:00 2016<br>
@@ -929,6 +929,8 @@ struct RegionInfoAnalysis : AnalysisBase<br>
   RegionInfo run(Function &F, AnalysisManager<Function> *AM);<br>
 };<br>
<br>
+extern template class AnalysisBase<RegionInfoAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c RegionInfo.<br>
 class RegionInfoPrinterPass : public PassBase<RegionInfoPrinterPass> {<br>
   raw_ostream &OS;<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Sun Feb 28 11:17:00 2016<br>
@@ -1421,6 +1421,8 @@ namespace llvm {<br>
     ScalarEvolution run(Function &F, AnalysisManager<Function> *AM);<br>
   };<br>
<br>
+  extern template class AnalysisBase<ScalarEvolutionAnalysis>;<br>
+<br>
   /// \brief Printer pass for the \c ScalarEvolutionAnalysis results.<br>
   class ScalarEvolutionPrinterPass<br>
       : public PassBase<ScalarEvolutionPrinterPass> {<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h Sun Feb 28 11:17:00 2016<br>
@@ -299,6 +299,8 @@ private:<br>
   TargetLibraryInfoImpl &lookupInfoImpl(Triple T);<br>
 };<br>
<br>
+extern template class AnalysisBase<TargetLibraryAnalysis>;<br>
+<br>
 class TargetLibraryInfoWrapperPass : public ImmutablePass {<br>
   TargetLibraryInfoImpl TLIImpl;<br>
   TargetLibraryInfo TLI;<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Sun Feb 28 11:17:00 2016<br>
@@ -938,6 +938,8 @@ private:<br>
   static Result getDefaultTTI(const Function &F);<br>
 };<br>
<br>
+extern template class AnalysisBase<TargetIRAnalysis>;<br>
+<br>
 /// \brief Wrapper pass for TargetTransformInfo.<br>
 ///<br>
 /// This pass can be constructed from a TTI object which it stores internally<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Dominators.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Dominators.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Dominators.h Sun Feb 28 11:17:00 2016<br>
@@ -190,6 +190,8 @@ struct DominatorTreeAnalysis : AnalysisB<br>
   DominatorTree run(Function &F);<br>
 };<br>
<br>
+extern template class AnalysisBase<DominatorTreeAnalysis>;<br>
+<br>
 /// \brief Printer pass for the \c DominatorTree.<br>
 class DominatorTreePrinterPass : public PassBase<DominatorTreePrinterPass> {<br>
   raw_ostream &OS;<br>
<br>
Modified: llvm/trunk/include/llvm/IR/PassManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/PassManager.h (original)<br>
+++ llvm/trunk/include/llvm/IR/PassManager.h Sun Feb 28 11:17:00 2016<br>
@@ -749,6 +749,8 @@ extern template class InnerAnalysisManag<br>
 typedef InnerAnalysisManagerProxy<FunctionAnalysisManager, Module><br>
     FunctionAnalysisManagerModuleProxy;<br>
<br>
+extern template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;<br>
+<br>
 /// \brief A function analysis which acts as a proxy for a module analysis<br>
 /// manager.<br>
 ///<br>
<br>
Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Sun Feb 28 11:17:00 2016<br>
@@ -390,6 +390,9 @@ bool AAResults::canInstructionRangeModRe<br>
 // Provide a definition for the root virtual destructor.<br>
 AAResults::Concept::~Concept() {}<br>
<br>
+// Provide a definition for the static object used to identify passes.<br>
+template class llvm::AnalysisBase<AAManager>;<br>
+<br>
 namespace {<br>
 /// A wrapper pass for external alias analyses. This just squirrels away the<br>
 /// callback used to run any analyses and register their results.<br>
<br>
Modified: llvm/trunk/lib/Analysis/AssumptionCache.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/AssumptionCache.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/AssumptionCache.cpp Sun Feb 28 11:17:00 2016<br>
@@ -74,6 +74,8 @@ void AssumptionCache::registerAssumption<br>
 #endif<br>
 }<br>
<br>
+template class llvm::AnalysisBase<AssumptionAnalysis>;<br>
+<br>
 PreservedAnalyses AssumptionPrinterPass::run(Function &F,<br>
                                              AnalysisManager<Function> *AM) {<br>
   AssumptionCache &AC = AM->getResult<AssumptionAnalysis>(F);<br>
<br>
Modified: llvm/trunk/lib/Analysis/CGSCCPassManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Sun Feb 28 11:17:00 2016<br>
@@ -18,9 +18,12 @@ namespace llvm {<br>
 template class PassManager<LazyCallGraph::SCC>;<br>
 template class AnalysisManager<LazyCallGraph::SCC>;<br>
 template class InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module>;<br>
+template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;<br>
 template class OuterAnalysisManagerProxy<ModuleAnalysisManager,<br>
                                          LazyCallGraph::SCC>;<br>
+template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;<br>
 template class InnerAnalysisManagerProxy<FunctionAnalysisManager,<br>
                                          LazyCallGraph::SCC>;<br>
+template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;<br>
 template class OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>;<br>
 }<br>
<br>
Modified: llvm/trunk/lib/Analysis/DominanceFrontier.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/DominanceFrontier.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/DominanceFrontier.cpp Sun Feb 28 11:17:00 2016<br>
@@ -56,6 +56,8 @@ LLVM_DUMP_METHOD void DominanceFrontierW<br>
 }<br>
 #endif<br>
<br>
+template class llvm::AnalysisBase<DominanceFrontierAnalysis>;<br>
+<br>
 DominanceFrontier DominanceFrontierAnalysis::run(Function &F,<br>
                                                  FunctionAnalysisManager *AM) {<br>
   DominanceFrontier DF;<br>
<br>
Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Sun Feb 28 11:17:00 2016<br>
@@ -1499,6 +1499,8 @@ LazyCallGraph::RefSCC *LazyCallGraph::ge<br>
   }<br>
 }<br>
<br>
+template class llvm::AnalysisBase<LazyCallGraphAnalysis>;<br>
+<br>
 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}<br>
<br>
 static void printNode(raw_ostream &OS, LazyCallGraph::Node &N) {<br>
<br>
Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LoopInfo.cpp Sun Feb 28 11:17:00 2016<br>
@@ -641,6 +641,8 @@ void LoopInfo::markAsRemoved(Loop *Unloo<br>
   }<br>
 }<br>
<br>
+template class llvm::AnalysisBase<LoopAnalysis>;<br>
+<br>
 LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> *AM) {<br>
   // FIXME: Currently we create a LoopInfo from scratch for every function.<br>
   // This may prove to be too wasteful due to deallocating and re-allocating<br>
<br>
Modified: llvm/trunk/lib/Analysis/LoopPassManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LoopPassManager.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LoopPassManager.cpp Sun Feb 28 11:17:00 2016<br>
@@ -16,5 +16,6 @@ namespace llvm {<br>
 template class PassManager<Loop>;<br>
 template class AnalysisManager<Loop>;<br>
 template class InnerAnalysisManagerProxy<LoopAnalysisManager, Function>;<br>
+template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;<br>
 template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>;<br>
 }<br>
<br>
Modified: llvm/trunk/lib/Analysis/PostDominators.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/PostDominators.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/PostDominators.cpp Sun Feb 28 11:17:00 2016<br>
@@ -44,6 +44,8 @@ FunctionPass* llvm::createPostDomTree()<br>
   return new PostDominatorTreeWrapperPass();<br>
 }<br>
<br>
+template class llvm::AnalysisBase<PostDominatorTreeAnalysis>;<br>
+<br>
 PostDominatorTree PostDominatorTreeAnalysis::run(Function &F) {<br>
   PostDominatorTree PDT;<br>
   PDT.recalculate(F);<br>
<br>
Modified: llvm/trunk/lib/Analysis/RegionInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/RegionInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/RegionInfo.cpp Sun Feb 28 11:17:00 2016<br>
@@ -185,6 +185,8 @@ namespace llvm {<br>
 // RegionInfoAnalysis implementation<br>
 //<br>
<br>
+template class llvm::AnalysisBase<RegionInfoAnalysis>;<br>
+<br>
 RegionInfo RegionInfoAnalysis::run(Function &F, AnalysisManager<Function> *AM) {<br>
   RegionInfo RI;<br>
   auto *DT = &AM->getResult<DominatorTreeAnalysis>(F);<br>
<br>
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sun Feb 28 11:17:00 2016<br>
@@ -9554,6 +9554,8 @@ void ScalarEvolution::verify() const {<br>
   // TODO: Verify more things.<br>
 }<br>
<br>
+template class llvm::AnalysisBase<ScalarEvolutionAnalysis>;<br>
+<br>
 ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,<br>
                                              AnalysisManager<Function> *AM) {<br>
   return ScalarEvolution(F, AM->getResult<TargetLibraryAnalysis>(F),<br>
<br>
Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Sun Feb 28 11:17:00 2016<br>
@@ -636,6 +636,8 @@ TargetLibraryInfoWrapperPass::TargetLibr<br>
   initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());<br>
 }<br>
<br>
+template class llvm::AnalysisBase<TargetLibraryAnalysis>;<br>
+<br>
 // Register the basic pass.<br>
 INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",<br>
                 "Target Library Information", false, true)<br>
<br>
Modified: llvm/trunk/lib/Analysis/TargetTransformInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Sun Feb 28 11:17:00 2016<br>
@@ -377,6 +377,8 @@ TargetIRAnalysis::Result TargetIRAnalysi<br>
   return TTICallback(F);<br>
 }<br>
<br>
+template class llvm::AnalysisBase<TargetIRAnalysis>;<br>
+<br>
 TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) {<br>
   return Result(F.getParent()->getDataLayout());<br>
 }<br>
<br>
Modified: llvm/trunk/lib/IR/Dominators.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Dominators.cpp (original)<br>
+++ llvm/trunk/lib/IR/Dominators.cpp Sun Feb 28 11:17:00 2016<br>
@@ -308,6 +308,8 @@ DominatorTree DominatorTreeAnalysis::run<br>
   return DT;<br>
 }<br>
<br>
+template class llvm::AnalysisBase<DominatorTreeAnalysis>;<br>
+<br>
 DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}<br>
<br>
 PreservedAnalyses DominatorTreePrinterPass::run(Function &F,<br>
<br>
Modified: llvm/trunk/lib/IR/PassManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=262188&r1=262187&r2=262188&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/PassManager.cpp (original)<br>
+++ llvm/trunk/lib/IR/PassManager.cpp Sun Feb 28 11:17:00 2016<br>
@@ -20,5 +20,6 @@ template class PassManager<Function>;<br>
 template class AnalysisManager<Module>;<br>
 template class AnalysisManager<Function>;<br>
 template class InnerAnalysisManagerProxy<FunctionAnalysisManager, Module>;<br>
+template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;<br>
 template class OuterAnalysisManagerProxy<ModuleAnalysisManager, Function>;<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></div>