[DWARF] Added verification check for die ranges. If highPC is an address, then it should be greater than lowPC for each range.

Differential Revision: https://reviews.llvm.org/D35733

llvm-svn: 308928
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
index db38b63..7b7b29b 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
@@ -94,6 +94,7 @@
     auto Die = Unit.getDIEAtIndex(I);
     if (Die.getTag() == DW_TAG_null)
       continue;
+    NumUnitErrors += verifyDieRanges(Die);
     for (auto AttrValue : Die.attributes()) {
       NumUnitErrors += verifyDebugInfoAttribute(Die, AttrValue);
       NumUnitErrors += verifyDebugInfoForm(Die, AttrValue);
@@ -209,6 +210,18 @@
   return (isHeaderChainValid && NumDebugInfoErrors == 0);
 }
 
+unsigned DWARFVerifier::verifyDieRanges(const DWARFDie &Die) {
+  unsigned NumErrors = 0;
+  for (auto Range : Die.getAddressRanges()) {
+    if (Range.LowPC >= Range.HighPC) {
+      ++NumErrors;
+      OS << format("error: Invalid address range [0x%08x - 0x%08x].\n",
+                   Range.LowPC, Range.HighPC);
+    }
+  }
+  return NumErrors;
+}
+
 unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die,
                                                  DWARFAttribute &AttrValue) {
   const DWARFObject &DObj = DCtx.getDWARFObj();