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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187106 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp
index 2a06e25..d171fc6 100644
--- a/lib/IR/DebugInfo.cpp
+++ b/lib/IR/DebugInfo.cpp
@@ -406,6 +406,16 @@
   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 @@
 
 /// 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 @@
   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 @@
   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 @@
 
   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 @@
   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;
 }