Add the ability for SCC passes to initialize and finalize themselves
authorChris Lattner <sabre@nondot.org>
Tue, 20 Apr 2004 21:30:06 +0000 (21:30 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 20 Apr 2004 21:30:06 +0000 (21:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13084 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CallGraphSCCPass.h
lib/Analysis/IPA/CallGraphSCCPass.cpp

index 86cdc29f571a580615a0dd5e6fa4c2cb95585100..73c9323074f1098fa4864d7e2d72d485b59fd8d3 100644 (file)
 namespace llvm {
 
 class CallGraphNode;
+class Module;
 
 struct CallGraphSCCPass : public Pass {
 
+  /// doInitialization - This method is called before the SCC's of the program
+  /// has been processed, allowing the pass to do initialization as necessary.
+  virtual bool doInitialization(Module &M) {
+    return false;
+  }
+
   /// runOnSCC - This method should be implemented by the subclass to perform
   /// whatever action is necessary for the specified SCC.  Note that
   /// non-recursive (or only self-recursive) functions will have an SCC size of
@@ -36,6 +43,12 @@ struct CallGraphSCCPass : public Pass {
   ///
   virtual bool runOnSCC(const std::vector<CallGraphNode *> &SCC) = 0;
 
+  /// doFinalization - This method is called after the SCC's of the program has
+  /// been processed, allowing the pass to do final cleanup as necessary.
+  virtual bool doFinalization(Module &M) {
+    return false;
+  }
+
   /// run - Run this pass, returning true if a modification was made to the
   /// module argument.  This is implemented in terms of the runOnSCC method.
   ///
index e9ab6500c8d66016fe1255da7e9a4e25a63495b0..23aedb0731f37e47af3305e011d5e0bfe667ed5d 100644 (file)
@@ -18,8 +18,7 @@
 #include "llvm/CallGraphSCCPass.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "Support/SCCIterator.h"
-
-namespace llvm {
+using namespace llvm;
 
 /// getAnalysisUsage - For this class, we declare that we require and preserve
 /// the call graph.  If the derived class implements this method, it should
@@ -31,11 +30,9 @@ void CallGraphSCCPass::getAnalysisUsage(AnalysisUsage &AU) const {
 
 bool CallGraphSCCPass::run(Module &M) {
   CallGraph &CG = getAnalysis<CallGraph>();
-  bool Changed = false;
+  bool Changed = doInitialization(M);
   for (scc_iterator<CallGraph*> I = scc_begin(&CG), E = scc_end(&CG);
        I != E; ++I)
     Changed = runOnSCC(*I);
-  return Changed;
+  return Changed | doFinalization(M);
 }
-
-} // End llvm namespace