Index: lib/DebugInfo/DWARF/DWARFDie.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFDie.cpp +++ lib/DebugInfo/DWARF/DWARFDie.cpp @@ -204,20 +204,37 @@ Optional Bound; for (const DWARFDie &C : D.children()) if (C.getTag() == DW_TAG_subrange_type) { - OS << '['; - uint64_t LowerBound = 0; + Optional LB; + Optional Count; + Optional UB; if (Optional L = C.find(DW_AT_lower_bound)) - if (Optional LB = L->getAsUnsignedConstant()) { - LowerBound = *LB; - OS << LowerBound << '-'; - } - if (Optional CountV = C.find(DW_AT_count)) { - if (Optional C = CountV->getAsUnsignedConstant()) - OS << (*C + LowerBound); - } else if (Optional UpperV = C.find(DW_AT_upper_bound)) - if (Optional U = UpperV->getAsUnsignedConstant()) - OS << *U; - OS << ']'; + LB = L->getAsUnsignedConstant(); + if (Optional CountV = C.find(DW_AT_count)) + Count = CountV->getAsUnsignedConstant(); + if (Optional UpperV = C.find(DW_AT_upper_bound)) + UB = UpperV->getAsUnsignedConstant(); + if (!LB && !Count && !UB) + OS << "[]"; + if (!LB && (Count || UB)) + OS << '[' << (Count ? *Count : *UB + 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; + else + OS << '?'; + OS << ")]"; + } } break; } Index: test/tools/llvm-dwarfdump/X86/prettyprint_types.s =================================================================== --- test/tools/llvm-dwarfdump/X86/prettyprint_types.s +++ test/tools/llvm-dwarfdump/X86/prettyprint_types.s @@ -20,7 +20,7 @@ # array_type # Testing lower_bound, upper_bound, lower and upper, lower and count, and count separately. -# CHECK: DW_AT_type{{.*}}"int[1-][2][1-2][1-3][2]" +# CHECK: DW_AT_type{{.*}}"int{{\[}}[1, ?)][3]{{\[}}[1, 2)]{{\[}}[1, 3)][2]" # subroutine types # CHECK: DW_AT_type{{.*}}"int()"