X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCallGraphSCCPass.h;h=fc9feda5bd8c26422aa64c002bed24e218279982;hb=dda30cd4af1c5f88fc00fd40b673f8e27c61379d;hp=bb97a277cc91e98dbf2a367bb2226c60d17e15e1;hpb=6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be;p=oota-llvm.git diff --git a/include/llvm/CallGraphSCCPass.h b/include/llvm/CallGraphSCCPass.h index bb97a277cc9..fc9feda5bd8 100644 --- a/include/llvm/CallGraphSCCPass.h +++ b/include/llvm/CallGraphSCCPass.h @@ -1,10 +1,10 @@ //===- CallGraphSCCPass.h - Pass that operates BU on call graph -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // // This file defines the CallGraphSCCPass class, which is used for passes which @@ -22,23 +22,49 @@ #define LLVM_CALL_GRAPH_SCC_PASS_H #include "llvm/Pass.h" +#include "llvm/Analysis/CallGraph.h" + +namespace llvm { class CallGraphNode; +class CallGraph; +class PMStack; struct CallGraphSCCPass : public Pass { + explicit CallGraphSCCPass(intptr_t pid) : Pass(pid) {} + explicit CallGraphSCCPass(void *pid) : Pass(pid) {} + + /// 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(CallGraph &CG) { + 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 /// 1, where recursive portions of the call graph will have SCC size > 1. /// - virtual bool runOnSCC(const std::vector &SCC) = 0; - - /// run - Run this pass, returning true if a modification was made to the - /// module argument. This is implemented in terms of the runOnSCC method. + /// SCC passes that add or delete functions to the SCC are required to update + /// the SCC list, otherwise stale pointers may be dereferenced. /// - virtual bool run(Module &M); + virtual bool runOnSCC(std::vector &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(CallGraph &CG) { + return false; + } + /// Assign pass manager to manager this pass + virtual void assignPassManager(PMStack &PMS, + PassManagerType PMT = PMT_CallGraphPassManager); + + /// Return what kind of Pass Manager can manage this pass. + virtual PassManagerType getPotentialPassManagerType() const { + return PMT_CallGraphPassManager; + } /// getAnalysisUsage - For this class, we declare that we require and preserve /// the call graph. If the derived class implements this method, it should @@ -46,4 +72,6 @@ struct CallGraphSCCPass : public Pass { virtual void getAnalysisUsage(AnalysisUsage &Info) const; }; +} // End llvm namespace + #endif