Put all LLVM code into the llvm namespace, as per bug 109.
[oota-llvm.git] / lib / Analysis / IPA / CallGraph.cpp
1 //===- CallGraph.cpp - Build a Module's call graph ------------------------===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This interface is used to build and manipulate a call graph, which is a very 
11 // useful tool for interprocedural optimization.
12 //
13 // Every function in a module is represented as a node in the call graph.  The
14 // callgraph node keeps track of which functions the are called by the function
15 // corresponding to the node.
16 //
17 // A call graph will contain nodes where the function that they correspond to is
18 // null.  This 'external' node is used to represent control flow that is not
19 // represented (or analyzable) in the module.  As such, the external node will
20 // have edges to functions with the following properties:
21 //   1. All functions in the module without internal linkage, since they could
22 //      be called by functions outside of the our analysis capability.
23 //   2. All functions whose address is used for something more than a direct
24 //      call, for example being stored into a memory location.  Since they may
25 //      be called by an unknown caller later, they must be tracked as such.
26 //
27 // Similarly, functions have a call edge to the external node iff:
28 //   1. The function is external, reflecting the fact that they could call
29 //      anything without internal linkage or that has its address taken.
30 //   2. The function contains an indirect function call.
31 //
32 // As an extension in the future, there may be multiple nodes with a null
33 // function.  These will be used when we can prove (through pointer analysis)
34 // that an indirect call site can call only a specific set of functions.
35 //
36 // Because of these properties, the CallGraph captures a conservative superset
37 // of all of the caller-callee relationships, which is useful for
38 // transformations.
39 //
40 // The CallGraph class also attempts to figure out what the root of the
41 // CallGraph is, which is currently does by looking for a function named 'main'.
42 // If no function named 'main' is found, the external node is used as the entry
43 // node, reflecting the fact that any function without internal linkage could
44 // be called into (which is common for libraries).
45 //
46 //===----------------------------------------------------------------------===//
47
48 #include "llvm/Analysis/CallGraph.h"
49 #include "llvm/Constants.h"     // Remove when ConstantPointerRefs are gone
50 #include "llvm/Module.h"
51 #include "llvm/iOther.h"
52 #include "llvm/iTerminators.h"
53 #include "llvm/Support/CallSite.h"
54 #include "Support/STLExtras.h"
55
56 namespace llvm {
57
58 static RegisterAnalysis<CallGraph> X("callgraph", "Call Graph Construction");
59
60 static const char * const KnownExternalFunctions[] = {
61   // Low-level system calls
62   "open",
63   "read",
64   "write",
65   "writev",
66   "lseek",
67   "poll",
68   "ioctl",
69
70   // Low-level stdc library functions
71   "abort", "exit",
72   "getenv", "putenv",
73   
74   // Standard IO functions
75   "printf",
76   "sprintf",
77   "fopen",
78   "freopen",
79   "fclose",
80   "fwrite",
81   "puts",
82   "fputs",
83   "getc",
84   "ungetc",
85   "putc",
86   "putchar",
87   "fread",
88   "fileno",
89   "ftell",
90   "fflush",
91   "fseek",
92   "fileno",
93   "ferror",
94   "feof",
95   "fdopen",
96   "__fxstat",
97   "setbuf",
98   "setbuffer",
99   "etlinebuf",
100   "setvbuf",
101
102   // Memory functions
103   "malloc",
104   "free",
105   "realloc",
106   "calloc",
107   "memalign",
108   
109   // String functions
110   "atoi",
111   "memmove",
112   "memset",
113   "memchr",
114   "memcmp",
115   "strchr",
116   "strncpy",
117   "strncmp",
118   "strcmp",
119   "strtok",
120   "__strcoll_l",
121   "__strxfrm_l",
122   "__strftime_l",
123   "__strtol_l",
124   "__strtoul_l",
125   "__strtoll_l",
126   "__strtoull_l",
127   "__strtof_l",
128   "__strtod_l",
129   "__strtold_l",
130   "isalpha",
131
132   // Math functions
133   "exp", "sqrt", "cbrt", "hypot",
134   "log", "log10", "pow",
135   "sin", "cos", "tan",
136   "asin", "acos", "atan", "atan2",
137
138   // Locale functions
139   "__uselocale",
140   "__newlocale",
141   "__freelocale",
142   "__duplocale",
143   "__nl_langinfo_l",
144
145   // gettext functions used by libstdc++
146   "gettext",
147   "dgettext",
148   "dcgettext",
149   "textdomain",
150   "bindtextdomain",
151   
152   // Random stuff
153   "__assert_fail",
154   "__errno_location",
155   "clock", "time",
156   "__main",
157 };
158
159
160 /// ExternalFunctionDoesntCallIntoProgram - This hack is used to indicate to the
161 /// call graph that the specified external function is _KNOWN_ to not call back
162 /// into the program.  This is important, because otherwise functions which call
163 /// "printf" for example, end up in a great big SCC that goes from the function
164 /// through main.
165 ///
166 static bool ExternalFunctionDoesntCallIntoProgram(const std::string &Name) {
167   static std::vector<std::string> Funcs;
168
169   // First time this is called?
170   if (Funcs.empty()) {
171     // Add a whole bunch of functions which are often used...
172     Funcs.insert(Funcs.end(), KnownExternalFunctions,
173                  KnownExternalFunctions+
174               sizeof(KnownExternalFunctions)/sizeof(KnownExternalFunctions[0]));
175     // Sort the list for efficient access
176     std::sort(Funcs.begin(), Funcs.end());
177   }
178
179   if (Name.size() > 7 && !memcmp("__llvm_", Name.c_str(), 7))
180     return true;
181
182   // Binary search for the function name...
183   std::vector<std::string>::iterator I =
184     std::lower_bound(Funcs.begin(), Funcs.end(), Name);
185
186   // Found it?
187   return I != Funcs.end() && *I == Name;
188 }
189
190
191
192 // getNodeFor - Return the node for the specified function or create one if it
193 // does not already exist.
194 //
195 CallGraphNode *CallGraph::getNodeFor(Function *F) {
196   CallGraphNode *&CGN = FunctionMap[F];
197   if (CGN) return CGN;
198
199   assert((!F || F->getParent() == Mod) && "Function not in current module!");
200   return CGN = new CallGraphNode(F);
201 }
202
203 static bool isOnlyADirectCall(Function *F, CallSite CS) {
204   if (!CS.getInstruction()) return false;
205   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); I != E; ++I)
206     if (*I == F) return false;
207   return true;
208 }
209
210 // addToCallGraph - Add a function to the call graph, and link the node to all
211 // of the functions that it calls.
212 //
213 void CallGraph::addToCallGraph(Function *F) {
214   CallGraphNode *Node = getNodeFor(F);
215
216   // If this function has external linkage, anything could call it...
217   if (!F->hasInternalLinkage()) {
218     ExternalNode->addCalledFunction(Node);
219
220     // Found the entry point?
221     if (F->getName() == "main") {
222       if (Root)
223         Root = ExternalNode;  // Found multiple external mains?  Don't pick one.
224       else
225         Root = Node;          // Found a main, keep track of it!
226     }
227   }
228   
229   // If this function is not defined in this translation unit, it could call
230   // anything.
231   if (F->isExternal() && !F->getIntrinsicID() && 
232       !ExternalFunctionDoesntCallIntoProgram(F->getName()))
233     Node->addCalledFunction(ExternalNode);
234
235   // Loop over all of the users of the function... looking for callers...
236   //
237   bool isUsedExternally = false;
238   for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I) {
239     if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
240       if (isOnlyADirectCall(F, CallSite::get(Inst)))
241         getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
242       else
243         isUsedExternally = true;
244     } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) {
245       // THIS IS A DISGUSTING HACK.  Brought to you by the power of
246       // ConstantPointerRefs!
247       for (Value::use_iterator I = CPR->use_begin(), E = CPR->use_end();
248            I != E; ++I)
249         if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
250           if (isOnlyADirectCall(F, CallSite::get(Inst)))
251             getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
252           else
253             isUsedExternally = true;
254         } else {
255           isUsedExternally = true;
256         }
257     } else {                        // Can't classify the user!
258       isUsedExternally = true;
259     }
260   }
261   if (isUsedExternally)
262     ExternalNode->addCalledFunction(Node);
263
264   // Look for an indirect function call...
265   for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB)
266     for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II){
267       CallSite CS = CallSite::get(II);
268       if (CS.getInstruction() && !CS.getCalledFunction())
269         Node->addCalledFunction(ExternalNode);
270     }
271 }
272
273 bool CallGraph::run(Module &M) {
274   destroy();
275
276   Mod = &M;
277   ExternalNode = getNodeFor(0);
278   Root = 0;
279
280   // Add every function to the call graph...
281   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
282     addToCallGraph(I);
283
284   // If we didn't find a main function, use the external call graph node
285   if (Root == 0) Root = ExternalNode;
286   
287   return false;
288 }
289
290 void CallGraph::destroy() {
291   for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end();
292        I != E; ++I)
293     delete I->second;
294   FunctionMap.clear();
295 }
296
297 static void WriteToOutput(const CallGraphNode *CGN, std::ostream &o) {
298   if (CGN->getFunction())
299     o << "Call graph node for function: '"
300       << CGN->getFunction()->getName() <<"'\n";
301   else
302     o << "Call graph node <<null function: 0x" << CGN << ">>:\n";
303
304   for (unsigned i = 0; i < CGN->size(); ++i)
305     if ((*CGN)[i]->getFunction())
306       o << "  Calls function '" << (*CGN)[i]->getFunction()->getName() << "'\n";
307     else
308       o << "  Calls external node\n";
309   o << "\n";
310 }
311
312 void CallGraph::print(std::ostream &o, const Module *M) const {
313   o << "CallGraph Root is: ";
314   if (getRoot()->getFunction())
315     o << getRoot()->getFunction()->getName() << "\n";
316   else
317     o << "<<null function: 0x" << getRoot() << ">>\n";
318   
319   for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I)
320     WriteToOutput(I->second, o);
321 }
322
323
324 //===----------------------------------------------------------------------===//
325 // Implementations of public modification methods
326 //
327
328 // Functions to keep a call graph up to date with a function that has been
329 // modified
330 //
331 void CallGraph::addFunctionToModule(Function *Meth) {
332   assert(0 && "not implemented");
333   abort();
334 }
335
336 // removeFunctionFromModule - Unlink the function from this module, returning
337 // it.  Because this removes the function from the module, the call graph node
338 // is destroyed.  This is only valid if the function does not call any other
339 // functions (ie, there are no edges in it's CGN).  The easiest way to do this
340 // is to dropAllReferences before calling this.
341 //
342 Function *CallGraph::removeFunctionFromModule(CallGraphNode *CGN) {
343   assert(CGN->CalledFunctions.empty() && "Cannot remove function from call "
344          "graph if it references other functions!");
345   Function *F = CGN->getFunction(); // Get the function for the call graph node
346   delete CGN;                       // Delete the call graph node for this func
347   FunctionMap.erase(F);             // Remove the call graph node from the map
348
349   Mod->getFunctionList().remove(F);
350   return F;
351 }
352
353 void CallGraph::stub() {}
354
355 } // End llvm namespace