diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-10-20 18:04:43 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-10-20 18:04:43 +0000 |
commit | 726bafda652754096ee4d3c8ceb07aa8d105f8b9 (patch) | |
tree | 10e6f6c3400348e7ae5dce5df0eb35b7c4b51b0c | |
parent | a3f8586d9dcc8e75358cc7bef2eedbd560904bc9 (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.h | 38 | ||||
-rw-r--r-- | include/llvm/Analysis/DataStructure/DSGraph.h | 38 |
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; } |