diff options
author | David Blaikie <dblaikie@gmail.com> | 2018-12-12 18:46:25 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2018-12-12 18:46:25 +0000 |
commit | 73066d60f12fb5c199acdf2cefd68ec4884304ec (patch) | |
tree | 3469a7f83cdfe8ea419a2f4240721a183e7c8b83 /llvm | |
parent | eb508f8ccb21caa7c9d0f6c2479d73ac79d6b25c (diff) | |
download | bcm5719-llvm-73066d60f12fb5c199acdf2cefd68ec4884304ec.tar.gz bcm5719-llvm-73066d60f12fb5c199acdf2cefd68ec4884304ec.zip |
llvm-dwarfdump: Dump array dimensions in stringified type names
llvm-svn: 348954
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 23 | ||||
-rw-r--r-- | llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s | 179 |
2 files changed, 200 insertions, 2 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 31c4cd5e472..b86f96ae808 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -184,9 +184,28 @@ static void dumpTypeName(raw_ostream &OS, const DWARFDie &Die) { dumpTypeName(OS, D); switch (T) { - case DW_TAG_array_type: - OS << "[]"; + 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 << ']'; + } break; + } case DW_TAG_pointer_type: OS << '*'; break; diff --git a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s new file mode 100644 index 00000000000..c149373870b --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s @@ -0,0 +1,179 @@ +# RUN: llvm-mc < %s -filetype obj -triple i386-pc-linux -o - \ +# RUN: | llvm-dwarfdump - | FileCheck %s + +# CHECK: DW_TAG_variable + +# base_type +# CHECK: DW_AT_type{{.*}}"int" + +# pointer_type +# CHECK: DW_AT_type{{.*}}"int*" + +# reference_type +# CHECK: DW_AT_type{{.*}}"int&" + +# rvalue_reference_type +# CHECK: DW_AT_type{{.*}}"int&&" + +# ptr_to_member_type +# FIXME: Add the contained_type to the assembly, and test the print out is "int foo::*" +# CHECK: DW_AT_type{{.*}}"int*" + +# 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]" + + .section .debug_str,"MS",@progbits,1 +.Lint_name: + .asciz "int" # string offset=107 + .section .debug_abbrev,"",@progbits + .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 1 # DW_CHILDREN_yes + .byte 19 # DW_AT_language + .byte 5 # DW_FORM_data2 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 2 # Abbreviation Code + .byte 36 # DW_TAG_base_type + .byte 0 # DW_CHILDREN_no + .byte 3 # DW_AT_name + .byte 14 # DW_FORM_strp + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 3 # Abbreviation Code + .byte 52 # DW_TAG_variable + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 4 # Abbreviation Code + .byte 0xf # DW_TAG_pointer_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 5 # Abbreviation Code + .byte 0x10 # DW_TAG_reference_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 6 # Abbreviation Code + .byte 0x42 # DW_TAG_rvalue_reference_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 7 # Abbreviation Code + .byte 0x1f # DW_TAG_ptr_to_member_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 8 # Abbreviation Code + .byte 1 # DW_TAG_array_type + .byte 1 # DW_CHILDREN_yes + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 9 # Abbreviation Code + .byte 0x21 # DW_TAG_subrange_type + .byte 0 # DW_CHILDREN_no + .byte 0x22 # DW_AT_lower_bound + .byte 0xb # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 10 # Abbreviation Code + .byte 0x21 # DW_TAG_subrange_type + .byte 0 # DW_CHILDREN_no + .byte 0x2f # DW_AT_upper_bound + .byte 0xb # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 11 # Abbreviation Code + .byte 0x21 # DW_TAG_subrange_type + .byte 0 # DW_CHILDREN_no + .byte 0x22 # DW_AT_lower_bound + .byte 0xb # DW_FORM_data1 + .byte 0x2f # DW_AT_upper_bound + .byte 0xb # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 12 # Abbreviation Code + .byte 0x21 # DW_TAG_subrange_type + .byte 0 # DW_CHILDREN_no + .byte 0x22 # DW_AT_lower_bound + .byte 0xb # DW_FORM_data1 + .byte 0x37 # DW_AT_count + .byte 0xb # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 13 # Abbreviation Code + .byte 0x21 # DW_TAG_subrange_type + .byte 0 # DW_CHILDREN_no + .byte 0x37 # DW_AT_count + .byte 0xb # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 0 # EOM(3) + .section .debug_info,"",@progbits +.Lcu_begin: + .long .Lunit_end - .Lunit_start # Length of Unit +.Lunit_start: + .short 4 # DWARF version number + .long .debug_abbrev # Offset Into Abbrev. Section + .byte 8 # Address Size (in bytes) + .byte 1 # DW_TAG_compile_unit + .short 12 # DW_AT_language +.Lint_type: + .byte 2 # DW_TAG_base_type + .long .Lint_name # DW_AT_name +.Lpointer_type: + .byte 4 # DW_TAG_pointer_type + .long .Lint_type - .Lcu_begin # DW_AT_type +.Lreference_type: + .byte 5 # DW_TAG_reference_type + .long .Lint_type - .Lcu_begin # DW_AT_type +.Lrvalue_reference_type: + .byte 6 # DW_TAG_rvalue_reference_type + .long .Lint_type - .Lcu_begin # DW_AT_type +.Lptr_to_member_type: + .byte 7 # DW_TAG_ptr_to_member_type + .long .Lint_type - .Lcu_begin # DW_AT_type +.Larray_type: + .byte 8 # DW_TAG_array_type + .long .Lint_type - .Lcu_begin # DW_AT_type + .byte 9 # DW_AT_subrange_type + .byte 1 # DW_AT_lower_bound + .byte 10 # DW_AT_subrange_type + .byte 2 # DW_AT_upper_bound + .byte 11 # DW_AT_subrange_type + .byte 1 # DW_AT_lower_bound + .byte 2 # DW_AT_upper_bound + .byte 12 # DW_AT_subrange_type + .byte 1 # DW_AT_lower_bound + .byte 2 # DW_AT_count + .byte 13 # DW_AT_subrange_type + .byte 2 # DW_AT_count + .byte 0 # End Of Children Mark + .byte 3 # DW_TAG_variable + .long .Lint_type - .Lcu_begin # DW_AT_type + .byte 3 # DW_TAG_variable + .long .Lpointer_type - .Lcu_begin # DW_AT_type + .byte 3 # DW_TAG_variable + .long .Lreference_type - .Lcu_begin # DW_AT_type + .byte 3 # DW_TAG_variable + .long .Lrvalue_reference_type - .Lcu_begin # DW_AT_type + .byte 3 # DW_TAG_variable + .long .Lptr_to_member_type - .Lcu_begin # DW_AT_type + .byte 3 # DW_TAG_variable + .long .Larray_type - .Lcu_begin # DW_AT_type + .byte 0 # End Of Children Mark +.Lunit_end: |