<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 11, 2016 at 2:22 AM, Chandler Carruth 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: chandlerc<br>
Date: Fri Mar 11 04:22:49 2016<br>
New Revision: 263216<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=263216&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=263216&view=rev</a><br>
Log:<br>
[PM] Implement the final conclusion as to how the analysis IDs should<br>
work in the face of the limitations of DLLs and templated static<br>
variables.<br>
<br>
This requires passes that use the AnalysisBase mixin provide a static<br>
variable themselves. So as to keep their APIs clean, I've made these<br>
private and befriended the CRTP base class (which is the common<br>
practice).<br></blockquote><div><br>Reckon it's worth the two lines rather than one where it's public? It'd be a little bit of a wart in autogenerated public-only docs, I'll admit, but doesn't seem likely anyone would actually get in the way or anything?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I've added documentation to AnalysisBase for why this is necessary and<br>
at what point we can go back to the much simpler system.<br>
<br>
This is clearly a better pattern than the extern template as it caught<br>
*numerous* places where the template magic hadn't been applied and<br>
things were "just working" but would eventually have broken<br>
mysteriously.<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/BasicAliasAnalysis.h<br>
    llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h<br>
    llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h<br>
    llvm/trunk/include/llvm/Analysis/CallGraph.h<br>
    llvm/trunk/include/llvm/Analysis/DominanceFrontier.h<br>
    llvm/trunk/include/llvm/Analysis/GlobalsModRef.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/MemoryDependenceAnalysis.h<br>
    llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.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/ScalarEvolutionAliasAnalysis.h<br>
    llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h<br>
    llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h<br>
    llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h<br>
    llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.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/BasicAliasAnalysis.cpp<br>
    llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp<br>
    llvm/trunk/lib/Analysis/CGSCCPassManager.cpp<br>
    llvm/trunk/lib/Analysis/CallGraph.cpp<br>
    llvm/trunk/lib/Analysis/DominanceFrontier.cpp<br>
    llvm/trunk/lib/Analysis/GlobalsModRef.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/MemoryDependenceAnalysis.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/ScalarEvolutionAliasAnalysis.cpp<br>
    llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp<br>
    llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp<br>
    llvm/trunk/lib/Analysis/TargetTransformInfo.cpp<br>
    llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp<br>
    llvm/trunk/lib/IR/Dominators.cpp<br>
    llvm/trunk/lib/IR/PassManager.cpp<br>
    llvm/trunk/lib/Passes/PassBuilder.cpp<br>
    llvm/trunk/unittests/IR/PassManagerTest.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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -874,6 +874,9 @@ public:<br>
   }<br>
<br>
 private:<br>
+  friend AnalysisBase<AAManager>;<br>
+  static char PassID;<br>
+<br>
   SmallVector<void (*)(Function &F, AnalysisManager<Function> &AM,<br>
                        AAResults &AAResults),<br>
               4> ResultGetters;<br>
@@ -895,8 +898,6 @@ 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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Fri Mar 11 04:22:49 2016<br>
@@ -93,7 +93,11 @@ public:<br>
 ///<br>
 /// This analysis is intended for use with the new pass manager and will vend<br>
 /// assumption caches for a given function.<br>
-struct AssumptionAnalysis : AnalysisBase<AssumptionAnalysis> {<br>
+class AssumptionAnalysis : public AnalysisBase<AssumptionAnalysis> {<br>
+  friend AnalysisBase<AssumptionAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef AssumptionCache Result;<br>
<br>
   AssumptionAnalysis() {}<br>
@@ -105,8 +109,6 @@ 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/BasicAliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -180,7 +180,11 @@ private:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct BasicAA : AnalysisBase<BasicAA> {<br>
+class BasicAA : public AnalysisBase<BasicAA> {<br>
+  friend AnalysisBase<BasicAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef BasicAAResult Result;<br>
<br>
   BasicAAResult run(Function &F, AnalysisManager<Function> *AM);<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -109,7 +109,11 @@ private:<br>
 ///<br>
 /// FIXME: We really should refactor CFL to use the analysis more heavily, and<br>
 /// in particular to leverage invalidation to trigger re-computation of sets.<br>
-struct CFLAA : AnalysisBase<CFLAA> {<br>
+class CFLAA : public AnalysisBase<CFLAA> {<br>
+  friend AnalysisBase<CFLAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef CFLAAResult Result;<br>
<br>
   CFLAAResult run(Function &F, AnalysisManager<Function> *AM);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Fri Mar 11 04:22:49 2016<br>
@@ -48,16 +48,12 @@ 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>
@@ -148,8 +144,6 @@ 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/CallGraph.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/CallGraph.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/CallGraph.h Fri Mar 11 04:22:49 2016<br>
@@ -295,7 +295,10 @@ private:<br>
 /// This class implements the concept of an analysis pass used by the \c<br>
 /// ModuleAnalysisManager to run an analysis over a module and cache the<br>
 /// resulting data.<br>
-struct CallGraphAnalysis : AnalysisBase<CallGraphAnalysis> {<br>
+class CallGraphAnalysis : public AnalysisBase<CallGraphAnalysis> {<br>
+  friend AnalysisBase<CallGraphAnalysis>;<br>
+  static char PassID;<br>
+<br>
 public:<br>
   /// \brief A formulaic typedef to inform clients of the result type.<br>
   typedef CallGraph Result;<br>
@@ -306,9 +309,6 @@ public:<br>
   CallGraph run(Module &M) { return CallGraph(M); }<br>
 };<br>
<br>
-/// Instantiated in CallGraph.cpp<br>
-extern template class llvm::AnalysisBase<CallGraphAnalysis>;<br>
-<br>
 /// \brief Printer pass for the \c CallGraphAnalysis results.<br>
 class CallGraphPrinterPass : public PassBase<CallGraphPrinterPass> {<br>
   raw_ostream &OS;<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/DominanceFrontier.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/DominanceFrontier.h Fri Mar 11 04:22:49 2016<br>
@@ -168,7 +168,12 @@ extern template class DominanceFrontierB<br>
 extern template class ForwardDominanceFrontierBase<BasicBlock>;<br>
<br>
 /// \brief Analysis pass which computes a \c DominanceFrontier.<br>
-struct DominanceFrontierAnalysis : AnalysisBase<DominanceFrontierAnalysis> {<br>
+class DominanceFrontierAnalysis<br>
+    : public AnalysisBase<DominanceFrontierAnalysis> {<br>
+  friend AnalysisBase<DominanceFrontierAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   /// \brief Provide the result typedef for this analysis pass.<br>
   typedef DominanceFrontier Result;<br>
<br>
@@ -176,8 +181,6 @@ 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/GlobalsModRef.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/GlobalsModRef.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/GlobalsModRef.h Fri Mar 11 04:22:49 2016<br>
@@ -118,7 +118,11 @@ private:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct GlobalsAA : AnalysisBase<GlobalsAA> {<br>
+class GlobalsAA : public AnalysisBase<GlobalsAA> {<br>
+  friend AnalysisBase<GlobalsAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef GlobalsAAResult Result;<br>
<br>
   GlobalsAAResult run(Module &M, AnalysisManager<Module> *AM);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Fri Mar 11 04:22:49 2016<br>
@@ -895,7 +895,11 @@ template <> struct GraphTraits<LazyCallG<br>
 };<br>
<br>
 /// An analysis pass which computes the call graph for a module.<br>
-struct LazyCallGraphAnalysis : AnalysisBase<LazyCallGraphAnalysis> {<br>
+class LazyCallGraphAnalysis : public AnalysisBase<LazyCallGraphAnalysis> {<br>
+  friend AnalysisBase<LazyCallGraphAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   /// Inform generic clients of the result type.<br>
   typedef LazyCallGraph Result;<br>
<br>
@@ -906,8 +910,6 @@ 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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Fri Mar 11 04:22:49 2016<br>
@@ -787,14 +787,16 @@ template <> struct GraphTraits<Loop*> {<br>
 };<br>
<br>
 /// \brief Analysis pass that exposes the \c LoopInfo for a function.<br>
-struct LoopAnalysis : AnalysisBase<LoopAnalysis> {<br>
+class LoopAnalysis : public AnalysisBase<LoopAnalysis> {<br>
+  friend AnalysisBase<LoopAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef LoopInfo Result;<br>
<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/LoopPassManager.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/LoopPassManager.h Fri Mar 11 04:22:49 2016<br>
@@ -43,8 +43,6 @@ 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/MemoryDependenceAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -471,7 +471,11 @@ private:<br>
 ///<br>
 /// This is essentially a no-op because the results are computed entirely<br>
 /// lazily.<br>
-struct MemoryDependenceAnalysis : AnalysisBase<MemoryDependenceAnalysis> {<br>
+class MemoryDependenceAnalysis : public AnalysisBase<MemoryDependenceAnalysis> {<br>
+  friend AnalysisBase<MemoryDependenceAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef MemoryDependenceResults Result;<br>
<br>
   MemoryDependenceResults run(Function &F, AnalysisManager<Function> *AM);<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -61,7 +61,11 @@ public:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct ObjCARCAA : AnalysisBase<ObjCARCAA> {<br>
+class ObjCARCAA : public AnalysisBase<ObjCARCAA> {<br>
+  friend AnalysisBase<ObjCARCAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef ObjCARCAAResult Result;<br>
<br>
   ObjCARCAAResult run(Function &F, AnalysisManager<Function> *AM);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/PostDominators.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/PostDominators.h Fri Mar 11 04:22:49 2016<br>
@@ -37,7 +37,12 @@ struct PostDominatorTree : public Domina<br>
 };<br>
<br>
 /// \brief Analysis pass which computes a \c PostDominatorTree.<br>
-struct PostDominatorTreeAnalysis : AnalysisBase<PostDominatorTreeAnalysis> {<br>
+class PostDominatorTreeAnalysis<br>
+    : public AnalysisBase<PostDominatorTreeAnalysis> {<br>
+  friend AnalysisBase<PostDominatorTreeAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   /// \brief Provide the result typedef for this analysis pass.<br>
   typedef PostDominatorTree Result;<br>
<br>
@@ -46,8 +51,6 @@ 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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/RegionInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/RegionInfo.h Fri Mar 11 04:22:49 2016<br>
@@ -923,14 +923,16 @@ public:<br>
 };<br>
<br>
 /// \brief Analysis pass that exposes the \c RegionInfo for a function.<br>
-struct RegionInfoAnalysis : AnalysisBase<RegionInfoAnalysis> {<br>
+class RegionInfoAnalysis : public AnalysisBase<RegionInfoAnalysis> {<br>
+  friend AnalysisBase<RegionInfoAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef RegionInfo Result;<br>
<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Fri Mar 11 04:22:49 2016<br>
@@ -1430,14 +1430,16 @@ namespace llvm {<br>
   };<br>
<br>
   /// \brief Analysis pass that exposes the \c ScalarEvolution for a function.<br>
-  struct ScalarEvolutionAnalysis : AnalysisBase<ScalarEvolutionAnalysis> {<br>
+  class ScalarEvolutionAnalysis : public AnalysisBase<ScalarEvolutionAnalysis> {<br>
+    friend AnalysisBase<ScalarEvolutionAnalysis>;<br>
+    static char PassID;<br>
+<br>
+  public:<br>
     typedef ScalarEvolution Result;<br>
<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/ScalarEvolutionAliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -38,7 +38,11 @@ private:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct SCEVAA : AnalysisBase<SCEVAA> {<br>
+class SCEVAA : public AnalysisBase<SCEVAA> {<br>
+  friend AnalysisBase<SCEVAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef SCEVAAResult Result;<br>
<br>
   SCEVAAResult run(Function &F, AnalysisManager<Function> *AM);<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h Fri Mar 11 04:22:49 2016<br>
@@ -47,7 +47,11 @@ private:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct ScopedNoAliasAA : AnalysisBase<ScopedNoAliasAA> {<br>
+class ScopedNoAliasAA : public AnalysisBase<ScopedNoAliasAA> {<br>
+  friend AnalysisBase<ScopedNoAliasAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef ScopedNoAliasAAResult Result;<br>
<br>
   ScopedNoAliasAAResult run(Function &F, AnalysisManager<Function> *AM);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h Fri Mar 11 04:22:49 2016<br>
@@ -292,6 +292,9 @@ public:<br>
   TargetLibraryInfo run(Function &F);<br>
<br>
 private:<br>
+  friend AnalysisBase<TargetLibraryAnalysis>;<br>
+  static char PassID;<br>
+<br>
   Optional<TargetLibraryInfoImpl> PresetInfoImpl;<br>
<br>
   StringMap<std::unique_ptr<TargetLibraryInfoImpl>> Impls;<br>
@@ -299,8 +302,6 @@ 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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Fri Mar 11 04:22:49 2016<br>
@@ -922,6 +922,9 @@ public:<br>
   Result run(const Function &F);<br>
<br>
 private:<br>
+  friend AnalysisBase<TargetIRAnalysis>;<br>
+  static char PassID;<br>
+<br>
   /// \brief The callback used to produce a result.<br>
   ///<br>
   /// We use a completely opaque callback so that targets can provide whatever<br>
@@ -938,8 +941,6 @@ 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/Analysis/TypeBasedAliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h Fri Mar 11 04:22:49 2016<br>
@@ -48,7 +48,11 @@ private:<br>
 };<br>
<br>
 /// Analysis pass providing a never-invalidated alias analysis result.<br>
-struct TypeBasedAA : AnalysisBase<TypeBasedAA> {<br>
+class TypeBasedAA : public AnalysisBase<TypeBasedAA> {<br>
+  friend AnalysisBase<TypeBasedAA>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   typedef TypeBasedAAResult Result;<br>
<br>
   TypeBasedAAResult run(Function &F, AnalysisManager<Function> *AM);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Dominators.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Dominators.h Fri Mar 11 04:22:49 2016<br>
@@ -182,7 +182,11 @@ template <> struct GraphTraits<Dominator<br>
 };<br>
<br>
 /// \brief Analysis pass which computes a \c DominatorTree.<br>
-struct DominatorTreeAnalysis : AnalysisBase<DominatorTreeAnalysis> {<br>
+class DominatorTreeAnalysis : public AnalysisBase<DominatorTreeAnalysis> {<br>
+  friend AnalysisBase<DominatorTreeAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   /// \brief Provide the result typedef for this analysis pass.<br>
   typedef DominatorTree Result;<br>
<br>
@@ -190,8 +194,6 @@ 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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/PassManager.h (original)<br>
+++ llvm/trunk/include/llvm/IR/PassManager.h Fri Mar 11 04:22:49 2016<br>
@@ -183,17 +183,23 @@ template <typename DerivedT> struct Pass<br>
 /// A CRTP mix-in base class to help define types that are valid analyses.<br>
 ///<br>
 /// This provides some boiler plate for types that are analysis passes.<br>
-template <typename DerivedT> class AnalysisBase : public PassBase<DerivedT> {<br>
-  static char PassID;<br>
-<br>
-public:<br>
+template <typename DerivedT> struct AnalysisBase : PassBase<DerivedT> {<br>
   /// Returns an opaque, unique ID for this pass type.<br>
-  static void *ID() { return (void *)&PassID; }<br>
+  ///<br>
+  /// Note that this requires the derived type provide a static member whose<br>
+  /// address can be converted to a void pointer.<br>
+  ///<br>
+  /// FIXME: The only reason the derived type needs to provide this rather than<br>
+  /// this mixin providing it is due to broken implementations which cannot<br>
+  /// correctly unique a templated static so that they have the same addresses<br>
+  /// for each instantiation and are definitively emitted once for each<br>
+  /// instantiation. The only currently known platform with this limitation are<br>
+  /// Windows DLL builds, specifically building each part of LLVM as a DLL. If<br>
+  /// we ever remove that build configuration, this mixin can provide the<br>
+  /// static PassID as well.<br>
+  static void *ID() { return (void *)&DerivedT::PassID; }<br>
 };<br>
<br>
-/// Private static data to provide unique ID.<br>
-template <typename DerivedT> char AnalysisBase<DerivedT>::PassID;<br>
-<br>
 /// \brief Manages a sequence of passes over units of IR.<br>
 ///<br>
 /// A pass manager contains a sequence of passes to run over units of IR. It is<br>
@@ -740,17 +746,21 @@ public:<br>
   Result run(IRUnitT &IR) { return Result(*AM); }<br>
<br>
 private:<br>
+  friend AnalysisBase<InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;<br>
+  static char PassID;<br>
+<br>
   AnalysisManagerT *AM;<br>
 };<br>
<br>
+template <typename AnalysisManagerT, typename IRUnitT><br>
+char InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;<br>
+<br>
 extern template class InnerAnalysisManagerProxy<FunctionAnalysisManager,<br>
                                                 Module>;<br>
 /// Provide the \c FunctionAnalysisManager to \c Module proxy.<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>
@@ -808,9 +818,15 @@ public:<br>
   Result run(IRUnitT &) { return Result(*AM); }<br>
<br>
 private:<br>
+  friend AnalysisBase<OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;<br>
+  static char PassID;<br>
+<br>
   const AnalysisManagerT *AM;<br>
 };<br>
<br>
+template <typename AnalysisManagerT, typename IRUnitT><br>
+char OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;<br>
+<br>
 extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,<br>
                                                 Function>;<br>
 /// Provide the \c ModuleAnalysisManager to \c Fucntion proxy.<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -504,7 +504,7 @@ bool AAResults::canInstructionRangeModRe<br>
 AAResults::Concept::~Concept() {}<br>
<br>
 // Provide a definition for the static object used to identify passes.<br>
-template class llvm::AnalysisBase<AAManager>;<br>
+char AAManager::PassID;<br>
<br>
 namespace {<br>
 /// A wrapper pass for external alias analyses. This just squirrels away the<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/AssumptionCache.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/AssumptionCache.cpp Fri Mar 11 04:22:49 2016<br>
@@ -74,7 +74,7 @@ void AssumptionCache::registerAssumption<br>
 #endif<br>
 }<br>
<br>
-template class llvm::AnalysisBase<AssumptionAnalysis>;<br>
+char AssumptionAnalysis::PassID;<br>
<br>
 PreservedAnalyses AssumptionPrinterPass::run(Function &F,<br>
                                              AnalysisManager<Function> *AM) {<br>
<br>
Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -1606,6 +1606,8 @@ bool BasicAAResult::constantOffsetHeuris<br>
 // BasicAliasAnalysis Pass<br>
 //===----------------------------------------------------------------------===//<br>
<br>
+char BasicAA::PassID;<br>
+<br>
 BasicAAResult BasicAA::run(Function &F, AnalysisManager<Function> *AM) {<br>
   return BasicAAResult(F.getParent()->getDataLayout(),<br>
                        AM->getResult<TargetLibraryAnalysis>(F),<br>
<br>
Modified: llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -1088,6 +1088,8 @@ AliasResult CFLAAResult::query(const Mem<br>
   return NoAlias;<br>
 }<br>
<br>
+char CFLAA::PassID;<br>
+<br>
 CFLAAResult CFLAA::run(Function &F, AnalysisManager<Function> *AM) {<br>
   return CFLAAResult();<br>
 }<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Fri Mar 11 04:22:49 2016<br>
@@ -18,12 +18,9 @@ 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/CallGraph.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/CallGraph.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/CallGraph.cpp Fri Mar 11 04:22:49 2016<br>
@@ -260,7 +260,7 @@ void CallGraphNode::replaceCallEdge(Call<br>
 }<br>
<br>
 // Provide an explicit template instantiation for the static ID.<br>
-template class llvm::AnalysisBase<CallGraphAnalysis>;<br>
+char CallGraphAnalysis::PassID;<br>
<br>
 PreservedAnalyses CallGraphPrinterPass::run(Module &M,<br>
                                             AnalysisManager<Module> *AM) {<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/DominanceFrontier.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/DominanceFrontier.cpp Fri Mar 11 04:22:49 2016<br>
@@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void DominanceFrontierW<br>
 }<br>
 #endif<br>
<br>
-template class llvm::AnalysisBase<DominanceFrontierAnalysis>;<br>
+char DominanceFrontierAnalysis::PassID;<br>
<br>
 DominanceFrontier DominanceFrontierAnalysis::run(Function &F,<br>
                                                  FunctionAnalysisManager *AM) {<br>
<br>
Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Fri Mar 11 04:22:49 2016<br>
@@ -936,6 +936,8 @@ GlobalsAAResult::analyzeModule(Module &M<br>
   return Result;<br>
 }<br>
<br>
+char GlobalsAA::PassID;<br>
+<br>
 GlobalsAAResult GlobalsAA::run(Module &M, AnalysisManager<Module> *AM) {<br>
   return GlobalsAAResult::analyzeModule(M,<br>
                                         AM->getResult<TargetLibraryAnalysis>(M),<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Fri Mar 11 04:22:49 2016<br>
@@ -1499,7 +1499,7 @@ LazyCallGraph::RefSCC *LazyCallGraph::ge<br>
   }<br>
 }<br>
<br>
-template class llvm::AnalysisBase<LazyCallGraphAnalysis>;<br>
+char LazyCallGraphAnalysis::PassID;<br>
<br>
 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}<br>
<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LoopInfo.cpp Fri Mar 11 04:22:49 2016<br>
@@ -641,7 +641,7 @@ void LoopInfo::markAsRemoved(Loop *Unloo<br>
   }<br>
 }<br>
<br>
-template class llvm::AnalysisBase<LoopAnalysis>;<br>
+char LoopAnalysis::PassID;<br>
<br>
 LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> *AM) {<br>
   // FIXME: Currently we create a LoopInfo from scratch for every function.<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/LoopPassManager.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/LoopPassManager.cpp Fri Mar 11 04:22:49 2016<br>
@@ -16,6 +16,5 @@ 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/MemoryDependenceAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -1659,6 +1659,8 @@ void MemoryDependenceResults::verifyRemo<br>
 #endif<br>
 }<br>
<br>
+char MemoryDependenceAnalysis::PassID;<br>
+<br>
 MemoryDependenceResults<br>
 MemoryDependenceAnalysis::run(Function &F, AnalysisManager<Function> *AM) {<br>
   auto &AA = AM->getResult<AAManager>(F);<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/PostDominators.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/PostDominators.cpp Fri Mar 11 04:22:49 2016<br>
@@ -44,7 +44,7 @@ FunctionPass* llvm::createPostDomTree()<br>
   return new PostDominatorTreeWrapperPass();<br>
 }<br>
<br>
-template class llvm::AnalysisBase<PostDominatorTreeAnalysis>;<br>
+char PostDominatorTreeAnalysis::PassID;<br>
<br>
 PostDominatorTree PostDominatorTreeAnalysis::run(Function &F) {<br>
   PostDominatorTree PDT;<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/RegionInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/RegionInfo.cpp Fri Mar 11 04:22:49 2016<br>
@@ -185,7 +185,7 @@ namespace llvm {<br>
 // RegionInfoAnalysis implementation<br>
 //<br>
<br>
-template class llvm::AnalysisBase<RegionInfoAnalysis>;<br>
+char RegionInfoAnalysis::PassID;<br>
<br>
 RegionInfo RegionInfoAnalysis::run(Function &F, AnalysisManager<Function> *AM) {<br>
   RegionInfo RI;<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Mar 11 04:22:49 2016<br>
@@ -9730,7 +9730,7 @@ void ScalarEvolution::verify() const {<br>
   // TODO: Verify more things.<br>
 }<br>
<br>
-template class llvm::AnalysisBase<ScalarEvolutionAnalysis>;<br>
+char ScalarEvolutionAnalysis::PassID;<br>
<br>
 ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,<br>
                                              AnalysisManager<Function> *AM) {<br>
<br>
Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -110,6 +110,8 @@ Value *SCEVAAResult::GetBaseValue(const<br>
   return nullptr;<br>
 }<br>
<br>
+char SCEVAA::PassID;<br>
+<br>
 SCEVAAResult SCEVAA::run(Function &F, AnalysisManager<Function> *AM) {<br>
   return SCEVAAResult(AM->getResult<ScalarEvolutionAnalysis>(F));<br>
 }<br>
<br>
Modified: llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp Fri Mar 11 04:22:49 2016<br>
@@ -172,6 +172,8 @@ bool ScopedNoAliasAAResult::mayAliasInSc<br>
   return true;<br>
 }<br>
<br>
+char ScopedNoAliasAA::PassID;<br>
+<br>
 ScopedNoAliasAAResult ScopedNoAliasAA::run(Function &F,<br>
                                            AnalysisManager<Function> *AM) {<br>
   return ScopedNoAliasAAResult();<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Fri Mar 11 04:22:49 2016<br>
@@ -636,7 +636,7 @@ TargetLibraryInfoWrapperPass::TargetLibr<br>
   initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());<br>
 }<br>
<br>
-template class llvm::AnalysisBase<TargetLibraryAnalysis>;<br>
+char TargetLibraryAnalysis::PassID;<br>
<br>
 // Register the basic pass.<br>
 INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Fri Mar 11 04:22:49 2016<br>
@@ -377,7 +377,7 @@ TargetIRAnalysis::Result TargetIRAnalysi<br>
   return TTICallback(F);<br>
 }<br>
<br>
-template class llvm::AnalysisBase<TargetIRAnalysis>;<br>
+char TargetIRAnalysis::PassID;<br>
<br>
 TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) {<br>
   return Result(F.getParent()->getDataLayout());<br>
<br>
Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Fri Mar 11 04:22:49 2016<br>
@@ -583,6 +583,8 @@ bool TypeBasedAAResult::PathAliases(cons<br>
   return false;<br>
 }<br>
<br>
+char TypeBasedAA::PassID;<br>
+<br>
 TypeBasedAAResult TypeBasedAA::run(Function &F, AnalysisManager<Function> *AM) {<br>
   return TypeBasedAAResult();<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Dominators.cpp (original)<br>
+++ llvm/trunk/lib/IR/Dominators.cpp Fri Mar 11 04:22:49 2016<br>
@@ -308,7 +308,7 @@ DominatorTree DominatorTreeAnalysis::run<br>
   return DT;<br>
 }<br>
<br>
-template class llvm::AnalysisBase<DominatorTreeAnalysis>;<br>
+char DominatorTreeAnalysis::PassID;<br>
<br>
 DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}<br>
<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=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/PassManager.cpp (original)<br>
+++ llvm/trunk/lib/IR/PassManager.cpp Fri Mar 11 04:22:49 2016<br>
@@ -20,6 +20,5 @@ 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>
Modified: llvm/trunk/lib/Passes/PassBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Mar 11 04:22:49 2016<br>
@@ -70,7 +70,11 @@ struct NoOpModulePass {<br>
 };<br>
<br>
 /// \brief No-op module analysis.<br>
-struct NoOpModuleAnalysis : AnalysisBase<NoOpModuleAnalysis> {<br>
+class NoOpModuleAnalysis : public AnalysisBase<NoOpModuleAnalysis> {<br>
+  friend AnalysisBase<NoOpModuleAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   struct Result {};<br>
   Result run(Module &) { return Result(); }<br>
   static StringRef name() { return "NoOpModuleAnalysis"; }<br>
@@ -85,7 +89,11 @@ struct NoOpCGSCCPass {<br>
 };<br>
<br>
 /// \brief No-op CGSCC analysis.<br>
-struct NoOpCGSCCAnalysis : AnalysisBase<NoOpCGSCCAnalysis> {<br>
+class NoOpCGSCCAnalysis : public AnalysisBase<NoOpCGSCCAnalysis> {<br>
+  friend AnalysisBase<NoOpCGSCCAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   struct Result {};<br>
   Result run(LazyCallGraph::SCC &) { return Result(); }<br>
   static StringRef name() { return "NoOpCGSCCAnalysis"; }<br>
@@ -98,7 +106,11 @@ struct NoOpFunctionPass {<br>
 };<br>
<br>
 /// \brief No-op function analysis.<br>
-struct NoOpFunctionAnalysis : AnalysisBase<NoOpFunctionAnalysis> {<br>
+class NoOpFunctionAnalysis : public AnalysisBase<NoOpFunctionAnalysis> {<br>
+  friend AnalysisBase<NoOpFunctionAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   struct Result {};<br>
   Result run(Function &) { return Result(); }<br>
   static StringRef name() { return "NoOpFunctionAnalysis"; }<br>
@@ -111,12 +123,21 @@ struct NoOpLoopPass {<br>
 };<br>
<br>
 /// \brief No-op loop analysis.<br>
-struct NoOpLoopAnalysis : AnalysisBase<NoOpLoopAnalysis> {<br>
+class NoOpLoopAnalysis : public AnalysisBase<NoOpLoopAnalysis> {<br>
+  friend AnalysisBase<NoOpLoopAnalysis>;<br>
+  static char PassID;<br>
+<br>
+public:<br>
   struct Result {};<br>
   Result run(Loop &) { return Result(); }<br>
   static StringRef name() { return "NoOpLoopAnalysis"; }<br>
 };<br>
<br>
+char NoOpModuleAnalysis::PassID;<br>
+char NoOpCGSCCAnalysis::PassID;<br>
+char NoOpFunctionAnalysis::PassID;<br>
+char NoOpLoopAnalysis::PassID;<br>
+<br>
 } // End anonymous namespace.<br>
<br>
 void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {<br>
<br>
Modified: llvm/trunk/unittests/IR/PassManagerTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=263216&r1=263215&r2=263216&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=263216&r1=263215&r2=263216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/PassManagerTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/PassManagerTest.cpp Fri Mar 11 04:22:49 2016<br>
@@ -40,9 +40,14 @@ public:<br>
   }<br>
<br>
 private:<br>
+  friend AnalysisBase<TestFunctionAnalysis>;<br>
+  static char PassID;<br>
+<br>
   int &Runs;<br>
 };<br>
<br>
+char TestFunctionAnalysis::PassID;<br>
+<br>
 class TestModuleAnalysis : public AnalysisBase<TestModuleAnalysis> {<br>
 public:<br>
   struct Result {<br>
@@ -61,9 +66,14 @@ public:<br>
   }<br>
<br>
 private:<br>
+  friend AnalysisBase<TestModuleAnalysis>;<br>
+  static char PassID;<br>
+<br>
   int &Runs;<br>
 };<br>
<br>
+char TestModuleAnalysis::PassID;<br>
+<br>
 struct TestModulePass : PassBase<TestModulePass> {<br>
   TestModulePass(int &RunCount) : RunCount(RunCount) {}<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></div></div>