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