mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Doxygenified and cleand up comments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -56,6 +56,7 @@ public:
|
||||
|
||||
/// replaceScalar - When an instruction needs to be modified, this method can
|
||||
/// be used to update the scalar map to remove the old and insert the new.
|
||||
///
|
||||
void replaceScalar(Value *Old, Value *New) {
|
||||
iterator I = find(Old);
|
||||
assert(I != end() && "Old value is not in the map!");
|
||||
@ -189,6 +190,7 @@ public:
|
||||
|
||||
/// getFunctionNames - Return a space separated list of the name of the
|
||||
/// functions in this graph (if any)
|
||||
///
|
||||
std::string getFunctionNames() const;
|
||||
|
||||
/// addNode - Add a new node to the graph.
|
||||
@ -240,6 +242,7 @@ public:
|
||||
|
||||
/// getReturnNodes - Return the mapping of functions to their return nodes for
|
||||
/// this graph.
|
||||
///
|
||||
const ReturnNodesTy &getReturnNodes() const { return ReturnNodes; }
|
||||
ReturnNodesTy &getReturnNodes() { return ReturnNodes; }
|
||||
|
||||
@ -273,6 +276,7 @@ public:
|
||||
|
||||
/// viewGraph - Emit a dot graph, run 'dot', run gv on the postscript file,
|
||||
/// then cleanup. For use from the debugger.
|
||||
///
|
||||
void viewGraph() const;
|
||||
|
||||
void writeGraphToFile(std::ostream &O, const std::string &GraphName) const;
|
||||
@ -354,7 +358,6 @@ public:
|
||||
void mergeInGraph(const DSCallSite &CS, Function &F, const DSGraph &Graph,
|
||||
unsigned CloneFlags);
|
||||
|
||||
|
||||
/// getCallSiteForArguments - Get the arguments and return value bindings for
|
||||
/// the specified function in the current graph.
|
||||
///
|
||||
@ -389,54 +392,57 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/// ReachabilityCloner - This class is used to incrementally clone and merge
|
||||
/// nodes from a non-changing source graph into a potentially mutating
|
||||
/// destination graph. Nodes are only cloned over on demand, either in
|
||||
/// responds to a merge() or getClonedNH() call. When a node is cloned over,
|
||||
/// all of the nodes reachable from it are automatically brought over as well.
|
||||
class ReachabilityCloner {
|
||||
DSGraph &Dest;
|
||||
const DSGraph &Src;
|
||||
/// ReachabilityCloner - This class is used to incrementally clone and merge
|
||||
/// nodes from a non-changing source graph into a potentially mutating
|
||||
/// destination graph. Nodes are only cloned over on demand, either in
|
||||
/// responds to a merge() or getClonedNH() call. When a node is cloned over,
|
||||
/// all of the nodes reachable from it are automatically brought over as well.
|
||||
///
|
||||
class ReachabilityCloner {
|
||||
DSGraph &Dest;
|
||||
const DSGraph &Src;
|
||||
|
||||
/// BitsToKeep - These bits are retained from the source node when the
|
||||
/// source nodes are merged into the destination graph.
|
||||
unsigned BitsToKeep;
|
||||
unsigned CloneFlags;
|
||||
/// BitsToKeep - These bits are retained from the source node when the
|
||||
/// source nodes are merged into the destination graph.
|
||||
unsigned BitsToKeep;
|
||||
unsigned CloneFlags;
|
||||
|
||||
// NodeMap - A mapping from nodes in the source graph to the nodes that
|
||||
// represent them in the destination graph.
|
||||
DSGraph::NodeMapTy NodeMap;
|
||||
public:
|
||||
ReachabilityCloner(DSGraph &dest, const DSGraph &src, unsigned cloneFlags)
|
||||
: Dest(dest), Src(src), CloneFlags(cloneFlags) {
|
||||
assert(&Dest != &Src && "Cannot clone from graph to same graph!");
|
||||
BitsToKeep = ~DSNode::DEAD;
|
||||
if (CloneFlags & DSGraph::StripAllocaBit)
|
||||
BitsToKeep &= ~DSNode::AllocaNode;
|
||||
if (CloneFlags & DSGraph::StripModRefBits)
|
||||
BitsToKeep &= ~(DSNode::Modified | DSNode::Read);
|
||||
if (CloneFlags & DSGraph::StripIncompleteBit)
|
||||
BitsToKeep &= ~DSNode::Incomplete;
|
||||
}
|
||||
|
||||
DSNodeHandle getClonedNH(const DSNodeHandle &SrcNH);
|
||||
// NodeMap - A mapping from nodes in the source graph to the nodes that
|
||||
// represent them in the destination graph.
|
||||
DSGraph::NodeMapTy NodeMap;
|
||||
public:
|
||||
ReachabilityCloner(DSGraph &dest, const DSGraph &src, unsigned cloneFlags)
|
||||
: Dest(dest), Src(src), CloneFlags(cloneFlags) {
|
||||
assert(&Dest != &Src && "Cannot clone from graph to same graph!");
|
||||
BitsToKeep = ~DSNode::DEAD;
|
||||
if (CloneFlags & DSGraph::StripAllocaBit)
|
||||
BitsToKeep &= ~DSNode::AllocaNode;
|
||||
if (CloneFlags & DSGraph::StripModRefBits)
|
||||
BitsToKeep &= ~(DSNode::Modified | DSNode::Read);
|
||||
if (CloneFlags & DSGraph::StripIncompleteBit)
|
||||
BitsToKeep &= ~DSNode::Incomplete;
|
||||
}
|
||||
|
||||
DSNodeHandle getClonedNH(const DSNodeHandle &SrcNH);
|
||||
|
||||
void merge(const DSNodeHandle &NH, const DSNodeHandle &SrcNH);
|
||||
void merge(const DSNodeHandle &NH, const DSNodeHandle &SrcNH);
|
||||
|
||||
/// mergeCallSite - Merge the nodes reachable from the specified src call
|
||||
/// site into the nodes reachable from DestCS.
|
||||
void mergeCallSite(const DSCallSite &DestCS, const DSCallSite &SrcCS);
|
||||
/// mergeCallSite - Merge the nodes reachable from the specified src call
|
||||
/// site into the nodes reachable from DestCS.
|
||||
///
|
||||
void mergeCallSite(const DSCallSite &DestCS, const DSCallSite &SrcCS);
|
||||
|
||||
bool clonedAnyNodes() const { return !NodeMap.empty(); }
|
||||
bool clonedAnyNodes() const { return !NodeMap.empty(); }
|
||||
|
||||
/// hasClonedNode - Return true if the specified node has been cloned from
|
||||
/// the source graph into the destination graph.
|
||||
bool hasClonedNode(const DSNode *N) {
|
||||
return NodeMap.count(N);
|
||||
}
|
||||
/// hasClonedNode - Return true if the specified node has been cloned from
|
||||
/// the source graph into the destination graph.
|
||||
bool hasClonedNode(const DSNode *N) {
|
||||
return NodeMap.count(N);
|
||||
}
|
||||
|
||||
void destroy() { NodeMap.clear(); }
|
||||
};
|
||||
|
||||
void destroy() { NodeMap.clear(); }
|
||||
};
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -40,10 +40,12 @@ class DSNode {
|
||||
/// that this node really is. When nodes get folded together, the node to be
|
||||
/// eliminated has these fields filled in, otherwise ForwardNH.getNode() is
|
||||
/// null.
|
||||
///
|
||||
DSNodeHandle ForwardNH;
|
||||
|
||||
/// Next, Prev - These instance variables are used to keep the node on a
|
||||
/// doubly-linked ilist in the DSGraph.
|
||||
///
|
||||
DSNode *Next, *Prev;
|
||||
friend class ilist_traits<DSNode>;
|
||||
|
||||
@ -105,12 +107,14 @@ public:
|
||||
|
||||
/// DSNode ctor - Create a node of the specified type, inserting it into the
|
||||
/// specified graph.
|
||||
///
|
||||
DSNode(const Type *T, DSGraph *G);
|
||||
|
||||
/// DSNode "copy ctor" - Copy the specified node, inserting it into the
|
||||
/// specified graph. If NullLinks is true, then null out all of the links,
|
||||
/// but keep the same number of them. This can be used for efficiency if the
|
||||
/// links are just going to be clobbered anyway.
|
||||
///
|
||||
DSNode(const DSNode &, DSGraph *G, bool NullLinks = false);
|
||||
|
||||
~DSNode() {
|
||||
@ -133,8 +137,10 @@ public:
|
||||
///
|
||||
unsigned getSize() const { return Size; }
|
||||
|
||||
// getType - Return the node type of this object...
|
||||
/// getType - Return the node type of this object...
|
||||
///
|
||||
const Type *getType() const { return Ty; }
|
||||
|
||||
bool isArray() const { return NodeType & Array; }
|
||||
|
||||
/// hasNoReferrers - Return true if nothing is pointing to this node at all.
|
||||
@ -156,6 +162,7 @@ public:
|
||||
|
||||
/// getForwardNode - This method returns the node that this node is forwarded
|
||||
/// to, if any.
|
||||
///
|
||||
DSNode *getForwardNode() const { return ForwardNH.getNode(); }
|
||||
|
||||
/// isForwarding - Return true if this node is forwarding to another.
|
||||
@ -164,9 +171,10 @@ public:
|
||||
|
||||
/// stopForwarding - When the last reference to this forwarding node has been
|
||||
/// dropped, delete the node.
|
||||
///
|
||||
void stopForwarding() {
|
||||
assert(isForwarding() &&
|
||||
"Node isn't forwarding, cannot stopForwarding!");
|
||||
"Node isn't forwarding, cannot stopForwarding()!");
|
||||
ForwardNH.setNode(0);
|
||||
assert(ParentGraph == 0 &&
|
||||
"Forwarding nodes must have been removed from graph!");
|
||||
@ -184,6 +192,7 @@ public:
|
||||
}
|
||||
|
||||
/// getLink - Return the link at the specified offset.
|
||||
///
|
||||
DSNodeHandle &getLink(unsigned Offset) {
|
||||
assert((Offset & ((1 << DS::PointerShift)-1)) == 0 &&
|
||||
"Pointer offset not aligned correctly!");
|
||||
@ -283,6 +292,7 @@ public:
|
||||
|
||||
/// getNodeFlags - Return all of the flags set on the node. If the DEAD flag
|
||||
/// is set, hide it from the caller.
|
||||
///
|
||||
unsigned getNodeFlags() const { return NodeType & ~DEAD; }
|
||||
|
||||
bool isAllocaNode() const { return NodeType & AllocaNode; }
|
||||
@ -331,6 +341,7 @@ public:
|
||||
|
||||
/// remapLinks - Change all of the Links in the current node according to the
|
||||
/// specified mapping.
|
||||
///
|
||||
void remapLinks(hash_map<const DSNode*, DSNodeHandle> &OldNodeMap);
|
||||
|
||||
/// markReachableNodes - This method recursively traverses the specified
|
||||
@ -423,7 +434,7 @@ inline void DSNodeHandle::setLink(unsigned Off, const DSNodeHandle &NH) {
|
||||
getNode()->setLink(Off+Offset, NH);
|
||||
}
|
||||
|
||||
/// addEdgeTo - Add an edge from the current node to the specified node. This
|
||||
/// addEdgeTo - Add an edge from the current node to the specified node. This
|
||||
/// can cause merging of nodes in the graph.
|
||||
///
|
||||
inline void DSNodeHandle::addEdgeTo(unsigned Off, const DSNodeHandle &Node) {
|
||||
|
@ -35,9 +35,9 @@ namespace DS { // FIXME: After the paper, this should get cleaned up
|
||||
PointerSize = 1 << PointerShift
|
||||
};
|
||||
|
||||
// isPointerType - Return true if this first class type is big enough to hold
|
||||
// a pointer.
|
||||
//
|
||||
/// isPointerType - Return true if this first class type is big enough to hold
|
||||
/// a pointer.
|
||||
///
|
||||
bool isPointerType(const Type *Ty);
|
||||
};
|
||||
|
||||
@ -89,6 +89,7 @@ public:
|
||||
|
||||
/// isNull - Check to see if getNode() == 0, without going through the trouble
|
||||
/// of checking to see if we are forwarding...
|
||||
///
|
||||
bool isNull() const { return N == 0; }
|
||||
|
||||
// Allow explicit conversion to DSNode...
|
||||
@ -112,7 +113,8 @@ public:
|
||||
///
|
||||
void mergeWith(const DSNodeHandle &N) const;
|
||||
|
||||
// hasLink - Return true if there is a link at the specified offset...
|
||||
/// hasLink - Return true if there is a link at the specified offset...
|
||||
///
|
||||
inline bool hasLink(unsigned Num) const;
|
||||
|
||||
/// getLink - Treat this current node pointer as a pointer to a structure of
|
||||
@ -262,8 +264,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// mergeWith - Merge the return value and parameters of the these two call
|
||||
// sites.
|
||||
/// mergeWith - Merge the return value and parameters of the these two call
|
||||
/// sites.
|
||||
///
|
||||
void mergeWith(DSCallSite &CS) {
|
||||
getRetVal().mergeWith(CS.getRetVal());
|
||||
unsigned MinArgs = getNumPtrArgs();
|
||||
|
@ -27,9 +27,9 @@ class DSNode;
|
||||
|
||||
// FIXME: move this stuff to a private header
|
||||
namespace DataStructureAnalysis {
|
||||
// isPointerType - Return true if this first class type is big enough to hold
|
||||
// a pointer.
|
||||
//
|
||||
/// isPointerType - Return true if this first class type is big enough to hold
|
||||
/// a pointer.
|
||||
///
|
||||
bool isPointerType(const Type *Ty);
|
||||
}
|
||||
|
||||
@ -53,7 +53,8 @@ public:
|
||||
return DSInfo.find(const_cast<Function*>(&F)) != DSInfo.end();
|
||||
}
|
||||
|
||||
// getDSGraph - Return the data structure graph for the specified function.
|
||||
/// getDSGraph - Return the data structure graph for the specified function.
|
||||
///
|
||||
DSGraph &getDSGraph(const Function &F) const {
|
||||
hash_map<Function*, DSGraph*>::const_iterator I =
|
||||
DSInfo.find(const_cast<Function*>(&F));
|
||||
@ -63,13 +64,17 @@ public:
|
||||
|
||||
DSGraph &getGlobalsGraph() const { return *GlobalsGraph; }
|
||||
|
||||
// print - Print out the analysis results...
|
||||
/// print - Print out the analysis results...
|
||||
///
|
||||
void print(std::ostream &O, const Module *M) const;
|
||||
|
||||
// If the pass pipeline is done with this pass, we can release our memory...
|
||||
/// releaseMemory - if the pass pipeline is done with this pass, we can
|
||||
/// release our memory...
|
||||
///
|
||||
virtual void releaseMemory();
|
||||
|
||||
// getAnalysisUsage - This obviously provides a data structure graph.
|
||||
/// getAnalysisUsage - This obviously provides a data structure graph.
|
||||
///
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
AU.addRequired<TargetData>();
|
||||
@ -77,10 +82,10 @@ public:
|
||||
};
|
||||
|
||||
|
||||
// BUDataStructures - The analysis that computes the interprocedurally closed
|
||||
// data structure graphs for all of the functions in the program. This pass
|
||||
// only performs a "Bottom Up" propagation (hence the name).
|
||||
//
|
||||
/// BUDataStructures - The analysis that computes the interprocedurally closed
|
||||
/// data structure graphs for all of the functions in the program. This pass
|
||||
/// only performs a "Bottom Up" propagation (hence the name).
|
||||
///
|
||||
class BUDataStructures : public Pass {
|
||||
protected:
|
||||
// DSInfo, one graph for each function
|
||||
@ -96,7 +101,8 @@ public:
|
||||
return DSInfo.find(const_cast<Function*>(&F)) != DSInfo.end();
|
||||
}
|
||||
|
||||
// getDSGraph - Return the data structure graph for the specified function.
|
||||
/// getDSGraph - Return the data structure graph for the specified function.
|
||||
///
|
||||
DSGraph &getDSGraph(const Function &F) const {
|
||||
hash_map<Function*, DSGraph*>::const_iterator I =
|
||||
DSInfo.find(const_cast<Function*>(&F));
|
||||
@ -106,10 +112,13 @@ public:
|
||||
|
||||
DSGraph &getGlobalsGraph() const { return *GlobalsGraph; }
|
||||
|
||||
// print - Print out the analysis results...
|
||||
/// print - Print out the analysis results...
|
||||
///
|
||||
void print(std::ostream &O, const Module *M) const;
|
||||
|
||||
// If the pass pipeline is done with this pass, we can release our memory...
|
||||
/// releaseMemory - if the pass pipeline is done with this pass, we can
|
||||
/// release our memory...
|
||||
///
|
||||
virtual void releaseMemory();
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
@ -136,10 +145,10 @@ private:
|
||||
};
|
||||
|
||||
|
||||
// TDDataStructures - Analysis that computes new data structure graphs
|
||||
// for each function using the closed graphs for the callers computed
|
||||
// by the bottom-up pass.
|
||||
//
|
||||
/// TDDataStructures - Analysis that computes new data structure graphs
|
||||
/// for each function using the closed graphs for the callers computed
|
||||
/// by the bottom-up pass.
|
||||
///
|
||||
class TDDataStructures : public Pass {
|
||||
// DSInfo, one graph for each function
|
||||
hash_map<Function*, DSGraph*> DSInfo;
|
||||
@ -154,7 +163,8 @@ public:
|
||||
return DSInfo.find(const_cast<Function*>(&F)) != DSInfo.end();
|
||||
}
|
||||
|
||||
// getDSGraph - Return the data structure graph for the specified function.
|
||||
/// getDSGraph - Return the data structure graph for the specified function.
|
||||
///
|
||||
DSGraph &getDSGraph(const Function &F) const {
|
||||
hash_map<Function*, DSGraph*>::const_iterator I =
|
||||
DSInfo.find(const_cast<Function*>(&F));
|
||||
@ -164,13 +174,16 @@ public:
|
||||
|
||||
DSGraph &getGlobalsGraph() const { return *GlobalsGraph; }
|
||||
|
||||
// print - Print out the analysis results...
|
||||
/// print - Print out the analysis results...
|
||||
///
|
||||
void print(std::ostream &O, const Module *M) const;
|
||||
|
||||
// If the pass pipeline is done with this pass, we can release our memory...
|
||||
/// If the pass pipeline is done with this pass, we can release our memory...
|
||||
///
|
||||
virtual void releaseMyMemory();
|
||||
|
||||
// getAnalysisUsage - This obviously provides a data structure graph.
|
||||
/// getAnalysisUsage - This obviously provides a data structure graph.
|
||||
///
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
AU.addRequired<BUDataStructures>();
|
||||
@ -188,11 +201,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
// CompleteBUDataStructures - This is the exact same as the bottom-up graphs,
|
||||
// but we use take a completed call graph and inline all indirect callees into
|
||||
// their callers graphs, making the result more useful for things like pool
|
||||
// allocation.
|
||||
//
|
||||
/// CompleteBUDataStructures - This is the exact same as the bottom-up graphs,
|
||||
/// but we use take a completed call graph and inline all indirect callees into
|
||||
/// their callers graphs, making the result more useful for things like pool
|
||||
/// allocation.
|
||||
///
|
||||
struct CompleteBUDataStructures : public BUDataStructures {
|
||||
virtual bool run(Module &M);
|
||||
|
||||
@ -200,7 +213,8 @@ struct CompleteBUDataStructures : public BUDataStructures {
|
||||
return DSInfo.find(const_cast<Function*>(&F)) != DSInfo.end();
|
||||
}
|
||||
|
||||
// getDSGraph - Return the data structure graph for the specified function.
|
||||
/// getDSGraph - Return the data structure graph for the specified function.
|
||||
///
|
||||
DSGraph &getDSGraph(const Function &F) const {
|
||||
hash_map<Function*, DSGraph*>::const_iterator I =
|
||||
DSInfo.find(const_cast<Function*>(&F));
|
||||
@ -217,7 +231,8 @@ struct CompleteBUDataStructures : public BUDataStructures {
|
||||
AU.addRequired<TDDataStructures>();
|
||||
}
|
||||
|
||||
// print - Print out the analysis results...
|
||||
/// print - Print out the analysis results...
|
||||
///
|
||||
void print(std::ostream &O, const Module *M) const;
|
||||
|
||||
private:
|
||||
@ -228,8 +243,6 @@ private:
|
||||
void processGraph(DSGraph &G);
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user