None of the __llvm_* functions call into the program. This makes the
[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 static RegisterAnalysis<CallGraph> X("callgraph", "Call Graph Construction");
57
58 static const char * const KnownExternalFunctions[] = {
59   // Low-level system calls
60   "open",
61   "read",
62   "write",
63   "writev",
64   "lseek",
65   "poll",
66   "ioctl",
67
68   // Low-level stdc library functions
69   "abort",
70   "getenv",
71   "putenv",
72   
73   // Standard IO functions
74   "printf",
75   "sprintf",
76   "fopen",
77   "freopen",
78   "fclose",
79   "fwrite",
80   "puts",
81   "fputs",
82   "getc",
83   "ungetc",
84   "putc",
85   "putchar",
86   "fread",
87   "fileno",
88   "ftell",
89   "fflush",
90   "fseek",
91   "fileno",
92   "ferror",
93   "feof",
94   "fdopen",
95   "__fxstat",
96   "setbuf",
97   "setbuffer",
98   "etlinebuf",
99   "setvbuf",
100
101   // Memory functions
102   "malloc",
103   "free",
104   "realloc",
105   "calloc",
106   "memalign",
107   
108   // String functions
109   "atoi",
110   "memmove",
111   "memset",
112   "memchr",
113   "memcmp",
114   "strchr",
115   "strncpy",
116   "strncmp",
117   "strcmp",
118   "__strcoll_l",
119   "__strxfrm_l",
120   "__strftime_l",
121   "__strtol_l",
122   "__strtoul_l",
123   "__strtoll_l",
124   "__strtoull_l",
125   "__strtof_l",
126   "__strtod_l",
127   "__strtold_l",
128
129   // Locale functions
130   "__uselocale",
131   "__newlocale",
132   "__freelocale",
133   "__duplocale",
134   "__nl_langinfo_l",
135
136   // gettext functions used by libstdc++
137   "gettext",
138   "dgettext",
139   "dcgettext",
140   "textdomain",
141   "bindtextdomain",
142   
143   // Random stuff
144   "__assert_fail",
145   "__errno_location",
146 };
147
148
149 /// ExternalFunctionDoesntCallIntoProgram - This hack is used to indicate to the
150 /// call graph that the specified external function is _KNOWN_ to not call back
151 /// into the program.  This is important, because otherwise functions which call
152 /// "printf" for example, end up in a great big SCC that goes from the function
153 /// through main.
154 ///
155 static bool ExternalFunctionDoesntCallIntoProgram(const std::string &Name) {
156   static std::vector<std::string> Funcs;
157
158   // First time this is called?
159   if (Funcs.empty()) {
160     // Add a whole bunch of functions which are often used...
161     Funcs.insert(Funcs.end(), KnownExternalFunctions,
162                  KnownExternalFunctions+
163               sizeof(KnownExternalFunctions)/sizeof(KnownExternalFunctions[0]));
164     // Sort the list for efficient access
165     std::sort(Funcs.begin(), Funcs.end());
166   }
167
168   if (Name.size() > 7 && !memcmp("__llvm_", Name.c_str(), 7))
169     return true;
170
171   // Binary search for the function name...
172   std::vector<std::string>::iterator I =
173     std::lower_bound(Funcs.begin(), Funcs.end(), Name);
174
175   // Found it?
176   return I != Funcs.end() && *I == Name;
177 }
178
179
180
181 // getNodeFor - Return the node for the specified function or create one if it
182 // does not already exist.
183 //
184 CallGraphNode *CallGraph::getNodeFor(Function *F) {
185   CallGraphNode *&CGN = FunctionMap[F];
186   if (CGN) return CGN;
187
188   assert((!F || F->getParent() == Mod) && "Function not in current module!");
189   return CGN = new CallGraphNode(F);
190 }
191
192 static bool isOnlyADirectCall(Function *F, CallSite CS) {
193   if (!CS.getInstruction()) return false;
194   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); I != E; ++I)
195     if (*I == F) return false;
196   return true;
197 }
198
199 // addToCallGraph - Add a function to the call graph, and link the node to all
200 // of the functions that it calls.
201 //
202 void CallGraph::addToCallGraph(Function *F) {
203   CallGraphNode *Node = getNodeFor(F);
204
205   // If this function has external linkage, anything could call it...
206   if (!F->hasInternalLinkage()) {
207     ExternalNode->addCalledFunction(Node);
208
209     // Found the entry point?
210     if (F->getName() == "main") {
211       if (Root)
212         Root = ExternalNode;  // Found multiple external mains?  Don't pick one.
213       else
214         Root = Node;          // Found a main, keep track of it!
215     }
216   }
217   
218   // If this function is not defined in this translation unit, it could call
219   // anything.
220   if (F->isExternal() && !F->getIntrinsicID() && 
221       !ExternalFunctionDoesntCallIntoProgram(F->getName()))
222     Node->addCalledFunction(ExternalNode);
223
224   // Loop over all of the users of the function... looking for callers...
225   //
226   bool isUsedExternally = false;
227   for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I) {
228     if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
229       if (isOnlyADirectCall(F, CallSite::get(Inst)))
230         getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
231       else
232         isUsedExternally = true;
233     } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) {
234       // THIS IS A DISGUSTING HACK.  Brought to you by the power of
235       // ConstantPointerRefs!
236       for (Value::use_iterator I = CPR->use_begin(), E = CPR->use_end();
237            I != E; ++I)
238         if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
239           if (isOnlyADirectCall(F, CallSite::get(Inst)))
240             getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node);
241           else
242             isUsedExternally = true;
243         } else {
244           isUsedExternally = true;
245         }
246     } else {                        // Can't classify the user!
247       isUsedExternally = true;
248     }
249   }
250   if (isUsedExternally)
251     ExternalNode->addCalledFunction(Node);
252
253   // Look for an indirect function call...
254   for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB)
255     for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II){
256       CallSite CS = CallSite::get(II);
257       if (CS.getInstruction() && !CS.getCalledFunction())
258         Node->addCalledFunction(ExternalNode);
259     }
260 }
261
262 bool CallGraph::run(Module &M) {
263   destroy();
264
265   Mod = &M;
266   ExternalNode = getNodeFor(0);
267   Root = 0;
268
269   // Add every function to the call graph...
270   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
271     addToCallGraph(I);
272
273   // If we didn't find a main function, use the external call graph node
274   if (Root == 0) Root = ExternalNode;
275   
276   return false;
277 }
278
279 void CallGraph::destroy() {
280   for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end();
281        I != E; ++I)
282     delete I->second;
283   FunctionMap.clear();
284 }
285
286 static void WriteToOutput(const CallGraphNode *CGN, std::ostream &o) {
287   if (CGN->getFunction())
288     o << "Call graph node for function: '"
289       << CGN->getFunction()->getName() <<"'\n";
290   else
291     o << "Call graph node <<null function: 0x" << CGN << ">>:\n";
292
293   for (unsigned i = 0; i < CGN->size(); ++i)
294     if ((*CGN)[i]->getFunction())
295       o << "  Calls function '" << (*CGN)[i]->getFunction()->getName() << "'\n";
296     else
297       o << "  Calls external node\n";
298   o << "\n";
299 }
300
301 void CallGraph::print(std::ostream &o, const Module *M) const {
302   o << "CallGraph Root is: ";
303   if (getRoot()->getFunction())
304     o << getRoot()->getFunction()->getName() << "\n";
305   else
306     o << "<<null function: 0x" << getRoot() << ">>\n";
307   
308   for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I)
309     WriteToOutput(I->second, o);
310 }
311
312
313 //===----------------------------------------------------------------------===//
314 // Implementations of public modification methods
315 //
316
317 // Functions to keep a call graph up to date with a function that has been
318 // modified
319 //
320 void CallGraph::addFunctionToModule(Function *Meth) {
321   assert(0 && "not implemented");
322   abort();
323 }
324
325 // removeFunctionFromModule - Unlink the function from this module, returning
326 // it.  Because this removes the function from the module, the call graph node
327 // is destroyed.  This is only valid if the function does not call any other
328 // functions (ie, there are no edges in it's CGN).  The easiest way to do this
329 // is to dropAllReferences before calling this.
330 //
331 Function *CallGraph::removeFunctionFromModule(CallGraphNode *CGN) {
332   assert(CGN->CalledFunctions.empty() && "Cannot remove function from call "
333          "graph if it references other functions!");
334   Function *F = CGN->getFunction(); // Get the function for the call graph node
335   delete CGN;                       // Delete the call graph node for this func
336   FunctionMap.erase(F);             // Remove the call graph node from the map
337
338   Mod->getFunctionList().remove(F);
339   return F;
340 }
341
342 void CallGraph::stub() {}