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

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 11 11:28:24 PST 2016


On Fri, Mar 11, 2016 at 2:22 AM, Chandler Carruth via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> 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).
>

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?


> 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) {}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160311/8d772c4d/attachment-0001.html>


More information about the llvm-commits mailing list