]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
Merge DWARFDIE::extractFast and DWARFDIE::extract into one function.
authorAlexey Samsonov <samsonov@google.com>
Mon, 28 Oct 2013 23:58:58 +0000 (23:58 +0000)
committerAlexey Samsonov <samsonov@google.com>
Mon, 28 Oct 2013 23:58:58 +0000 (23:58 +0000)
Complicated CU-DIE-specific logic in the latter was never used,
and it makes sense to have safety checks for broken dwarf in the former.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193563 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/DWARFDebugInfoEntry.cpp
lib/DebugInfo/DWARFDebugInfoEntry.h

index 39d8e3e918961b14caf51df74fb34ba38edff4b0..babfd2ece067e88401cece5e54890904b5a3a4af 100644 (file)
@@ -96,6 +96,9 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
                                              uint32_t *OffsetPtr) {
   Offset = *OffsetPtr;
   DataExtractor DebugInfoData = U->getDebugInfoExtractor();
+  uint32_t UEndOffset = U->getNextUnitOffset();
+  if (Offset >= UEndOffset || !DebugInfoData.isValidOffset(Offset))
+    return false;
   uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
   if (0 == AbbrCode) {
     // NULL debug tag entry.
@@ -103,7 +106,11 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
     return true;
   }
   AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
-  assert(AbbrevDecl);
+  if (0 == AbbrevDecl) {
+    // Restore the original offset.
+    *OffsetPtr = Offset;
+    return false;
+  }
   ArrayRef<uint8_t> FixedFormSizes = DWARFFormValue::getFixedFormSizes(
       U->getAddressByteSize(), U->getVersion());
   assert(FixedFormSizes.size() > 0);
@@ -125,53 +132,6 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
   return true;
 }
 
-bool DWARFDebugInfoEntryMinimal::extract(const DWARFUnit *U,
-                                         uint32_t *OffsetPtr) {
-  DataExtractor DebugInfoData = U->getDebugInfoExtractor();
-  const uint32_t UEndOffset = U->getNextUnitOffset();
-  Offset = *OffsetPtr;
-  if ((Offset >= UEndOffset) || !DebugInfoData.isValidOffset(Offset))
-    return false;
-  uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
-  if (0 == AbbrCode) {
-    // NULL debug tag entry.
-    AbbrevDecl = NULL;
-    return true;
-  }
-  AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
-  if (0 == AbbrevDecl) {
-    // Restore the original offset.
-    *OffsetPtr = Offset;
-    return false;
-  }
-  bool IsCompileUnitTag = (AbbrevDecl->getTag() == DW_TAG_compile_unit);
-  if (IsCompileUnitTag)
-    const_cast<DWARFUnit *>(U)->setBaseAddress(0);
-
-  // Skip all data in the .debug_info for the attributes
-  for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
-    uint16_t Attr = AbbrevDecl->getAttrByIndex(i);
-    uint16_t Form = AbbrevDecl->getFormByIndex(i);
-
-    if (IsCompileUnitTag &&
-        ((Attr == DW_AT_entry_pc) || (Attr == DW_AT_low_pc))) {
-      DWARFFormValue FormValue(Form);
-      if (FormValue.extractValue(DebugInfoData, OffsetPtr, U)) {
-        if (Attr == DW_AT_low_pc || Attr == DW_AT_entry_pc) {
-          Optional<uint64_t> BaseAddr = FormValue.getAsAddress(U);
-          if (BaseAddr.hasValue())
-            const_cast<DWARFUnit *>(U)->setBaseAddress(BaseAddr.getValue());
-        }
-      }
-    } else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
-      // Restore the original offset.
-      *OffsetPtr = Offset;
-      return false;
-    }
-  }
-  return true;
-}
-
 bool DWARFDebugInfoEntryMinimal::isSubprogramDIE() const {
   return getTag() == DW_TAG_subprogram;
 }
@@ -323,7 +283,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
       getAttributeValueAsReference(U, DW_AT_specification, -1U);
   if (spec_ref != -1U) {
     DWARFDebugInfoEntryMinimal spec_die;
-    if (spec_die.extract(U, &spec_ref)) {
+    if (spec_die.extractFast(U, &spec_ref)) {
       if (const char *name = spec_die.getSubroutineName(U))
         return name;
     }
@@ -333,7 +293,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
       getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
   if (abs_origin_ref != -1U) {
     DWARFDebugInfoEntryMinimal abs_origin_die;
-    if (abs_origin_die.extract(U, &abs_origin_ref)) {
+    if (abs_origin_die.extractFast(U, &abs_origin_ref)) {
       if (const char *name = abs_origin_die.getSubroutineName(U))
         return name;
     }
index 12479bfd3c5bbe73a3b26758f3226c5a02e7a13e..aa61056332efaa5c7a7126afee7d85d530b50447 100644 (file)
@@ -50,12 +50,6 @@ public:
   /// doesn't change OffsetPtr.
   bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr);
 
-  /// Extract a debug info entry for a given compile unit from the
-  /// .debug_info and .debug_abbrev data starting at the given offset.
-  /// If compile unit can't be parsed, returns false and doesn't change
-  /// OffsetPtr.
-  bool extract(const DWARFUnit *U, uint32_t *OffsetPtr);
-
   uint32_t getTag() const { return AbbrevDecl ? AbbrevDecl->getTag() : 0; }
   bool isNULL() const { return AbbrevDecl == 0; }