## Show that llvm-dwarfdump prints a range of different structures in the ## .debug_abbrev section when requested. As well as basic cases, this test also ## shows how llvm-dwarfdump handles unknown tag, attribute and form values. # RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o # RUN: llvm-dwarfdump --debug-abbrev %t.o | FileCheck %s --match-full-lines # CHECK: .debug_abbrev contents: # CHECK-NEXT: Abbrev table for offset: 0x00000000 # CHECK-NEXT: [66] DW_TAG_compile_unit DW_CHILDREN_yes # CHECK-NEXT: DW_AT_name DW_FORM_string # CHECK-NEXT: DW_AT_stmt_list DW_FORM_data2 # CHECK-EMPTY: # CHECK-NEXT: [128] DW_TAG_unknown_ffff DW_CHILDREN_no # CHECK-NEXT: DW_AT_unknown_5 DW_FORM_unknown_2 # CHECK-EMPTY: # CHECK-NEXT: [66] DW_TAG_unknown_4080 DW_CHILDREN_no # CHECK-EMPTY: # CHECK-NEXT: [1] DW_TAG_unknown_4000 DW_CHILDREN_no # CHECK-NEXT: DW_AT_unknown_2000 DW_FORM_unknown_ffff # CHECK-NEXT: DW_AT_unknown_3fff DW_FORM_unknown_7f # CHECK-NEXT: DW_AT_unknown_1fff DW_FORM_block2 # CHECK-NEXT: DW_AT_unknown_4000 DW_FORM_block4 # CHECK-EMPTY: # CHECK-NEXT: [2] DW_TAG_unknown_407f DW_CHILDREN_no # CHECK-EMPTY: # CHECK-NEXT: Abbrev table for offset: 0x00000038 # CHECK-NEXT: [66] DW_TAG_entry_point DW_CHILDREN_no # CHECK-NEXT: DW_AT_elemental DW_FORM_flag_present ## All values in this assembly are intended to be arbitrary, except where ## specified. .section .debug_abbrev,"",@progbits .byte 0x42 ## Abbreviation Code ## Known tag with children and known attributes and forms. .byte 0x11 ## DW_TAG_compile_unit .byte 0x01 ## DW_CHILDREN_yes .byte 0x03 ## DW_AT_name .byte 0x08 ## DW_FORM_string (valid form for DW_AT_name). .byte 0x10 ## DW_AT_stmt_list .byte 0x05 ## DW_FORM_data2 (invalid form for DW_AT_stmt_list). .byte 0, 0 ## End of attributes ## Tag without children and reserved form/attribute values. .byte 0x80, 0x01 ## Multi-byte Abbreviation Code .byte 0xFF, 0xFF, 0x03 ## 0xFFFF == DW_TAG_hi_user .byte 0x00 ## DW_CHILDREN_no ## Reserved attribute and form. .byte 0x05 ## Reserved DW_AT_* .byte 0x02 ## Reserved DW_FORM_* .byte 0, 0 ## End of attributes. ## Tag with no attributes. .byte 0x42 ## Abbreviation Code (duplicate) .byte 0x80, 0x81, 0x01 ## 0x4080 == DW_TAG_lo_user .byte 0x00 ## DW_CHILDREN_no .byte 0, 0 ## End of attributes. ## Tag with attributes/forms with unknown values/values in user-defined ranges. .byte 0x01 ## Abbreviation Code ## FIXME: https://bugs.llvm.org/show_bug.cgi?id=44258 means that 0x80, 0x80, 0x04 ## results in a failure to parse correctly, whilst the following tag value is ## interpreted incorrectly as 0x4000. .byte 0x80, 0x80, 0x05 ## 0x10001 == DW_TAG_hi_user + 2 .byte 0x00 ## DW_CHILDREN_no .byte 0x80, 0x40 ## 0x2000 == DW_AT_lo_user .byte 0xFF, 0xFF, 0x03 ## 0xFFFF == Unknown multi-byte form. .byte 0xFF, 0x7F ## DW_AT_hi_user .byte 0x7F ## Unknown single-byte form. .byte 0xFF, 0x3F ## DW_AT_lo_user - 1 .byte 0x03 ## DW_FORM_block2 .byte 0x80, 0x80, 0x01 ## DW_AT_hi_user + 1 .byte 0x04 ## DW_FORM_block4 .byte 0, 0 ## End of attributes. ## Tag with invalid children encoding. .byte 0x02 ## Abbreviation Code .byte 0xFF, 0x80, 0x01 ## 0x407F == DW_TAG_lo_user - 1 .byte 0x02 ## Invalid children encoding (interpreted as DW_CHILDREN_no). .byte 0, 0 ## End of attributes. .byte 0 ## End of abbrevs. ## Second .debug_abbrev set. .byte 0x42 ## Abbreviation Code (duplicate in different unit) .byte 0x03 ## DW_TAG_entry_point .byte 0x00 ## DW_CHILDREN_no .byte 0x66 ## DW_AT_elemental .byte 0x19 ## DW_FORM_flag_present .byte 0, 0 ## End of attributes.