aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/IPA/CallGraph.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-10-13 06:33:19 +0000
committerChris Lattner <sabre@nondot.org>2001-10-13 06:33:19 +0000
commit9f9e2befd0d6366f1a2ebd082a1a6d703da21103 (patch)
tree8971a81357a62f734cbc22e0333f7e8ec50d4c7d /lib/Analysis/IPA/CallGraph.cpp
parent2f004fdf185320b80748a23fd28ce1625494f793 (diff)
* Add support for Invoke instructions
* Add support for indirect calls git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@752 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/IPA/CallGraph.cpp')
-rw-r--r--lib/Analysis/IPA/CallGraph.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/Analysis/IPA/CallGraph.cpp b/lib/Analysis/IPA/CallGraph.cpp
index 87dbf2b425..3f997a9dd4 100644
--- a/lib/Analysis/IPA/CallGraph.cpp
+++ b/lib/Analysis/IPA/CallGraph.cpp
@@ -4,6 +4,10 @@
// eventually implement call graph serialization and deserialization for
// annotation support.
//
+// This call graph represents a dynamic method invocation as a null method node.
+// A call graph may only have up to one null method node that represents all of
+// the dynamic method invocations.
+//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/CallGraph.h"
@@ -12,6 +16,7 @@
#include "llvm/Module.h"
#include "llvm/Method.h"
#include "llvm/iOther.h"
+#include "llvm/iTerminators.h"
#include <algorithm>
using namespace cfg;
@@ -36,10 +41,13 @@ CallGraphNode *CallGraph::getNodeFor(Method *M) {
void CallGraph::addToCallGraph(Method *M) {
CallGraphNode *Node = getNodeFor(M);
- for (Method::inst_iterator II = M->inst_begin(), IE = M->inst_end();
- II != IE; ++II) {
- if (CallInst *CI = dyn_cast<CallInst>(*II))
+ for (Method::inst_iterator I = M->inst_begin(), E = M->inst_end();
+ I != E; ++I) {
+ // Dynamic calls will cause Null nodes to be created
+ if (CallInst *CI = dyn_cast<CallInst>(*I))
Node->addCalledMethod(getNodeFor(CI->getCalledMethod()));
+ else if (InvokeInst *II = dyn_cast<InvokeInst>(*I))
+ Node->addCalledMethod(getNodeFor(II->getCalledMethod()));
}
}