LLVM API Documentation
00001 //===- CallGraph.h - Build a Module's call graph ----------------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This interface is used to build and manipulate a call graph, which is a very 00011 // useful tool for interprocedural optimization. 00012 // 00013 // Every function in a module is represented as a node in the call graph. The 00014 // callgraph node keeps track of which functions the are called by the function 00015 // corresponding to the node. 00016 // 00017 // A call graph may contain nodes where the function that they correspond to is 00018 // null. These 'external' nodes are used to represent control flow that is not 00019 // represented (or analyzable) in the module. In particular, this analysis 00020 // builds one external node such that: 00021 // 1. All functions in the module without internal linkage will have edges 00022 // from this external node, indicating that they could be called by 00023 // functions outside of the module. 00024 // 2. All functions whose address is used for something more than a direct 00025 // call, for example being stored into a memory location will also have an 00026 // edge from this external node. Since they may be called by an unknown 00027 // caller later, they must be tracked as such. 00028 // 00029 // There is a second external node added for calls that leave this module. 00030 // Functions have a call edge to the external node iff: 00031 // 1. The function is external, reflecting the fact that they could call 00032 // anything without internal linkage or that has its address taken. 00033 // 2. The function contains an indirect function call. 00034 // 00035 // As an extension in the future, there may be multiple nodes with a null 00036 // function. These will be used when we can prove (through pointer analysis) 00037 // that an indirect call site can call only a specific set of functions. 00038 // 00039 // Because of these properties, the CallGraph captures a conservative superset 00040 // of all of the caller-callee relationships, which is useful for 00041 // transformations. 00042 // 00043 // The CallGraph class also attempts to figure out what the root of the 00044 // CallGraph is, which it currently does by looking for a function named 'main'. 00045 // If no function named 'main' is found, the external node is used as the entry 00046 // node, reflecting the fact that any function without internal linkage could 00047 // be called into (which is common for libraries). 00048 // 00049 //===----------------------------------------------------------------------===// 00050 00051 #ifndef LLVM_ANALYSIS_CALLGRAPH_H 00052 #define LLVM_ANALYSIS_CALLGRAPH_H 00053 00054 #include "llvm/ADT/GraphTraits.h" 00055 #include "llvm/ADT/STLExtras.h" 00056 #include "llvm/Pass.h" 00057 #include "llvm/Support/CallSite.h" 00058 #include "llvm/System/IncludeFile.h" 00059 #include <map> 00060 00061 namespace llvm { 00062 00063 class Function; 00064 class Module; 00065 class CallGraphNode; 00066 00067 //===----------------------------------------------------------------------===// 00068 // CallGraph class definition 00069 // 00070 class CallGraph { 00071 protected: 00072 Module *Mod; // The module this call graph represents 00073 00074 typedef std::map<const Function *, CallGraphNode *> FunctionMapTy; 00075 FunctionMapTy FunctionMap; // Map from a function to its node 00076 00077 public: 00078 static char ID; // Class identification, replacement for typeinfo 00079 //===--------------------------------------------------------------------- 00080 // Accessors... 00081 // 00082 typedef FunctionMapTy::iterator iterator; 00083 typedef FunctionMapTy::const_iterator const_iterator; 00084 00085 /// getModule - Return the module the call graph corresponds to. 00086 /// 00087 Module &getModule() const { return *Mod; } 00088 00089 inline iterator begin() { return FunctionMap.begin(); } 00090 inline iterator end() { return FunctionMap.end(); } 00091 inline const_iterator begin() const { return FunctionMap.begin(); } 00092 inline const_iterator end() const { return FunctionMap.end(); } 00093 00094 // Subscripting operators, return the call graph node for the provided 00095 // function 00096 inline const CallGraphNode *operator[](const Function *F) const { 00097 const_iterator I = FunctionMap.find(F); 00098 assert(I != FunctionMap.end() && "Function not in callgraph!"); 00099 return I->second; 00100 } 00101 inline CallGraphNode *operator[](const Function *F) { 00102 const_iterator I = FunctionMap.find(F); 00103 assert(I != FunctionMap.end() && "Function not in callgraph!"); 00104 return I->second; 00105 } 00106 00107 /// Returns the CallGraphNode which is used to represent undetermined calls 00108 /// into the callgraph. Override this if you want behavioral inheritance. 00109 virtual CallGraphNode* getExternalCallingNode() const { return 0; } 00110 00111 /// Return the root/main method in the module, or some other root node, such 00112 /// as the externalcallingnode. Overload these if you behavioral 00113 /// inheritance. 00114 virtual CallGraphNode* getRoot() { return 0; } 00115 virtual const CallGraphNode* getRoot() const { return 0; } 00116 00117 //===--------------------------------------------------------------------- 00118 // Functions to keep a call graph up to date with a function that has been 00119 // modified. 00120 // 00121 00122 /// removeFunctionFromModule - Unlink the function from this module, returning 00123 /// it. Because this removes the function from the module, the call graph 00124 /// node is destroyed. This is only valid if the function does not call any 00125 /// other functions (ie, there are no edges in it's CGN). The easiest way to 00126 /// do this is to dropAllReferences before calling this. 00127 /// 00128 Function *removeFunctionFromModule(CallGraphNode *CGN); 00129 Function *removeFunctionFromModule(Function *F) { 00130 return removeFunctionFromModule((*this)[F]); 00131 } 00132 00133 /// changeFunction - This method changes the function associated with this 00134 /// CallGraphNode, for use by transformations that need to change the 00135 /// prototype of a Function (thus they must create a new Function and move the 00136 /// old code over). 00137 void changeFunction(Function *OldF, Function *NewF); 00138 00139 /// getOrInsertFunction - This method is identical to calling operator[], but 00140 /// it will insert a new CallGraphNode for the specified function if one does 00141 /// not already exist. 00142 CallGraphNode *getOrInsertFunction(const Function *F); 00143 00144 //===--------------------------------------------------------------------- 00145 // Pass infrastructure interface glue code... 00146 // 00147 protected: 00148 CallGraph() {} 00149 00150 public: 00151 virtual ~CallGraph() { destroy(); } 00152 00153 /// initialize - Call this method before calling other methods, 00154 /// re/initializes the state of the CallGraph. 00155 /// 00156 void initialize(Module &M); 00157 00158 virtual void print(std::ostream &o, const Module *M) const; 00159 void print(std::ostream *o, const Module *M) const { if (o) print(*o, M); } 00160 void dump() const; 00161 00162 protected: 00163 // destroy - Release memory for the call graph 00164 virtual void destroy(); 00165 }; 00166 00167 //===----------------------------------------------------------------------===// 00168 // CallGraphNode class definition 00169 // 00170 class CallGraphNode { 00171 Function *F; 00172 typedef std::pair<CallSite,CallGraphNode*> CallRecord; 00173 std::vector<CallRecord> CalledFunctions; 00174 00175 CallGraphNode(const CallGraphNode &); // Do not implement 00176 public: 00177 typedef std::vector<CallRecord> CalledFunctionsVector; 00178 00179 //===--------------------------------------------------------------------- 00180 // Accessor methods... 00181 // 00182 00183 typedef std::vector<CallRecord>::iterator iterator; 00184 typedef std::vector<CallRecord>::const_iterator const_iterator; 00185 00186 // getFunction - Return the function that this call graph node represents... 00187 Function *getFunction() const { return F; } 00188 00189 inline iterator begin() { return CalledFunctions.begin(); } 00190 inline iterator end() { return CalledFunctions.end(); } 00191 inline const_iterator begin() const { return CalledFunctions.begin(); } 00192 inline const_iterator end() const { return CalledFunctions.end(); } 00193 inline bool empty() const { return CalledFunctions.empty(); } 00194 inline unsigned size() const { return (unsigned)CalledFunctions.size(); } 00195 00196 // Subscripting operator - Return the i'th called function... 00197 // 00198 CallGraphNode *operator[](unsigned i) const { 00199 return CalledFunctions[i].second; 00200 } 00201 00202 /// dump - Print out this call graph node. 00203 /// 00204 void dump() const; 00205 void print(std::ostream &OS) const; 00206 void print(std::ostream *OS) const { if (OS) print(*OS); } 00207 00208 //===--------------------------------------------------------------------- 00209 // Methods to keep a call graph up to date with a function that has been 00210 // modified 00211 // 00212 00213 /// removeAllCalledFunctions - As the name implies, this removes all edges 00214 /// from this CallGraphNode to any functions it calls. 00215 void removeAllCalledFunctions() { 00216 CalledFunctions.clear(); 00217 } 00218 00219 /// addCalledFunction - Add a function to the list of functions called by this 00220 /// one. 00221 void addCalledFunction(CallSite CS, CallGraphNode *M) { 00222 CalledFunctions.push_back(std::make_pair(CS, M)); 00223 } 00224 00225 /// removeCallEdgeFor - This method removes the edge in the node for the 00226 /// specified call site. Note that this method takes linear time, so it 00227 /// should be used sparingly. 00228 void removeCallEdgeFor(CallSite CS); 00229 00230 /// removeAnyCallEdgeTo - This method removes all call edges from this node 00231 /// to the specified callee function. This takes more time to execute than 00232 /// removeCallEdgeTo, so it should not be used unless necessary. 00233 void removeAnyCallEdgeTo(CallGraphNode *Callee); 00234 00235 /// removeOneAbstractEdgeTo - Remove one edge associated with a null callsite 00236 /// from this node to the specified callee function. 00237 void removeOneAbstractEdgeTo(CallGraphNode *Callee); 00238 00239 /// replaceCallSite - Make the edge in the node for Old CallSite be for 00240 /// New CallSite instead. Note that this method takes linear time, so it 00241 /// should be used sparingly. 00242 void replaceCallSite(CallSite Old, CallSite New); 00243 00244 friend class CallGraph; 00245 00246 // CallGraphNode ctor - Create a node for the specified function. 00247 inline CallGraphNode(Function *f) : F(f) {} 00248 }; 00249 00250 //===----------------------------------------------------------------------===// 00251 // GraphTraits specializations for call graphs so that they can be treated as 00252 // graphs by the generic graph algorithms. 00253 // 00254 00255 // Provide graph traits for tranversing call graphs using standard graph 00256 // traversals. 00257 template <> struct GraphTraits<CallGraphNode*> { 00258 typedef CallGraphNode NodeType; 00259 00260 typedef std::pair<CallSite, CallGraphNode*> CGNPairTy; 00261 typedef std::pointer_to_unary_function<CGNPairTy, CallGraphNode*> CGNDerefFun; 00262 00263 static NodeType *getEntryNode(CallGraphNode *CGN) { return CGN; } 00264 00265 typedef mapped_iterator<NodeType::iterator, CGNDerefFun> ChildIteratorType; 00266 00267 static inline ChildIteratorType child_begin(NodeType *N) { 00268 return map_iterator(N->begin(), CGNDerefFun(CGNDeref)); 00269 } 00270 static inline ChildIteratorType child_end (NodeType *N) { 00271 return map_iterator(N->end(), CGNDerefFun(CGNDeref)); 00272 } 00273 00274 static CallGraphNode *CGNDeref(CGNPairTy P) { 00275 return P.second; 00276 } 00277 00278 }; 00279 00280 template <> struct GraphTraits<const CallGraphNode*> { 00281 typedef const CallGraphNode NodeType; 00282 typedef NodeType::const_iterator ChildIteratorType; 00283 00284 static NodeType *getEntryNode(const CallGraphNode *CGN) { return CGN; } 00285 static inline ChildIteratorType child_begin(NodeType *N) { return N->begin();} 00286 static inline ChildIteratorType child_end (NodeType *N) { return N->end(); } 00287 }; 00288 00289 template<> struct GraphTraits<CallGraph*> : public GraphTraits<CallGraphNode*> { 00290 static NodeType *getEntryNode(CallGraph *CGN) { 00291 return CGN->getExternalCallingNode(); // Start at the external node! 00292 } 00293 typedef std::pair<const Function*, CallGraphNode*> PairTy; 00294 typedef std::pointer_to_unary_function<PairTy, CallGraphNode&> DerefFun; 00295 00296 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 00297 typedef mapped_iterator<CallGraph::iterator, DerefFun> nodes_iterator; 00298 static nodes_iterator nodes_begin(CallGraph *CG) { 00299 return map_iterator(CG->begin(), DerefFun(CGdereference)); 00300 } 00301 static nodes_iterator nodes_end (CallGraph *CG) { 00302 return map_iterator(CG->end(), DerefFun(CGdereference)); 00303 } 00304 00305 static CallGraphNode &CGdereference(PairTy P) { 00306 return *P.second; 00307 } 00308 }; 00309 00310 template<> struct GraphTraits<const CallGraph*> : 00311 public GraphTraits<const CallGraphNode*> { 00312 static NodeType *getEntryNode(const CallGraph *CGN) { 00313 return CGN->getExternalCallingNode(); 00314 } 00315 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 00316 typedef CallGraph::const_iterator nodes_iterator; 00317 static nodes_iterator nodes_begin(const CallGraph *CG) { return CG->begin(); } 00318 static nodes_iterator nodes_end (const CallGraph *CG) { return CG->end(); } 00319 }; 00320 00321 } // End llvm namespace 00322 00323 // Make sure that any clients of this file link in CallGraph.cpp 00324 FORCE_DEFINING_FILE_TO_BE_LINKED(CallGraph) 00325 00326 #endif