diff options
Diffstat (limited to 'lib/DebugInfo/DWARF/DWARFDie.cpp')
-rw-r--r-- | lib/DebugInfo/DWARF/DWARFDie.cpp | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/lib/DebugInfo/DWARF/DWARFDie.cpp b/lib/DebugInfo/DWARF/DWARFDie.cpp index 551e292fb03..e6018d9cf22 100644 --- a/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -154,6 +154,52 @@ static void dumpTypeTagName(raw_ostream &OS, dwarf::Tag T) { OS << TagStr.substr(7, TagStr.size() - 12) << " "; } +static void dumpArrayType(raw_ostream &OS, const DWARFDie &D) { + Optional<uint64_t> Bound; + for (const DWARFDie &C : D.children()) + if (C.getTag() == DW_TAG_subrange_type) { + Optional<uint64_t> LB; + Optional<uint64_t> Count; + Optional<uint64_t> UB; + Optional<unsigned> DefaultLB; + if (Optional<DWARFFormValue> L = C.find(DW_AT_lower_bound)) + LB = L->getAsUnsignedConstant(); + if (Optional<DWARFFormValue> CountV = C.find(DW_AT_count)) + Count = CountV->getAsUnsignedConstant(); + if (Optional<DWARFFormValue> UpperV = C.find(DW_AT_upper_bound)) + UB = UpperV->getAsUnsignedConstant(); + if (Optional<DWARFFormValue> LV = + D.getDwarfUnit()->getUnitDIE().find(DW_AT_language)) + if (Optional<uint64_t> LC = LV->getAsUnsignedConstant()) + if ((DefaultLB = + LanguageLowerBound(static_cast<dwarf::SourceLanguage>(*LC)))) + if (LB && *LB == *DefaultLB) + LB = None; + if (!LB && !Count && !UB) + OS << "[]"; + else if (!LB && (Count || UB) && DefaultLB) + OS << '[' << (Count ? *Count : *UB - *DefaultLB + 1) << ']'; + else { + OS << "[["; + if (LB) + OS << *LB; + else + OS << '?'; + OS << ", "; + if (Count) + if (LB) + OS << *LB + *Count; + else + OS << "? + " << *Count; + else if (UB) + OS << *UB + 1; + else + OS << '?'; + OS << ")]"; + } + } +} + /// Recursively dump the DIE type name when applicable. static void dumpTypeName(raw_ostream &OS, const DWARFDie &D) { if (!D.isValid()) @@ -201,24 +247,7 @@ static void dumpTypeName(raw_ostream &OS, const DWARFDie &D) { break; } case DW_TAG_array_type: { - Optional<uint64_t> Bound; - for (const DWARFDie &C : D.children()) - if (C.getTag() == DW_TAG_subrange_type) { - OS << '['; - uint64_t LowerBound = 0; - if (Optional<DWARFFormValue> L = C.find(DW_AT_lower_bound)) - if (Optional<uint64_t> LB = L->getAsUnsignedConstant()) { - LowerBound = *LB; - OS << LowerBound << '-'; - } - if (Optional<DWARFFormValue> CountV = C.find(DW_AT_count)) { - if (Optional<uint64_t> C = CountV->getAsUnsignedConstant()) - OS << (*C + LowerBound); - } else if (Optional<DWARFFormValue> UpperV = C.find(DW_AT_upper_bound)) - if (Optional<uint64_t> U = UpperV->getAsUnsignedConstant()) - OS << *U; - OS << ']'; - } + dumpArrayType(OS, D); break; } case DW_TAG_pointer_type: |