aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/CallGraph.h14
-rw-r--r--lib/Analysis/IPA/CallGraph.cpp23
2 files changed, 37 insertions, 0 deletions
diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h
index 3c6f7cc466..5f259d5933 100644
--- a/include/llvm/Analysis/CallGraph.h
+++ b/include/llvm/Analysis/CallGraph.h
@@ -89,4 +89,18 @@ private: // Implementation of CallGraph construction
} // end namespace cfg
+
+//******************* Externally Visible Functions *************************/
+
+
+// Checks if a method contains any call instructions.
+// Note that this uses the call graph only if one is provided.
+// It does not build the call graph.
+//
+bool IsLeafMethod (const Method* method,
+ const cfg::CallGraph* callGraph = NULL);
+
+
+//**************************************************************************/
+
#endif
diff --git a/lib/Analysis/IPA/CallGraph.cpp b/lib/Analysis/IPA/CallGraph.cpp
index 3f997a9dd4..51072e77ab 100644
--- a/lib/Analysis/IPA/CallGraph.cpp
+++ b/lib/Analysis/IPA/CallGraph.cpp
@@ -70,3 +70,26 @@ void cfg::WriteToOutput(const CallGraph &CG, ostream &o) {
for (CallGraph::const_iterator I = CG.begin(), E = CG.end(); I != E; ++I)
o << I->second;
}
+
+
+
+//
+// Checks if a method contains any call instructions.
+// Note that this uses the call graph only if one is provided.
+// It does not build the call graph.
+//
+bool IsLeafMethod(const Method* M, const cfg::CallGraph* CG) {
+ if (CG) {
+ const cfg::CallGraphNode *cgn = (*CG)[M];
+ return (cgn->begin() == cgn->end());
+ }
+ else {
+ for (Method::inst_const_iterator I = M->inst_begin(), E = M->inst_end();
+ I != E; ++I)
+ if ((*I)->getOpcode() == Instruction::Call)
+ return false;
+ return true;
+ }
+}
+
+