diff options
author | Chris Lattner <sabre@nondot.org> | 2002-04-17 03:24:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-04-17 03:24:47 +0000 |
commit | 116dfdd6e190cf525aa6b25bf4d3717cadd45f7c (patch) | |
tree | 3b340d700bd9424e748588a313607b264e38102c | |
parent | cf73caa5e8c9acfcda03ce31b722abef797fb45c (diff) | |
download | bcm5719-llvm-116dfdd6e190cf525aa6b25bf4d3717cadd45f7c.tar.gz bcm5719-llvm-116dfdd6e190cf525aa6b25bf4d3717cadd45f7c.zip |
Make data structure acurately get ALL edges, even loads of null fields of
nodes that are not shadow nodes
llvm-svn: 2273
-rw-r--r-- | llvm/include/llvm/Analysis/DataStructure.h | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/llvm/include/llvm/Analysis/DataStructure.h b/llvm/include/llvm/Analysis/DataStructure.h index e619f6b3603..0474da11d1f 100644 --- a/llvm/include/llvm/Analysis/DataStructure.h +++ b/llvm/include/llvm/Analysis/DataStructure.h @@ -20,6 +20,7 @@ class GlobalValue; class FunctionDSGraph; class DataStructure; class DSNodeIterator; +class ShadowDSNode; // FIXME: move this somewhere private unsigned countPointerFields(const Type *Ty); @@ -113,6 +114,8 @@ class DSNode { std::vector<PointerValSet> FieldLinks; std::vector<Value*> Pointers; // Values pointing to me... std::vector<PointerValSet*> Referrers; + + std::vector<std::pair<const Type *, ShadowDSNode *> > SynthNodes; DSNode(const DSNode &); // DO NOT IMPLEMENT void operator=(const DSNode &); // DO NOT IMPLEMENT @@ -186,6 +189,10 @@ public: return New; } + // synthesizeNode - Create a new shadow node that is to be linked into this + // chain.. + // + ShadowDSNode *synthesizeNode(const Type *Ty, FunctionRepBuilder *Rep); virtual void dropAllReferences() { FieldLinks.clear(); @@ -320,30 +327,25 @@ private: // class ShadowDSNode : public DSNode { friend class FunctionDSGraph; + friend class FunctionRepBuilder; Module *Mod; - ShadowDSNode *ShadowParent; // Nonnull if this is a synthesized node... - std::vector<std::pair<const Type *, ShadowDSNode *> > SynthNodes; + DSNode *ShadowParent; // Nonnull if this is a synthesized node... public: ShadowDSNode(const Type *Ty, Module *M); virtual std::string getCaption() const; - // synthesizeNode - Create a new shadow node that is to be linked into this - // chain.. - // - ShadowDSNode *synthesizeNode(const Type *Ty, FunctionRepBuilder *Rep); - // isEquivalentTo - Return true if the nodes should be merged... virtual bool isEquivalentTo(DSNode *Node) const; + DSNode *getShadowParent() const { return ShadowParent; } + // Support type inquiry through isa, cast, and dyn_cast... static bool classof(const ShadowDSNode *) { return true; } static bool classof(const DSNode *N) { return N->NodeType == ShadowNode; } private: - ShadowDSNode(const Type *Ty, Module *M, ShadowDSNode *ShadParent); + ShadowDSNode(const Type *Ty, Module *M, DSNode *ShadParent); protected: - virtual void mapNode(std::map<const DSNode*, DSNode*> &NodeMap, - const DSNode *Old); virtual ShadowDSNode *cloneImpl() const { if (ShadowParent) return new ShadowDSNode(getType(), Mod, ShadowParent); |