* Implement DSNode::removeAllIncomingEdges
* Implement Critical Shadow node handling
* Implement routines to determine whether an allocation node is a malloc
  or alloca


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2003 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/NodeImpl.cpp b/lib/Analysis/DataStructure/NodeImpl.cpp
index 30bc9d2..967c67e 100644
--- a/lib/Analysis/DataStructure/NodeImpl.cpp
+++ b/lib/Analysis/DataStructure/NodeImpl.cpp
@@ -65,6 +65,13 @@
 }
 
 
+// removeAllIncomingEdges - Erase all edges in the graph that point to this node
+void DSNode::removeAllIncomingEdges() {
+  while (!Referrers.empty())
+    Referrers.back()->removePointerTo(this);
+}
+
+
 static void replaceIn(std::string &S, char From, const std::string &To) {
   for (unsigned i = 0; i < S.size(); )
     if (S[i] == From) {
@@ -145,12 +152,14 @@
   : DSNode(NewNode, V->getType()->getElementType()), Allocation(V) {
 }
 
+bool NewDSNode::isAllocaNode() const {
+  return isa<AllocaInst>(Allocation);
+}
+
+
 string NewDSNode::getCaption() const {
   stringstream OS;
-  if (isa<MallocInst>(Allocation))
-    OS << "new ";
-  else
-    OS << "alloca ";
+  OS << (isMallocNode() ? "new " : "alloca ");
 
   WriteTypeSymbolic(OS, getType(),
                     Allocation->getParent()->getParent()->getParent());
@@ -170,11 +179,12 @@
 }
 
 
-ShadowDSNode::ShadowDSNode(DSNode *P, Module *M)
+ShadowDSNode::ShadowDSNode(DSNode *P, Module *M, bool C = false)
   : DSNode(ShadowNode, cast<PointerType>(P->getType())->getElementType()) {
   Parent = P;
   Mod = M;
   ShadowParent = 0;
+  CriticalNode = C;
 }
 
 ShadowDSNode::ShadowDSNode(const Type *Ty, Module *M, ShadowDSNode *ShadParent)
@@ -182,12 +192,16 @@
   Parent = 0;
   Mod = M;
   ShadowParent = ShadParent;
+  CriticalNode = false;
 }
 
 std::string ShadowDSNode::getCaption() const {
   stringstream OS;
+  if (CriticalNode) OS << "# ";
+  OS << "shadow ";
   WriteTypeSymbolic(OS, getType(), Mod);
-  return "shadow " + OS.str();
+  if (CriticalNode) OS << " #";
+  return OS.str();
 }
 
 void ShadowDSNode::mapNode(map<const DSNode*, DSNode*> &NodeMap,