summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorManman Ren <manman.ren@gmail.com>2013-07-25 06:43:01 +0000
committerManman Ren <manman.ren@gmail.com>2013-07-25 06:43:01 +0000
commite1fb94306decd4dfffeb3d03f0273971fded0ef3 (patch)
tree4aba9097f6bff2b68ea4e3db8437e1cb230c145f /llvm/lib/IR
parentdba64f1affd0c04d9cce9a93330acc7f4c8f84ce (diff)
downloadbcm5719-llvm-e1fb94306decd4dfffeb3d03f0273971fded0ef3.tar.gz
bcm5719-llvm-e1fb94306decd4dfffeb3d03f0273971fded0ef3.zip
Debug Info: improve the verifier to check field types.
Make sure the context and type fields are MDNodes. We will generate verification errors if those fields are non-empty strings. Fix testing cases to make them pass the verifier. llvm-svn: 187106
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/DebugInfo.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index 2a06e25b871..d171fc6c5b3 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -406,6 +406,16 @@ bool DIObjCProperty::Verify() const {
return DbgNode->getNumOperands() == 8;
}
+/// We allow an empty string to represent null. But we don't allow
+/// a non-empty string in a MDNode field.
+static bool fieldIsMDNode(const MDNode *DbgNode, unsigned Elt) {
+ Value *Fld = getField(DbgNode, Elt);
+ if (Fld && isa<MDString>(Fld) &&
+ !cast<MDString>(Fld)->getString().empty())
+ return false;
+ return true;
+}
+
/// Verify - Verify that a type descriptor is well formed.
bool DIType::Verify() const {
if (!isType())
@@ -443,6 +453,14 @@ bool DIBasicType::Verify() const {
/// Verify - Verify that a derived type descriptor is well formed.
bool DIDerivedType::Verify() const {
+ // Make sure DerivedFrom @ field 9 is MDNode.
+ if (!fieldIsMDNode(DbgNode, 9))
+ return false;
+ if (getTag() == dwarf::DW_TAG_ptr_to_member_type)
+ // Make sure ClassType @ field 10 is MDNode.
+ if (!fieldIsMDNode(DbgNode, 10))
+ return false;
+
return isDerivedType() && DbgNode->getNumOperands() >= 10 &&
DbgNode->getNumOperands() <= 14;
}
@@ -452,6 +470,12 @@ bool DICompositeType::Verify() const {
if (!isCompositeType())
return false;
+ // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are MDNodes.
+ if (!fieldIsMDNode(DbgNode, 9))
+ return false;
+ if (!fieldIsMDNode(DbgNode, 12))
+ return false;
+
return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14;
}
@@ -460,6 +484,14 @@ bool DISubprogram::Verify() const {
if (!isSubprogram())
return false;
+ // Make sure context @ field 2 and type @ field 7 are MDNodes.
+ if (!fieldIsMDNode(DbgNode, 2))
+ return false;
+ if (!fieldIsMDNode(DbgNode, 7))
+ return false;
+ // Containing type @ field 12.
+ if (!fieldIsMDNode(DbgNode, 12))
+ return false;
return DbgNode->getNumOperands() == 20;
}
@@ -470,6 +502,14 @@ bool DIGlobalVariable::Verify() const {
if (getDisplayName().empty())
return false;
+ // Make sure context @ field 2 and type @ field 8 are MDNodes.
+ if (!fieldIsMDNode(DbgNode, 2))
+ return false;
+ if (!fieldIsMDNode(DbgNode, 8))
+ return false;
+ // Make sure StaticDataMemberDeclaration @ field 12 is MDNode.
+ if (!fieldIsMDNode(DbgNode, 12))
+ return false;
return DbgNode->getNumOperands() == 13;
}
@@ -479,6 +519,11 @@ bool DIVariable::Verify() const {
if (!isVariable())
return false;
+ // Make sure context @ field 1 and type @ field 5 are MDNodes.
+ if (!fieldIsMDNode(DbgNode, 1))
+ return false;
+ if (!fieldIsMDNode(DbgNode, 5))
+ return false;
return DbgNode->getNumOperands() >= 8;
}
OpenPOWER on IntegriCloud