summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-07-07 06:12:52 +0000
committerChris Lattner <sabre@nondot.org>2004-07-07 06:12:52 +0000
commitefffdc9408344c6c109ced7984e056c02fe37dc8 (patch)
tree014646ed9df80e2a666f36331cc711a826e2c52d /include
parentd34086796485ffcba4789ddda4277afca3d4f6b9 (diff)
downloadexternal_llvm-efffdc9408344c6c109ced7984e056c02fe37dc8.zip
external_llvm-efffdc9408344c6c109ced7984e056c02fe37dc8.tar.gz
external_llvm-efffdc9408344c6c109ced7984e056c02fe37dc8.tar.bz2
As much as I hate to say it, the whole setNode interface for DSNodeHandles
is HOPELESSLY broken. The problem is that the embedded getNode call can change the offset of the node handle in unpredictable ways. As it turns out, all of the clients of this method really want to set both the node and the offset, thus it is more efficient (and less buggy) to just do both of them in one method call. This fixes some obscure bugs handling non-forwarded node handles. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14660 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/DSNode.h11
-rw-r--r--include/llvm/Analysis/DSSupport.h24
-rw-r--r--include/llvm/Analysis/DataStructure/DSNode.h11
-rw-r--r--include/llvm/Analysis/DataStructure/DSSupport.h24
4 files changed, 36 insertions, 34 deletions
diff --git a/include/llvm/Analysis/DSNode.h b/include/llvm/Analysis/DSNode.h
index f1bb90e..4c6480d 100644
--- a/include/llvm/Analysis/DSNode.h
+++ b/include/llvm/Analysis/DSNode.h
@@ -175,7 +175,7 @@ public:
void stopForwarding() {
assert(isForwarding() &&
"Node isn't forwarding, cannot stopForwarding()!");
- ForwardNH.setNode(0);
+ ForwardNH.setTo(0, 0);
assert(ParentGraph == 0 &&
"Forwarding nodes must have been removed from graph!");
delete this;
@@ -336,7 +336,7 @@ public:
void dropAllReferences() {
Links.clear();
if (isForwarding())
- ForwardNH.setNode(0);
+ ForwardNH.setTo(0, 0);
}
/// remapLinks - Change all of the Links in the current node according to the
@@ -401,10 +401,11 @@ inline DSNode *DSNodeHandle::getNode() const {
return HandleForwarding();
}
-inline void DSNodeHandle::setNode(DSNode *n) const {
+inline void DSNodeHandle::setTo(DSNode *n, unsigned NewOffset) const {
assert(!n || !n->isForwarding() && "Cannot set node to a forwarded node!");
if (N) getNode()->NumReferrers--;
N = n;
+ Offset = NewOffset;
if (N) {
N->NumReferrers++;
if (Offset >= N->Size) {
@@ -457,8 +458,8 @@ inline void DSNodeHandle::mergeWith(const DSNodeHandle &Node) const {
getNode()->mergeWith(Node, Offset);
else { // No node to merge with, so just point to Node
Offset = 0;
- setNode(Node.getNode());
- Offset = Node.getOffset();
+ DSNode *NN = Node.getNode();
+ setTo(NN, Node.getOffset());
}
}
diff --git a/include/llvm/Analysis/DSSupport.h b/include/llvm/Analysis/DSSupport.h
index fdbb432..8cce6c9 100644
--- a/include/llvm/Analysis/DSSupport.h
+++ b/include/llvm/Analysis/DSSupport.h
@@ -58,17 +58,18 @@ class DSNodeHandle {
void operator==(const DSNode *N); // DISALLOW, use to promote N to nodehandle
public:
// Allow construction, destruction, and assignment...
- DSNodeHandle(DSNode *n = 0, unsigned offs = 0) : N(0), Offset(offs) {
- setNode(n);
+ DSNodeHandle(DSNode *n = 0, unsigned offs = 0) : N(0), Offset(0) {
+ setTo(n, offs);
}
DSNodeHandle(const DSNodeHandle &H) : N(0), Offset(0) {
- setNode(H.getNode());
- Offset = H.Offset; // Must read offset AFTER the getNode()
+ DSNode *NN = H.getNode();
+ setTo(NN, H.Offset); // Must read offset AFTER the getNode()
}
- ~DSNodeHandle() { setNode((DSNode*)0); }
+ ~DSNodeHandle() { setTo(0, 0); }
DSNodeHandle &operator=(const DSNodeHandle &H) {
if (&H == this) return *this; // Don't set offset to 0 if self assigning.
- Offset = 0; setNode(H.getNode()); Offset = H.Offset;
+ DSNode *NN = H.getNode(); // Call getNode() before .Offset
+ setTo(NN, H.Offset);
return *this;
}
@@ -96,7 +97,6 @@ public:
inline DSNode *getNode() const; // Defined inline in DSNode.h
unsigned getOffset() const { return Offset; }
- inline void setNode(DSNode *N) const; // Defined inline in DSNode.h
void setOffset(unsigned O) {
//assert((!N || Offset < N->Size || (N->Size == 0 && Offset == 0) ||
// !N->ForwardNH.isNull()) && "Node handle offset out of range!");
@@ -105,6 +105,8 @@ public:
Offset = O;
}
+ inline void setTo(DSNode *N, unsigned O) const; // Defined inline in DSNode.h
+
void addEdgeTo(unsigned LinkNo, const DSNodeHandle &N);
void addEdgeTo(const DSNodeHandle &N) { addEdgeTo(0, N); }
@@ -154,9 +156,7 @@ class DSCallSite {
if (DSNode *N = Src.getNode()) {
hash_map<const DSNode*, DSNode*>::const_iterator I = NodeMap.find(N);
assert(I != NodeMap.end() && "Node not in mapping!");
-
- NH.setOffset(Src.getOffset());
- NH.setNode(I->second);
+ NH.setTo(I->second, Src.getOffset());
}
}
@@ -166,8 +166,8 @@ class DSCallSite {
hash_map<const DSNode*, DSNodeHandle>::const_iterator I = NodeMap.find(N);
assert(I != NodeMap.end() && "Node not in mapping!");
- NH.setOffset(Src.getOffset()+I->second.getOffset());
- NH.setNode(I->second.getNode());
+ DSNode *NN = I->second.getNode(); // Call getNode before getOffset()
+ NH.setTo(NN, Src.getOffset()+I->second.getOffset());
}
}
diff --git a/include/llvm/Analysis/DataStructure/DSNode.h b/include/llvm/Analysis/DataStructure/DSNode.h
index f1bb90e..4c6480d 100644
--- a/include/llvm/Analysis/DataStructure/DSNode.h
+++ b/include/llvm/Analysis/DataStructure/DSNode.h
@@ -175,7 +175,7 @@ public:
void stopForwarding() {
assert(isForwarding() &&
"Node isn't forwarding, cannot stopForwarding()!");
- ForwardNH.setNode(0);
+ ForwardNH.setTo(0, 0);
assert(ParentGraph == 0 &&
"Forwarding nodes must have been removed from graph!");
delete this;
@@ -336,7 +336,7 @@ public:
void dropAllReferences() {
Links.clear();
if (isForwarding())
- ForwardNH.setNode(0);
+ ForwardNH.setTo(0, 0);
}
/// remapLinks - Change all of the Links in the current node according to the
@@ -401,10 +401,11 @@ inline DSNode *DSNodeHandle::getNode() const {
return HandleForwarding();
}
-inline void DSNodeHandle::setNode(DSNode *n) const {
+inline void DSNodeHandle::setTo(DSNode *n, unsigned NewOffset) const {
assert(!n || !n->isForwarding() && "Cannot set node to a forwarded node!");
if (N) getNode()->NumReferrers--;
N = n;
+ Offset = NewOffset;
if (N) {
N->NumReferrers++;
if (Offset >= N->Size) {
@@ -457,8 +458,8 @@ inline void DSNodeHandle::mergeWith(const DSNodeHandle &Node) const {
getNode()->mergeWith(Node, Offset);
else { // No node to merge with, so just point to Node
Offset = 0;
- setNode(Node.getNode());
- Offset = Node.getOffset();
+ DSNode *NN = Node.getNode();
+ setTo(NN, Node.getOffset());
}
}
diff --git a/include/llvm/Analysis/DataStructure/DSSupport.h b/include/llvm/Analysis/DataStructure/DSSupport.h
index fdbb432..8cce6c9 100644
--- a/include/llvm/Analysis/DataStructure/DSSupport.h
+++ b/include/llvm/Analysis/DataStructure/DSSupport.h
@@ -58,17 +58,18 @@ class DSNodeHandle {
void operator==(const DSNode *N); // DISALLOW, use to promote N to nodehandle
public:
// Allow construction, destruction, and assignment...
- DSNodeHandle(DSNode *n = 0, unsigned offs = 0) : N(0), Offset(offs) {
- setNode(n);
+ DSNodeHandle(DSNode *n = 0, unsigned offs = 0) : N(0), Offset(0) {
+ setTo(n, offs);
}
DSNodeHandle(const DSNodeHandle &H) : N(0), Offset(0) {
- setNode(H.getNode());
- Offset = H.Offset; // Must read offset AFTER the getNode()
+ DSNode *NN = H.getNode();
+ setTo(NN, H.Offset); // Must read offset AFTER the getNode()
}
- ~DSNodeHandle() { setNode((DSNode*)0); }
+ ~DSNodeHandle() { setTo(0, 0); }
DSNodeHandle &operator=(const DSNodeHandle &H) {
if (&H == this) return *this; // Don't set offset to 0 if self assigning.
- Offset = 0; setNode(H.getNode()); Offset = H.Offset;
+ DSNode *NN = H.getNode(); // Call getNode() before .Offset
+ setTo(NN, H.Offset);
return *this;
}
@@ -96,7 +97,6 @@ public:
inline DSNode *getNode() const; // Defined inline in DSNode.h
unsigned getOffset() const { return Offset; }
- inline void setNode(DSNode *N) const; // Defined inline in DSNode.h
void setOffset(unsigned O) {
//assert((!N || Offset < N->Size || (N->Size == 0 && Offset == 0) ||
// !N->ForwardNH.isNull()) && "Node handle offset out of range!");
@@ -105,6 +105,8 @@ public:
Offset = O;
}
+ inline void setTo(DSNode *N, unsigned O) const; // Defined inline in DSNode.h
+
void addEdgeTo(unsigned LinkNo, const DSNodeHandle &N);
void addEdgeTo(const DSNodeHandle &N) { addEdgeTo(0, N); }
@@ -154,9 +156,7 @@ class DSCallSite {
if (DSNode *N = Src.getNode()) {
hash_map<const DSNode*, DSNode*>::const_iterator I = NodeMap.find(N);
assert(I != NodeMap.end() && "Node not in mapping!");
-
- NH.setOffset(Src.getOffset());
- NH.setNode(I->second);
+ NH.setTo(I->second, Src.getOffset());
}
}
@@ -166,8 +166,8 @@ class DSCallSite {
hash_map<const DSNode*, DSNodeHandle>::const_iterator I = NodeMap.find(N);
assert(I != NodeMap.end() && "Node not in mapping!");
- NH.setOffset(Src.getOffset()+I->second.getOffset());
- NH.setNode(I->second.getNode());
+ DSNode *NN = I->second.getNode(); // Call getNode before getOffset()
+ NH.setTo(NN, Src.getOffset()+I->second.getOffset());
}
}