Implement the "unknown flag" which mainly consists of aligning printing code
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4490 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Analysis/DSNode.h b/include/llvm/Analysis/DSNode.h
index 0d5a0df..74fd5af 100644
--- a/include/llvm/Analysis/DSNode.h
+++ b/include/llvm/Analysis/DSNode.h
@@ -61,13 +61,14 @@
void operator=(const DSNode &); // DO NOT IMPLEMENT
public:
enum NodeTy {
- ShadowNode = 0, // Nothing is known about this node...
- AllocaNode = 1 << 0, // This node was allocated with alloca
- NewNode = 1 << 1, // This node was allocated with malloc
- GlobalNode = 1 << 2, // This node was allocated by a global var decl
- Incomplete = 1 << 3, // This node may not be complete
- Modified = 1 << 4, // This node is modified in this context
- Read = 1 << 5, // This node is read in this context
+ ShadowNode = 0, // Nothing is known about this node...
+ AllocaNode = 1 << 0, // This node was allocated with alloca
+ NewNode = 1 << 1, // This node was allocated with malloc
+ GlobalNode = 1 << 2, // This node was allocated by a global var decl
+ UnknownNode = 1 << 3, // This node points to unknown allocated memory
+ Incomplete = 1 << 4, // This node may not be complete
+ Modified = 1 << 5, // This node is modified in this context
+ Read = 1 << 6, // This node is read in this context
};
/// NodeType - A union of the above bits. "Shadow" nodes do not add any flags
diff --git a/include/llvm/Analysis/DataStructure/DSNode.h b/include/llvm/Analysis/DataStructure/DSNode.h
index 0d5a0df..74fd5af 100644
--- a/include/llvm/Analysis/DataStructure/DSNode.h
+++ b/include/llvm/Analysis/DataStructure/DSNode.h
@@ -61,13 +61,14 @@
void operator=(const DSNode &); // DO NOT IMPLEMENT
public:
enum NodeTy {
- ShadowNode = 0, // Nothing is known about this node...
- AllocaNode = 1 << 0, // This node was allocated with alloca
- NewNode = 1 << 1, // This node was allocated with malloc
- GlobalNode = 1 << 2, // This node was allocated by a global var decl
- Incomplete = 1 << 3, // This node may not be complete
- Modified = 1 << 4, // This node is modified in this context
- Read = 1 << 5, // This node is read in this context
+ ShadowNode = 0, // Nothing is known about this node...
+ AllocaNode = 1 << 0, // This node was allocated with alloca
+ NewNode = 1 << 1, // This node was allocated with malloc
+ GlobalNode = 1 << 2, // This node was allocated by a global var decl
+ UnknownNode = 1 << 3, // This node points to unknown allocated memory
+ Incomplete = 1 << 4, // This node may not be complete
+ Modified = 1 << 5, // This node is modified in this context
+ Read = 1 << 6, // This node is read in this context
};
/// NodeType - A union of the above bits. "Shadow" nodes do not add any flags
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index 456eb2f..0d6046d 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -369,12 +369,17 @@
/// Handle casts...
void GraphBuilder::visitCastInst(CastInst &CI) {
- if (isPointerType(CI.getType())) {
- if (isPointerType(CI.getOperand(0)->getType()))
+ if (isPointerType(CI.getType()))
+ if (isPointerType(CI.getOperand(0)->getType())) {
+ // Cast one pointer to the other, just act like a copy instruction
setDestTo(CI, getValueDest(*CI.getOperand(0)));
- else
- ; // FIXME: "Other" node
- }
+ } else {
+ // Cast something (floating point, small integer) to a pointer. We need
+ // to track the fact that the node points to SOMETHING, just something we
+ // don't know about. Make an "Unknown" node.
+ //
+ setDestTo(CI, createNode(DSNode::UnknownNode));
+ }
}
diff --git a/lib/Analysis/DataStructure/Printer.cpp b/lib/Analysis/DataStructure/Printer.cpp
index fd6006c..26424be 100644
--- a/lib/Analysis/DataStructure/Printer.cpp
+++ b/lib/Analysis/DataStructure/Printer.cpp
@@ -36,12 +36,13 @@
OS << "\n";
}
- if (N->NodeType & DSNode::AllocaNode) OS << "A";
- if (N->NodeType & DSNode::NewNode ) OS << "N";
- if (N->NodeType & DSNode::GlobalNode) OS << "G";
- if (N->NodeType & DSNode::Incomplete) OS << "I";
- if (N->NodeType & DSNode::Modified ) OS << "M";
- if (N->NodeType & DSNode::Read ) OS << "R";
+ if (N->NodeType & DSNode::AllocaNode ) OS << "A";
+ if (N->NodeType & DSNode::NewNode ) OS << "N";
+ if (N->NodeType & DSNode::GlobalNode ) OS << "G";
+ if (N->NodeType & DSNode::UnknownNode) OS << "U";
+ if (N->NodeType & DSNode::Incomplete ) OS << "I";
+ if (N->NodeType & DSNode::Modified ) OS << "M";
+ if (N->NodeType & DSNode::Read ) OS << "R";
for (unsigned i = 0, e = N->getGlobals().size(); i != e; ++i) {
WriteAsOperand(OS, N->getGlobals()[i], false, true, M);