diff options
| author | Manman Ren <manman.ren@gmail.com> | 2013-07-25 06:43:01 +0000 |
|---|---|---|
| committer | Manman Ren <manman.ren@gmail.com> | 2013-07-25 06:43:01 +0000 |
| commit | e1fb94306decd4dfffeb3d03f0273971fded0ef3 (patch) | |
| tree | 4aba9097f6bff2b68ea4e3db8437e1cb230c145f /llvm/lib | |
| parent | dba64f1affd0c04d9cce9a93330acc7f4c8f84ce (diff) | |
| download | bcm5719-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')
| -rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 45 |
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; } |

