aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-10-20 18:04:43 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-10-20 18:04:43 +0000
commit726bafda652754096ee4d3c8ceb07aa8d105f8b9 (patch)
tree10e6f6c3400348e7ae5dce5df0eb35b7c4b51b0c
parenta3f8586d9dcc8e75358cc7bef2eedbd560904bc9 (diff)
Added a first-class representation for each call site that can be used
in the DS graphs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4227 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Analysis/DSGraph.h38
-rw-r--r--include/llvm/Analysis/DataStructure/DSGraph.h38
2 files changed, 70 insertions, 6 deletions
diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h
index efb82bc10f..1148dd65a1 100644
--- a/include/llvm/Analysis/DSGraph.h
+++ b/include/llvm/Analysis/DSGraph.h
@@ -10,8 +10,10 @@
#include <vector>
#include <map>
+#include <functional>
class Function;
+class CallInst;
class Value;
class GlobalValue;
class Type;
@@ -20,6 +22,7 @@ class DSNode; // Each node in the graph
class DSGraph; // A graph for a function
class DSNodeIterator; // Data structure graph traversal iterator
+
//===----------------------------------------------------------------------===//
/// DSNodeHandle - Implement a "handle" to a data structure node that takes care
/// of all of the add/un'refing of the node to prevent the backpointers in the
@@ -351,6 +354,35 @@ inline void DSNodeHandle::mergeWith(const DSNodeHandle &Node) {
//===----------------------------------------------------------------------===//
+/// DSCallSite - Representation of a call site via its call instruction,
+/// the DSNode handle for the callee function (or function pointer), and
+/// the DSNode handles for the function arguments.
+///
+class DSCallSite: public std::vector<DSNodeHandle> {
+ Function* caller;
+ CallInst* callInst;
+ DSCallSite(); // do not implement
+
+public:
+ DSCallSite(Function& _caller, CallInst& _callInst)
+ : caller(&_caller), callInst(&_callInst) { }
+
+ // Copy constructor with helper for cloning nodes. The helper should be a
+ // model of unary_function<const DSNodeHandle*, DSNodeHandle>, i.e., it
+ // should take a pointer to DSNodeHandle and return a fresh DSNodeHandle.
+ // If no helper is specified, this defaults to a simple copy constructor.
+ template<typename _CopierFunction>
+ DSCallSite::DSCallSite(const DSCallSite& FromCall,
+ _CopierFunction nodeCopier = *(_CopierFunction*) 0);
+
+ Function& getCaller() const { return *caller; }
+ CallInst& getCallInst() const { return *callInst; }
+ DSNodeHandle getReturnValueNode() const { return (*this)[0]; }
+ DSNodeHandle getCalleeNode() const { return (*this)[1]; }
+};
+
+
+//===----------------------------------------------------------------------===//
/// DSGraph - The graph that represents a function.
///
class DSGraph {
@@ -373,7 +405,7 @@ class DSGraph {
// call, the second is the function scalar being invoked, and the rest are
// pointer arguments to the function.
//
- std::vector<std::vector<DSNodeHandle> > FunctionCalls;
+ std::vector<DSCallSite> FunctionCalls;
void operator=(const DSGraph &); // DO NOT IMPLEMENT
public:
@@ -400,10 +432,10 @@ public:
std::map<Value*, DSNodeHandle> &getValueMap() { return ValueMap; }
const std::map<Value*, DSNodeHandle> &getValueMap() const { return ValueMap;}
- std::vector<std::vector<DSNodeHandle> > &getFunctionCalls() {
+ std::vector<DSCallSite> &getFunctionCalls() {
return FunctionCalls;
}
- const std::vector<std::vector<DSNodeHandle> > &getFunctionCalls() const {
+ const std::vector<DSCallSite> &getFunctionCalls() const {
return FunctionCalls;
}
diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h
index efb82bc10f..1148dd65a1 100644
--- a/include/llvm/Analysis/DataStructure/DSGraph.h
+++ b/include/llvm/Analysis/DataStructure/DSGraph.h
@@ -10,8 +10,10 @@
#include <vector>
#include <map>
+#include <functional>
class Function;
+class CallInst;
class Value;
class GlobalValue;
class Type;
@@ -20,6 +22,7 @@ class DSNode; // Each node in the graph
class DSGraph; // A graph for a function
class DSNodeIterator; // Data structure graph traversal iterator
+
//===----------------------------------------------------------------------===//
/// DSNodeHandle - Implement a "handle" to a data structure node that takes care
/// of all of the add/un'refing of the node to prevent the backpointers in the
@@ -351,6 +354,35 @@ inline void DSNodeHandle::mergeWith(const DSNodeHandle &Node) {
//===----------------------------------------------------------------------===//
+/// DSCallSite - Representation of a call site via its call instruction,
+/// the DSNode handle for the callee function (or function pointer), and
+/// the DSNode handles for the function arguments.
+///
+class DSCallSite: public std::vector<DSNodeHandle> {
+ Function* caller;
+ CallInst* callInst;
+ DSCallSite(); // do not implement
+
+public:
+ DSCallSite(Function& _caller, CallInst& _callInst)
+ : caller(&_caller), callInst(&_callInst) { }
+
+ // Copy constructor with helper for cloning nodes. The helper should be a
+ // model of unary_function<const DSNodeHandle*, DSNodeHandle>, i.e., it
+ // should take a pointer to DSNodeHandle and return a fresh DSNodeHandle.
+ // If no helper is specified, this defaults to a simple copy constructor.
+ template<typename _CopierFunction>
+ DSCallSite::DSCallSite(const DSCallSite& FromCall,
+ _CopierFunction nodeCopier = *(_CopierFunction*) 0);
+
+ Function& getCaller() const { return *caller; }
+ CallInst& getCallInst() const { return *callInst; }
+ DSNodeHandle getReturnValueNode() const { return (*this)[0]; }
+ DSNodeHandle getCalleeNode() const { return (*this)[1]; }
+};
+
+
+//===----------------------------------------------------------------------===//
/// DSGraph - The graph that represents a function.
///
class DSGraph {
@@ -373,7 +405,7 @@ class DSGraph {
// call, the second is the function scalar being invoked, and the rest are
// pointer arguments to the function.
//
- std::vector<std::vector<DSNodeHandle> > FunctionCalls;
+ std::vector<DSCallSite> FunctionCalls;
void operator=(const DSGraph &); // DO NOT IMPLEMENT
public:
@@ -400,10 +432,10 @@ public:
std::map<Value*, DSNodeHandle> &getValueMap() { return ValueMap; }
const std::map<Value*, DSNodeHandle> &getValueMap() const { return ValueMap;}
- std::vector<std::vector<DSNodeHandle> > &getFunctionCalls() {
+ std::vector<DSCallSite> &getFunctionCalls() {
return FunctionCalls;
}
- const std::vector<std::vector<DSNodeHandle> > &getFunctionCalls() const {
+ const std::vector<DSCallSite> &getFunctionCalls() const {
return FunctionCalls;
}