[llvm] r263216 - [PM] Implement the final conclusion as to how the analysis IDs should

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 11 02:22:50 PST 2016


Author: chandlerc
Date: Fri Mar 11 04:22:49 2016
New Revision: 263216

URL: http://llvm.org/viewvc/llvm-project?rev=263216&view=rev
Log:
[PM] Implement the final conclusion as to how the analysis IDs should
work in the face of the limitations of DLLs and templated static
variables.

This requires passes that use the AnalysisBase mixin provide a static
variable themselves. So as to keep their APIs clean, I've made these
private and befriended the CRTP base class (which is the common
practice).

I've added documentation to AnalysisBase for why this is necessary and
at what point we can go back to the much simpler system.

This is clearly a better pattern than the extern template as it caught
*numerous* places where the template magic hadn't been applied and
things were "just working" but would eventually have broken
mysteriously.

Modified:
    llvm/trunk/include/llvm/Analysis/AliasAnalysis.h
    llvm/trunk/include/llvm/Analysis/AssumptionCache.h
    llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h
    llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h
    llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h
    llvm/trunk/include/llvm/Analysis/CallGraph.h
    llvm/trunk/include/llvm/Analysis/DominanceFrontier.h
    llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
    llvm/trunk/include/llvm/Analysis/LazyCallGraph.h
    llvm/trunk/include/llvm/Analysis/LoopInfo.h
    llvm/trunk/include/llvm/Analysis/LoopPassManager.h
    llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
    llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h
    llvm/trunk/include/llvm/Analysis/PostDominators.h
    llvm/trunk/include/llvm/Analysis/RegionInfo.h
    llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
    llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
    llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h
    llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h
    llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
    llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h
    llvm/trunk/include/llvm/IR/Dominators.h
    llvm/trunk/include/llvm/IR/PassManager.h
    llvm/trunk/lib/Analysis/AliasAnalysis.cpp
    llvm/trunk/lib/Analysis/AssumptionCache.cpp
    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
    llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp
    llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
    llvm/trunk/lib/Analysis/CallGraph.cpp
    llvm/trunk/lib/Analysis/DominanceFrontier.cpp
    llvm/trunk/lib/Analysis/GlobalsModRef.cpp
    llvm/trunk/lib/Analysis/LazyCallGraph.cpp
    llvm/trunk/lib/Analysis/LoopInfo.cpp
    llvm/trunk/lib/Analysis/LoopPassManager.cpp
    llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
    llvm/trunk/lib/Analysis/PostDominators.cpp
    llvm/trunk/lib/Analysis/RegionInfo.cpp
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
    llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
    llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp
    llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
    llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
    llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
    llvm/trunk/lib/IR/Dominators.cpp
    llvm/trunk/lib/IR/PassManager.cpp
    llvm/trunk/lib/Passes/PassBuilder.cpp
    llvm/trunk/unittests/IR/PassManagerTest.cpp

Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -874,6 +874,9 @@ public:
   }
 
 private:
+  friend AnalysisBase<AAManager>;
+  static char PassID;
+
   SmallVector<void (*)(Function &F, AnalysisManager<Function> &AM,
                        AAResults &AAResults),
               4> ResultGetters;
@@ -895,8 +898,6 @@ private:
   }
 };
 
-extern template class AnalysisBase<AAManager>;
-
 /// A wrapper pass to provide the legacy pass manager access to a suitably
 /// prepared AAResults object.
 class AAResultsWrapperPass : public FunctionPass {

Modified: llvm/trunk/include/llvm/Analysis/AssumptionCache.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)
+++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Fri Mar 11 04:22:49 2016
@@ -93,7 +93,11 @@ public:
 ///
 /// This analysis is intended for use with the new pass manager and will vend
 /// assumption caches for a given function.
-struct AssumptionAnalysis : AnalysisBase<AssumptionAnalysis> {
+class AssumptionAnalysis : public AnalysisBase<AssumptionAnalysis> {
+  friend AnalysisBase<AssumptionAnalysis>;
+  static char PassID;
+
+public:
   typedef AssumptionCache Result;
 
   AssumptionAnalysis() {}
@@ -105,8 +109,6 @@ struct AssumptionAnalysis : AnalysisBase
   AssumptionCache run(Function &F) { return AssumptionCache(F); }
 };
 
-extern template class AnalysisBase<AssumptionAnalysis>;
-
 /// \brief Printer pass for the \c AssumptionAnalysis results.
 class AssumptionPrinterPass : public PassBase<AssumptionPrinterPass> {
   raw_ostream &OS;

Modified: llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -180,7 +180,11 @@ private:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct BasicAA : AnalysisBase<BasicAA> {
+class BasicAA : public AnalysisBase<BasicAA> {
+  friend AnalysisBase<BasicAA>;
+  static char PassID;
+
+public:
   typedef BasicAAResult Result;
 
   BasicAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -109,7 +109,11 @@ private:
 ///
 /// FIXME: We really should refactor CFL to use the analysis more heavily, and
 /// in particular to leverage invalidation to trigger re-computation of sets.
-struct CFLAA : AnalysisBase<CFLAA> {
+class CFLAA : public AnalysisBase<CFLAA> {
+  friend AnalysisBase<CFLAA>;
+  static char PassID;
+
+public:
   typedef CFLAAResult Result;
 
   CFLAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)
+++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Fri Mar 11 04:22:49 2016
@@ -48,16 +48,12 @@ extern template class InnerAnalysisManag
 typedef InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module>
     CGSCCAnalysisManagerModuleProxy;
 
-extern template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;
-
 extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
                                                 LazyCallGraph::SCC>;
 /// A proxy from a \c ModuleAnalysisManager to an \c SCC.
 typedef OuterAnalysisManagerProxy<ModuleAnalysisManager, LazyCallGraph::SCC>
     ModuleAnalysisManagerCGSCCProxy;
 
-extern template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;
-
 /// \brief The core module pass which does a post-order walk of the SCCs and
 /// runs a CGSCC pass over each one.
 ///
@@ -148,8 +144,6 @@ extern template class InnerAnalysisManag
 typedef InnerAnalysisManagerProxy<FunctionAnalysisManager, LazyCallGraph::SCC>
     FunctionAnalysisManagerCGSCCProxy;
 
-extern template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;
-
 extern template class OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>;
 /// A proxy from a \c CGSCCAnalysisManager to a \c Function.
 typedef OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>

Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/CallGraph.h (original)
+++ llvm/trunk/include/llvm/Analysis/CallGraph.h Fri Mar 11 04:22:49 2016
@@ -295,7 +295,10 @@ private:
 /// This class implements the concept of an analysis pass used by the \c
 /// ModuleAnalysisManager to run an analysis over a module and cache the
 /// resulting data.
-struct CallGraphAnalysis : AnalysisBase<CallGraphAnalysis> {
+class CallGraphAnalysis : public AnalysisBase<CallGraphAnalysis> {
+  friend AnalysisBase<CallGraphAnalysis>;
+  static char PassID;
+
 public:
   /// \brief A formulaic typedef to inform clients of the result type.
   typedef CallGraph Result;
@@ -306,9 +309,6 @@ public:
   CallGraph run(Module &M) { return CallGraph(M); }
 };
 
-/// Instantiated in CallGraph.cpp
-extern template class llvm::AnalysisBase<CallGraphAnalysis>;
-
 /// \brief Printer pass for the \c CallGraphAnalysis results.
 class CallGraphPrinterPass : public PassBase<CallGraphPrinterPass> {
   raw_ostream &OS;

Modified: llvm/trunk/include/llvm/Analysis/DominanceFrontier.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/DominanceFrontier.h (original)
+++ llvm/trunk/include/llvm/Analysis/DominanceFrontier.h Fri Mar 11 04:22:49 2016
@@ -168,7 +168,12 @@ extern template class DominanceFrontierB
 extern template class ForwardDominanceFrontierBase<BasicBlock>;
 
 /// \brief Analysis pass which computes a \c DominanceFrontier.
-struct DominanceFrontierAnalysis : AnalysisBase<DominanceFrontierAnalysis> {
+class DominanceFrontierAnalysis
+    : public AnalysisBase<DominanceFrontierAnalysis> {
+  friend AnalysisBase<DominanceFrontierAnalysis>;
+  static char PassID;
+
+public:
   /// \brief Provide the result typedef for this analysis pass.
   typedef DominanceFrontier Result;
 
@@ -176,8 +181,6 @@ struct DominanceFrontierAnalysis : Analy
   DominanceFrontier run(Function &F, AnalysisManager<Function> *AM);
 };
 
-extern template class AnalysisBase<DominanceFrontierAnalysis>;
-
 /// \brief Printer pass for the \c DominanceFrontier.
 class DominanceFrontierPrinterPass
     : public PassBase<DominanceFrontierPrinterPass> {

Modified: llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/GlobalsModRef.h (original)
+++ llvm/trunk/include/llvm/Analysis/GlobalsModRef.h Fri Mar 11 04:22:49 2016
@@ -118,7 +118,11 @@ private:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct GlobalsAA : AnalysisBase<GlobalsAA> {
+class GlobalsAA : public AnalysisBase<GlobalsAA> {
+  friend AnalysisBase<GlobalsAA>;
+  static char PassID;
+
+public:
   typedef GlobalsAAResult Result;
 
   GlobalsAAResult run(Module &M, AnalysisManager<Module> *AM);

Modified: llvm/trunk/include/llvm/Analysis/LazyCallGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)
+++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Fri Mar 11 04:22:49 2016
@@ -895,7 +895,11 @@ template <> struct GraphTraits<LazyCallG
 };
 
 /// An analysis pass which computes the call graph for a module.
-struct LazyCallGraphAnalysis : AnalysisBase<LazyCallGraphAnalysis> {
+class LazyCallGraphAnalysis : public AnalysisBase<LazyCallGraphAnalysis> {
+  friend AnalysisBase<LazyCallGraphAnalysis>;
+  static char PassID;
+
+public:
   /// Inform generic clients of the result type.
   typedef LazyCallGraph Result;
 
@@ -906,8 +910,6 @@ struct LazyCallGraphAnalysis : AnalysisB
   LazyCallGraph run(Module &M) { return LazyCallGraph(M); }
 };
 
-extern template class AnalysisBase<LazyCallGraphAnalysis>;
-
 /// A pass which prints the call graph to a \c raw_ostream.
 ///
 /// This is primarily useful for testing the analysis.

Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Fri Mar 11 04:22:49 2016
@@ -787,14 +787,16 @@ template <> struct GraphTraits<Loop*> {
 };
 
 /// \brief Analysis pass that exposes the \c LoopInfo for a function.
-struct LoopAnalysis : AnalysisBase<LoopAnalysis> {
+class LoopAnalysis : public AnalysisBase<LoopAnalysis> {
+  friend AnalysisBase<LoopAnalysis>;
+  static char PassID;
+
+public:
   typedef LoopInfo Result;
 
   LoopInfo run(Function &F, AnalysisManager<Function> *AM);
 };
 
-extern template class AnalysisBase<LoopAnalysis>;
-
 /// \brief Printer pass for the \c LoopAnalysis results.
 class LoopPrinterPass : public PassBase<LoopPrinterPass> {
   raw_ostream &OS;

Modified: llvm/trunk/include/llvm/Analysis/LoopPassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/LoopPassManager.h (original)
+++ llvm/trunk/include/llvm/Analysis/LoopPassManager.h Fri Mar 11 04:22:49 2016
@@ -43,8 +43,6 @@ extern template class InnerAnalysisManag
 typedef InnerAnalysisManagerProxy<LoopAnalysisManager, Function>
     LoopAnalysisManagerFunctionProxy;
 
-extern template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;
-
 extern template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>;
 /// A proxy from a \c FunctionAnalysisManager to a \c Loop.
 typedef OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>

Modified: llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h Fri Mar 11 04:22:49 2016
@@ -471,7 +471,11 @@ private:
 ///
 /// This is essentially a no-op because the results are computed entirely
 /// lazily.
-struct MemoryDependenceAnalysis : AnalysisBase<MemoryDependenceAnalysis> {
+class MemoryDependenceAnalysis : public AnalysisBase<MemoryDependenceAnalysis> {
+  friend AnalysisBase<MemoryDependenceAnalysis>;
+  static char PassID;
+
+public:
   typedef MemoryDependenceResults Result;
 
   MemoryDependenceResults run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -61,7 +61,11 @@ public:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct ObjCARCAA : AnalysisBase<ObjCARCAA> {
+class ObjCARCAA : public AnalysisBase<ObjCARCAA> {
+  friend AnalysisBase<ObjCARCAA>;
+  static char PassID;
+
+public:
   typedef ObjCARCAAResult Result;
 
   ObjCARCAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/PostDominators.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/PostDominators.h (original)
+++ llvm/trunk/include/llvm/Analysis/PostDominators.h Fri Mar 11 04:22:49 2016
@@ -37,7 +37,12 @@ struct PostDominatorTree : public Domina
 };
 
 /// \brief Analysis pass which computes a \c PostDominatorTree.
-struct PostDominatorTreeAnalysis : AnalysisBase<PostDominatorTreeAnalysis> {
+class PostDominatorTreeAnalysis
+    : public AnalysisBase<PostDominatorTreeAnalysis> {
+  friend AnalysisBase<PostDominatorTreeAnalysis>;
+  static char PassID;
+
+public:
   /// \brief Provide the result typedef for this analysis pass.
   typedef PostDominatorTree Result;
 
@@ -46,8 +51,6 @@ struct PostDominatorTreeAnalysis : Analy
   PostDominatorTree run(Function &F);
 };
 
-extern template class AnalysisBase<PostDominatorTreeAnalysis>;
-
 /// \brief Printer pass for the \c PostDominatorTree.
 class PostDominatorTreePrinterPass
     : public PassBase<PostDominatorTreePrinterPass> {

Modified: llvm/trunk/include/llvm/Analysis/RegionInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/RegionInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/RegionInfo.h Fri Mar 11 04:22:49 2016
@@ -923,14 +923,16 @@ public:
 };
 
 /// \brief Analysis pass that exposes the \c RegionInfo for a function.
-struct RegionInfoAnalysis : AnalysisBase<RegionInfoAnalysis> {
+class RegionInfoAnalysis : public AnalysisBase<RegionInfoAnalysis> {
+  friend AnalysisBase<RegionInfoAnalysis>;
+  static char PassID;
+
+public:
   typedef RegionInfo Result;
 
   RegionInfo run(Function &F, AnalysisManager<Function> *AM);
 };
 
-extern template class AnalysisBase<RegionInfoAnalysis>;
-
 /// \brief Printer pass for the \c RegionInfo.
 class RegionInfoPrinterPass : public PassBase<RegionInfoPrinterPass> {
   raw_ostream &OS;

Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
+++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Fri Mar 11 04:22:49 2016
@@ -1430,14 +1430,16 @@ namespace llvm {
   };
 
   /// \brief Analysis pass that exposes the \c ScalarEvolution for a function.
-  struct ScalarEvolutionAnalysis : AnalysisBase<ScalarEvolutionAnalysis> {
+  class ScalarEvolutionAnalysis : public AnalysisBase<ScalarEvolutionAnalysis> {
+    friend AnalysisBase<ScalarEvolutionAnalysis>;
+    static char PassID;
+
+  public:
     typedef ScalarEvolution Result;
 
     ScalarEvolution run(Function &F, AnalysisManager<Function> *AM);
   };
 
-  extern template class AnalysisBase<ScalarEvolutionAnalysis>;
-
   /// \brief Printer pass for the \c ScalarEvolutionAnalysis results.
   class ScalarEvolutionPrinterPass
       : public PassBase<ScalarEvolutionPrinterPass> {

Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -38,7 +38,11 @@ private:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct SCEVAA : AnalysisBase<SCEVAA> {
+class SCEVAA : public AnalysisBase<SCEVAA> {
+  friend AnalysisBase<SCEVAA>;
+  static char PassID;
+
+public:
   typedef SCEVAAResult Result;
 
   SCEVAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h (original)
+++ llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h Fri Mar 11 04:22:49 2016
@@ -47,7 +47,11 @@ private:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct ScopedNoAliasAA : AnalysisBase<ScopedNoAliasAA> {
+class ScopedNoAliasAA : public AnalysisBase<ScopedNoAliasAA> {
+  friend AnalysisBase<ScopedNoAliasAA>;
+  static char PassID;
+
+public:
   typedef ScopedNoAliasAAResult Result;
 
   ScopedNoAliasAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h Fri Mar 11 04:22:49 2016
@@ -292,6 +292,9 @@ public:
   TargetLibraryInfo run(Function &F);
 
 private:
+  friend AnalysisBase<TargetLibraryAnalysis>;
+  static char PassID;
+
   Optional<TargetLibraryInfoImpl> PresetInfoImpl;
 
   StringMap<std::unique_ptr<TargetLibraryInfoImpl>> Impls;
@@ -299,8 +302,6 @@ private:
   TargetLibraryInfoImpl &lookupInfoImpl(Triple T);
 };
 
-extern template class AnalysisBase<TargetLibraryAnalysis>;
-
 class TargetLibraryInfoWrapperPass : public ImmutablePass {
   TargetLibraryInfoImpl TLIImpl;
   TargetLibraryInfo TLI;

Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Fri Mar 11 04:22:49 2016
@@ -922,6 +922,9 @@ public:
   Result run(const Function &F);
 
 private:
+  friend AnalysisBase<TargetIRAnalysis>;
+  static char PassID;
+
   /// \brief The callback used to produce a result.
   ///
   /// We use a completely opaque callback so that targets can provide whatever
@@ -938,8 +941,6 @@ private:
   static Result getDefaultTTI(const Function &F);
 };
 
-extern template class AnalysisBase<TargetIRAnalysis>;
-
 /// \brief Wrapper pass for TargetTransformInfo.
 ///
 /// This pass can be constructed from a TTI object which it stores internally

Modified: llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h Fri Mar 11 04:22:49 2016
@@ -48,7 +48,11 @@ private:
 };
 
 /// Analysis pass providing a never-invalidated alias analysis result.
-struct TypeBasedAA : AnalysisBase<TypeBasedAA> {
+class TypeBasedAA : public AnalysisBase<TypeBasedAA> {
+  friend AnalysisBase<TypeBasedAA>;
+  static char PassID;
+
+public:
   typedef TypeBasedAAResult Result;
 
   TypeBasedAAResult run(Function &F, AnalysisManager<Function> *AM);

Modified: llvm/trunk/include/llvm/IR/Dominators.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Dominators.h (original)
+++ llvm/trunk/include/llvm/IR/Dominators.h Fri Mar 11 04:22:49 2016
@@ -182,7 +182,11 @@ template <> struct GraphTraits<Dominator
 };
 
 /// \brief Analysis pass which computes a \c DominatorTree.
-struct DominatorTreeAnalysis : AnalysisBase<DominatorTreeAnalysis> {
+class DominatorTreeAnalysis : public AnalysisBase<DominatorTreeAnalysis> {
+  friend AnalysisBase<DominatorTreeAnalysis>;
+  static char PassID;
+
+public:
   /// \brief Provide the result typedef for this analysis pass.
   typedef DominatorTree Result;
 
@@ -190,8 +194,6 @@ struct DominatorTreeAnalysis : AnalysisB
   DominatorTree run(Function &F);
 };
 
-extern template class AnalysisBase<DominatorTreeAnalysis>;
-
 /// \brief Printer pass for the \c DominatorTree.
 class DominatorTreePrinterPass : public PassBase<DominatorTreePrinterPass> {
   raw_ostream &OS;

Modified: llvm/trunk/include/llvm/IR/PassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/PassManager.h (original)
+++ llvm/trunk/include/llvm/IR/PassManager.h Fri Mar 11 04:22:49 2016
@@ -183,17 +183,23 @@ template <typename DerivedT> struct Pass
 /// A CRTP mix-in base class to help define types that are valid analyses.
 ///
 /// This provides some boiler plate for types that are analysis passes.
-template <typename DerivedT> class AnalysisBase : public PassBase<DerivedT> {
-  static char PassID;
-
-public:
+template <typename DerivedT> struct AnalysisBase : PassBase<DerivedT> {
   /// Returns an opaque, unique ID for this pass type.
-  static void *ID() { return (void *)&PassID; }
+  ///
+  /// Note that this requires the derived type provide a static member whose
+  /// address can be converted to a void pointer.
+  ///
+  /// FIXME: The only reason the derived type needs to provide this rather than
+  /// this mixin providing it is due to broken implementations which cannot
+  /// correctly unique a templated static so that they have the same addresses
+  /// for each instantiation and are definitively emitted once for each
+  /// instantiation. The only currently known platform with this limitation are
+  /// Windows DLL builds, specifically building each part of LLVM as a DLL. If
+  /// we ever remove that build configuration, this mixin can provide the
+  /// static PassID as well.
+  static void *ID() { return (void *)&DerivedT::PassID; }
 };
 
-/// Private static data to provide unique ID.
-template <typename DerivedT> char AnalysisBase<DerivedT>::PassID;
-
 /// \brief Manages a sequence of passes over units of IR.
 ///
 /// A pass manager contains a sequence of passes to run over units of IR. It is
@@ -740,17 +746,21 @@ public:
   Result run(IRUnitT &IR) { return Result(*AM); }
 
 private:
+  friend AnalysisBase<InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;
+  static char PassID;
+
   AnalysisManagerT *AM;
 };
 
+template <typename AnalysisManagerT, typename IRUnitT>
+char InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;
+
 extern template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
                                                 Module>;
 /// Provide the \c FunctionAnalysisManager to \c Module proxy.
 typedef InnerAnalysisManagerProxy<FunctionAnalysisManager, Module>
     FunctionAnalysisManagerModuleProxy;
 
-extern template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;
-
 /// \brief A function analysis which acts as a proxy for a module analysis
 /// manager.
 ///
@@ -808,9 +818,15 @@ public:
   Result run(IRUnitT &) { return Result(*AM); }
 
 private:
+  friend AnalysisBase<OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;
+  static char PassID;
+
   const AnalysisManagerT *AM;
 };
 
+template <typename AnalysisManagerT, typename IRUnitT>
+char OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;
+
 extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
                                                 Function>;
 /// Provide the \c ModuleAnalysisManager to \c Fucntion proxy.

Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -504,7 +504,7 @@ bool AAResults::canInstructionRangeModRe
 AAResults::Concept::~Concept() {}
 
 // Provide a definition for the static object used to identify passes.
-template class llvm::AnalysisBase<AAManager>;
+char AAManager::PassID;
 
 namespace {
 /// A wrapper pass for external alias analyses. This just squirrels away the

Modified: llvm/trunk/lib/Analysis/AssumptionCache.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/AssumptionCache.cpp (original)
+++ llvm/trunk/lib/Analysis/AssumptionCache.cpp Fri Mar 11 04:22:49 2016
@@ -74,7 +74,7 @@ void AssumptionCache::registerAssumption
 #endif
 }
 
-template class llvm::AnalysisBase<AssumptionAnalysis>;
+char AssumptionAnalysis::PassID;
 
 PreservedAnalyses AssumptionPrinterPass::run(Function &F,
                                              AnalysisManager<Function> *AM) {

Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -1606,6 +1606,8 @@ bool BasicAAResult::constantOffsetHeuris
 // BasicAliasAnalysis Pass
 //===----------------------------------------------------------------------===//
 
+char BasicAA::PassID;
+
 BasicAAResult BasicAA::run(Function &F, AnalysisManager<Function> *AM) {
   return BasicAAResult(F.getParent()->getDataLayout(),
                        AM->getResult<TargetLibraryAnalysis>(F),

Modified: llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -1088,6 +1088,8 @@ AliasResult CFLAAResult::query(const Mem
   return NoAlias;
 }
 
+char CFLAA::PassID;
+
 CFLAAResult CFLAA::run(Function &F, AnalysisManager<Function> *AM) {
   return CFLAAResult();
 }

Modified: llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)
+++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Fri Mar 11 04:22:49 2016
@@ -18,12 +18,9 @@ namespace llvm {
 template class PassManager<LazyCallGraph::SCC>;
 template class AnalysisManager<LazyCallGraph::SCC>;
 template class InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module>;
-template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;
 template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
                                          LazyCallGraph::SCC>;
-template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;
 template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
                                          LazyCallGraph::SCC>;
-template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;
 template class OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>;
 }

Modified: llvm/trunk/lib/Analysis/CallGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/CallGraph.cpp (original)
+++ llvm/trunk/lib/Analysis/CallGraph.cpp Fri Mar 11 04:22:49 2016
@@ -260,7 +260,7 @@ void CallGraphNode::replaceCallEdge(Call
 }
 
 // Provide an explicit template instantiation for the static ID.
-template class llvm::AnalysisBase<CallGraphAnalysis>;
+char CallGraphAnalysis::PassID;
 
 PreservedAnalyses CallGraphPrinterPass::run(Module &M,
                                             AnalysisManager<Module> *AM) {

Modified: llvm/trunk/lib/Analysis/DominanceFrontier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/DominanceFrontier.cpp (original)
+++ llvm/trunk/lib/Analysis/DominanceFrontier.cpp Fri Mar 11 04:22:49 2016
@@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void DominanceFrontierW
 }
 #endif
 
-template class llvm::AnalysisBase<DominanceFrontierAnalysis>;
+char DominanceFrontierAnalysis::PassID;
 
 DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
                                                  FunctionAnalysisManager *AM) {

Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Fri Mar 11 04:22:49 2016
@@ -936,6 +936,8 @@ GlobalsAAResult::analyzeModule(Module &M
   return Result;
 }
 
+char GlobalsAA::PassID;
+
 GlobalsAAResult GlobalsAA::run(Module &M, AnalysisManager<Module> *AM) {
   return GlobalsAAResult::analyzeModule(M,
                                         AM->getResult<TargetLibraryAnalysis>(M),

Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)
+++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Fri Mar 11 04:22:49 2016
@@ -1499,7 +1499,7 @@ LazyCallGraph::RefSCC *LazyCallGraph::ge
   }
 }
 
-template class llvm::AnalysisBase<LazyCallGraphAnalysis>;
+char LazyCallGraphAnalysis::PassID;
 
 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}
 

Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopInfo.cpp Fri Mar 11 04:22:49 2016
@@ -641,7 +641,7 @@ void LoopInfo::markAsRemoved(Loop *Unloo
   }
 }
 
-template class llvm::AnalysisBase<LoopAnalysis>;
+char LoopAnalysis::PassID;
 
 LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
   // FIXME: Currently we create a LoopInfo from scratch for every function.

Modified: llvm/trunk/lib/Analysis/LoopPassManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LoopPassManager.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopPassManager.cpp Fri Mar 11 04:22:49 2016
@@ -16,6 +16,5 @@ namespace llvm {
 template class PassManager<Loop>;
 template class AnalysisManager<Loop>;
 template class InnerAnalysisManagerProxy<LoopAnalysisManager, Function>;
-template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;
 template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>;
 }

Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -1659,6 +1659,8 @@ void MemoryDependenceResults::verifyRemo
 #endif
 }
 
+char MemoryDependenceAnalysis::PassID;
+
 MemoryDependenceResults
 MemoryDependenceAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
   auto &AA = AM->getResult<AAManager>(F);

Modified: llvm/trunk/lib/Analysis/PostDominators.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/PostDominators.cpp (original)
+++ llvm/trunk/lib/Analysis/PostDominators.cpp Fri Mar 11 04:22:49 2016
@@ -44,7 +44,7 @@ FunctionPass* llvm::createPostDomTree()
   return new PostDominatorTreeWrapperPass();
 }
 
-template class llvm::AnalysisBase<PostDominatorTreeAnalysis>;
+char PostDominatorTreeAnalysis::PassID;
 
 PostDominatorTree PostDominatorTreeAnalysis::run(Function &F) {
   PostDominatorTree PDT;

Modified: llvm/trunk/lib/Analysis/RegionInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/RegionInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/RegionInfo.cpp Fri Mar 11 04:22:49 2016
@@ -185,7 +185,7 @@ namespace llvm {
 // RegionInfoAnalysis implementation
 //
 
-template class llvm::AnalysisBase<RegionInfoAnalysis>;
+char RegionInfoAnalysis::PassID;
 
 RegionInfo RegionInfoAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
   RegionInfo RI;

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Mar 11 04:22:49 2016
@@ -9730,7 +9730,7 @@ void ScalarEvolution::verify() const {
   // TODO: Verify more things.
 }
 
-template class llvm::AnalysisBase<ScalarEvolutionAnalysis>;
+char ScalarEvolutionAnalysis::PassID;
 
 ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,
                                              AnalysisManager<Function> *AM) {

Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -110,6 +110,8 @@ Value *SCEVAAResult::GetBaseValue(const
   return nullptr;
 }
 
+char SCEVAA::PassID;
+
 SCEVAAResult SCEVAA::run(Function &F, AnalysisManager<Function> *AM) {
   return SCEVAAResult(AM->getResult<ScalarEvolutionAnalysis>(F));
 }

Modified: llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp (original)
+++ llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp Fri Mar 11 04:22:49 2016
@@ -172,6 +172,8 @@ bool ScopedNoAliasAAResult::mayAliasInSc
   return true;
 }
 
+char ScopedNoAliasAA::PassID;
+
 ScopedNoAliasAAResult ScopedNoAliasAA::run(Function &F,
                                            AnalysisManager<Function> *AM) {
   return ScopedNoAliasAAResult();

Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Fri Mar 11 04:22:49 2016
@@ -636,7 +636,7 @@ TargetLibraryInfoWrapperPass::TargetLibr
   initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
 }
 
-template class llvm::AnalysisBase<TargetLibraryAnalysis>;
+char TargetLibraryAnalysis::PassID;
 
 // Register the basic pass.
 INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",

Modified: llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Fri Mar 11 04:22:49 2016
@@ -377,7 +377,7 @@ TargetIRAnalysis::Result TargetIRAnalysi
   return TTICallback(F);
 }
 
-template class llvm::AnalysisBase<TargetIRAnalysis>;
+char TargetIRAnalysis::PassID;
 
 TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) {
   return Result(F.getParent()->getDataLayout());

Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Fri Mar 11 04:22:49 2016
@@ -583,6 +583,8 @@ bool TypeBasedAAResult::PathAliases(cons
   return false;
 }
 
+char TypeBasedAA::PassID;
+
 TypeBasedAAResult TypeBasedAA::run(Function &F, AnalysisManager<Function> *AM) {
   return TypeBasedAAResult();
 }

Modified: llvm/trunk/lib/IR/Dominators.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Dominators.cpp (original)
+++ llvm/trunk/lib/IR/Dominators.cpp Fri Mar 11 04:22:49 2016
@@ -308,7 +308,7 @@ DominatorTree DominatorTreeAnalysis::run
   return DT;
 }
 
-template class llvm::AnalysisBase<DominatorTreeAnalysis>;
+char DominatorTreeAnalysis::PassID;
 
 DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}
 

Modified: llvm/trunk/lib/IR/PassManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/IR/PassManager.cpp (original)
+++ llvm/trunk/lib/IR/PassManager.cpp Fri Mar 11 04:22:49 2016
@@ -20,6 +20,5 @@ template class PassManager<Function>;
 template class AnalysisManager<Module>;
 template class AnalysisManager<Function>;
 template class InnerAnalysisManagerProxy<FunctionAnalysisManager, Module>;
-template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;
 template class OuterAnalysisManagerProxy<ModuleAnalysisManager, Function>;
 }

Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Mar 11 04:22:49 2016
@@ -70,7 +70,11 @@ struct NoOpModulePass {
 };
 
 /// \brief No-op module analysis.
-struct NoOpModuleAnalysis : AnalysisBase<NoOpModuleAnalysis> {
+class NoOpModuleAnalysis : public AnalysisBase<NoOpModuleAnalysis> {
+  friend AnalysisBase<NoOpModuleAnalysis>;
+  static char PassID;
+
+public:
   struct Result {};
   Result run(Module &) { return Result(); }
   static StringRef name() { return "NoOpModuleAnalysis"; }
@@ -85,7 +89,11 @@ struct NoOpCGSCCPass {
 };
 
 /// \brief No-op CGSCC analysis.
-struct NoOpCGSCCAnalysis : AnalysisBase<NoOpCGSCCAnalysis> {
+class NoOpCGSCCAnalysis : public AnalysisBase<NoOpCGSCCAnalysis> {
+  friend AnalysisBase<NoOpCGSCCAnalysis>;
+  static char PassID;
+
+public:
   struct Result {};
   Result run(LazyCallGraph::SCC &) { return Result(); }
   static StringRef name() { return "NoOpCGSCCAnalysis"; }
@@ -98,7 +106,11 @@ struct NoOpFunctionPass {
 };
 
 /// \brief No-op function analysis.
-struct NoOpFunctionAnalysis : AnalysisBase<NoOpFunctionAnalysis> {
+class NoOpFunctionAnalysis : public AnalysisBase<NoOpFunctionAnalysis> {
+  friend AnalysisBase<NoOpFunctionAnalysis>;
+  static char PassID;
+
+public:
   struct Result {};
   Result run(Function &) { return Result(); }
   static StringRef name() { return "NoOpFunctionAnalysis"; }
@@ -111,12 +123,21 @@ struct NoOpLoopPass {
 };
 
 /// \brief No-op loop analysis.
-struct NoOpLoopAnalysis : AnalysisBase<NoOpLoopAnalysis> {
+class NoOpLoopAnalysis : public AnalysisBase<NoOpLoopAnalysis> {
+  friend AnalysisBase<NoOpLoopAnalysis>;
+  static char PassID;
+
+public:
   struct Result {};
   Result run(Loop &) { return Result(); }
   static StringRef name() { return "NoOpLoopAnalysis"; }
 };
 
+char NoOpModuleAnalysis::PassID;
+char NoOpCGSCCAnalysis::PassID;
+char NoOpFunctionAnalysis::PassID;
+char NoOpLoopAnalysis::PassID;
+
 } // End anonymous namespace.
 
 void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {

Modified: llvm/trunk/unittests/IR/PassManagerTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=263216&r1=263215&r2=263216&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/PassManagerTest.cpp (original)
+++ llvm/trunk/unittests/IR/PassManagerTest.cpp Fri Mar 11 04:22:49 2016
@@ -40,9 +40,14 @@ public:
   }
 
 private:
+  friend AnalysisBase<TestFunctionAnalysis>;
+  static char PassID;
+
   int &Runs;
 };
 
+char TestFunctionAnalysis::PassID;
+
 class TestModuleAnalysis : public AnalysisBase<TestModuleAnalysis> {
 public:
   struct Result {
@@ -61,9 +66,14 @@ public:
   }
 
 private:
+  friend AnalysisBase<TestModuleAnalysis>;
+  static char PassID;
+
   int &Runs;
 };
 
+char TestModuleAnalysis::PassID;
+
 struct TestModulePass : PassBase<TestModulePass> {
   TestModulePass(int &RunCount) : RunCount(RunCount) {}
 




More information about the llvm-commits mailing list