| # RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o |
| # RUN: llvm-dwarfdump -v %t.o | FileCheck %s |
| |
| # Test object to verify that dwarfdump handles dwp files with DWARF v5 string |
| # offset tables. We have 3 CUs and 2 TUs, where it is assumed that |
| # CU1 and TU1 came from one object file, CU2 and TU2 from a second object |
| # file, and CU3 from a third object file that was compiled with |
| # -gdwarf-4. |
| # |
| .section .debug_str.dwo,"MSe",@progbits,1 |
| str_producer: |
| .asciz "Handmade DWARF producer" |
| str_CU1: |
| .asciz "Compile_Unit_1" |
| str_CU1_dir: |
| .asciz "/home/test/CU1" |
| str_CU2: |
| .asciz "Compile_Unit_2" |
| str_CU2_dir: |
| .asciz "/home/test/CU2" |
| str_TU1: |
| .asciz "Type_Unit_1" |
| str_TU1_type: |
| .asciz "MyStruct_1" |
| str_TU2: |
| .asciz "Type_Unit_2" |
| str_TU2_type: |
| .asciz "MyStruct_2" |
| str_CU3: |
| .asciz "Compile_Unit_3" |
| str_CU3_dir: |
| .asciz "/home/test/CU3" |
| |
| .section .debug_str_offsets.dwo,"e",@progbits |
| # Object files 1's portion of the .debug_str_offsets.dwo section. |
| # CU1 and TU1 share a contribution to the string offsets table. |
| .debug_str_offsets_object_file1_start: |
| .long .debug_str_offsets_object_file1_end-.debug_str_offsets_base_1 |
| .short 5 # DWARF version |
| .short 0 # Padding |
| .debug_str_offsets_base_1: |
| .long str_producer-.debug_str.dwo |
| .long str_CU1-.debug_str.dwo |
| .long str_CU1_dir-.debug_str.dwo |
| .long str_TU1-.debug_str.dwo |
| .long str_TU1_type-.debug_str.dwo |
| .debug_str_offsets_object_file1_end: |
| |
| # Object files 2's portion of the .debug_str_offsets.dwo section. |
| # CU2 and TU2 share a contribution to the string offsets table. |
| .debug_str_offsets_object_file2_start: |
| .long .debug_str_offsets_object_file2_end-.debug_str_offsets_base_2 |
| .short 5 # DWARF version |
| .short 0 # Padding |
| .debug_str_offsets_base_2: |
| .long str_producer-.debug_str.dwo |
| .long str_CU2-.debug_str.dwo |
| .long str_CU2_dir-.debug_str.dwo |
| .long str_TU2-.debug_str.dwo |
| .long str_TU2_type-.debug_str.dwo |
| .debug_str_offsets_object_file2_end: |
| |
| # Object files 3's portion of the .debug_str_offsets.dwo section. |
| # This file is assumed to have been compiled with -gdwarf-4 and |
| # therefore contains a version 4 CU and a GNU format contribution |
| # to the .debug_str_offsets section. |
| .debug_str_offsets_object_file3_start: |
| .debug_str_offsets_base_3: |
| .long str_producer-.debug_str.dwo |
| .long str_CU3-.debug_str.dwo |
| .long str_CU3_dir-.debug_str.dwo |
| .debug_str_offsets_object_file3_end: |
| |
| # Abbrevs are shared for all compile and type units |
| .section .debug_abbrev.dwo,"e",@progbits |
| .byte 0x01 # Abbrev code |
| .byte 0x11 # DW_TAG_compile_unit |
| .byte 0x00 # DW_CHILDREN_no |
| .byte 0x25 # DW_AT_producer |
| .byte 0x1a # DW_FORM_strx |
| .byte 0x03 # DW_AT_name |
| .byte 0x1a # DW_FORM_strx |
| .byte 0x03 # DW_AT_name |
| .byte 0x1a # DW_FORM_strx |
| .byte 0x00 # EOM(1) |
| .byte 0x00 # EOM(2) |
| .byte 0x02 # Abbrev code |
| .byte 0x41 # DW_TAG_type_unit |
| .byte 0x01 # DW_CHILDREN_yes |
| .byte 0x03 # DW_AT_name |
| .byte 0x1a # DW_FORM_strx |
| .byte 0x00 # EOM(1) |
| .byte 0x00 # EOM(2) |
| .byte 0x03 # Abbrev code |
| .byte 0x13 # DW_TAG_structure_type |
| .byte 0x00 # DW_CHILDREN_no (no members) |
| .byte 0x03 # DW_AT_name |
| .byte 0x1a # DW_FORM_strx |
| .byte 0x00 # EOM(1) |
| .byte 0x00 # EOM(2) |
| .byte 0x04 # Abbrev code |
| .byte 0x11 # DW_TAG_compile_unit |
| .byte 0x00 # DW_CHILDREN_no |
| .byte 0x25 # DW_AT_producer |
| .short 0x3e82 # DW_FORM_GNU_str_index |
| .byte 0x03 # DW_AT_name |
| .short 0x3e82 # DW_FORM_GNU_str_index |
| .byte 0x03 # DW_AT_name |
| .short 0x3e82 # DW_FORM_GNU_str_index |
| .byte 0x00 # EOM(1) |
| .byte 0x00 # EOM(2) |
| .byte 0x00 # EOM(3) |
| abbrev_end: |
| |
| .section .debug_info.dwo,"e",@progbits |
| |
| # DWARF v5 CU header. |
| CU1_5_start: |
| .long CU1_5_end-CU1_5_version # Length of Unit |
| CU1_5_version: |
| .short 5 # DWARF version number |
| .byte 1 # DWARF Unit Type |
| .byte 8 # Address Size (in bytes) |
| .long .debug_abbrev.dwo # Offset Into Abbrev. Section |
| # The compile-unit DIE, which has a DW_AT_producer, DW_AT_name |
| # and DW_AT_compdir. |
| .byte 1 # Abbreviation code |
| .byte 0 # The index of the producer string |
| .byte 1 # The index of the CU name string |
| .byte 2 # The index of the comp dir string |
| .byte 0 # NULL |
| CU1_5_end: |
| |
| CU2_5_start: |
| .long CU2_5_end-CU2_5_version # Length of Unit |
| CU2_5_version: |
| .short 5 # DWARF version number |
| .byte 1 # DWARF Unit Type |
| .byte 8 # Address Size (in bytes) |
| .long .debug_abbrev.dwo # Offset Into Abbrev. Section |
| # The compile-unit DIE, which has a DW_AT_producer, DW_AT_name |
| # and DW_AT_compdir. |
| .byte 1 # Abbreviation code |
| .byte 0 # The index of the producer string |
| .byte 1 # The index of the CU name string |
| .byte 2 # The index of the comp dir string |
| .byte 0 # NULL |
| CU2_5_end: |
| |
| CU3_4_start: |
| .long CU3_4_end-CU3_4_version # Length of Unit |
| CU3_4_version: |
| .short 4 # DWARF version number |
| .long .debug_abbrev.dwo # Offset Into Abbrev. Section |
| .byte 8 # Address Size (in bytes) |
| # The compile-unit DIE, which has a DW_AT_producer, DW_AT_name |
| # and DW_AT_compdir. |
| .byte 4 # Abbreviation code |
| .byte 0 # The index of the producer string |
| .byte 1 # The index of the CU name string |
| .byte 2 # The index of the comp dir string |
| .byte 0 # NULL |
| CU3_4_end: |
| |
| .section .debug_types.dwo,"e",@progbits |
| # DWARF v5 Type unit header. |
| TU1_5_start: |
| .long TU1_5_end-TU1_5_version # Length of Unit |
| TU1_5_version: |
| .short 5 # DWARF version number |
| .byte 2 # DWARF Unit Type |
| .byte 8 # Address Size (in bytes) |
| .long .debug_abbrev.dwo # Offset Into Abbrev. Section |
| .quad 0xeeaaddbbaabbeedd # Type Signature |
| .long TU1_5_type-TU1_5_start # Type offset |
| # The type-unit DIE, which has a name. |
| .byte 2 # Abbreviation code |
| .byte 3 # Index of the unit type name string |
| # The type DIE, which has a name. |
| TU1_5_type: |
| .byte 3 # Abbreviation code |
| .byte 4 # Index of the type name string |
| .byte 0 # NULL |
| .byte 0 # NULL |
| TU1_5_end: |
| |
| TU2_5_start: |
| .long TU2_5_end-TU2_5_version # Length of Unit |
| TU2_5_version: |
| .short 5 # DWARF version number |
| .byte 2 # DWARF Unit Type |
| .byte 8 # Address Size (in bytes) |
| .long .debug_abbrev.dwo # Offset Into Abbrev. Section |
| .quad 0x00ffeeffaaff00ff # Type Signature |
| .long TU2_5_type-TU2_5_start # Type offset |
| # The type-unit DIE, which has a name. |
| .byte 2 # Abbreviation code |
| .byte 3 # Index of the unit type name string |
| # The type DIE, which has a name. |
| TU2_5_type: |
| .byte 3 # Abbreviation code |
| .byte 4 # Index of the type name string |
| .byte 0 # NULL |
| .byte 0 # NULL |
| TU2_5_end: |
| |
| .section .debug_cu_index,"",@progbits |
| # The index header |
| .long 2 # Version |
| .long 3 # Columns of contribution matrix |
| .long 3 # number of units |
| .long 3 # number of hash buckets in table |
| |
| # The signatures for all CUs. |
| .quad 0xddeeaaddbbaabbee # signature 1 |
| .quad 0xff00ffeeffaaff00 # signature 2 |
| .quad 0xf00df00df00df00d # signature 2 |
| # The indexes for both CUs. |
| .long 1 # index 1 |
| .long 2 # index 2 |
| .long 3 # index 3 |
| # The sections to which all CUs contribute. |
| .long 1 # DW_SECT_INFO |
| .long 3 # DW_SECT_ABBREV |
| .long 6 # DW_SECT_STR_OFFSETS |
| |
| # The starting offsets of all CU's contributions to info, |
| # abbrev and string offsets table. |
| .long CU1_5_start-.debug_info.dwo |
| .long 0 |
| .long .debug_str_offsets_object_file1_start-.debug_str_offsets.dwo |
| .long CU2_5_start-.debug_info.dwo |
| .long 0 |
| .long .debug_str_offsets_object_file2_start-.debug_str_offsets.dwo |
| .long CU3_4_start-.debug_info.dwo |
| .long 0 |
| .long .debug_str_offsets_object_file3_start-.debug_str_offsets.dwo |
| |
| # The lengths of all CU's contributions to info, abbrev and |
| # string offsets table. |
| .long CU1_5_end-CU1_5_start |
| .long abbrev_end-.debug_abbrev.dwo |
| .long .debug_str_offsets_object_file1_end-.debug_str_offsets_object_file1_start |
| .long CU2_5_end-CU2_5_start |
| .long abbrev_end-.debug_abbrev.dwo |
| .long .debug_str_offsets_object_file2_end-.debug_str_offsets_object_file2_start |
| .long CU3_4_end-CU3_4_start |
| .long abbrev_end-.debug_abbrev.dwo |
| .long .debug_str_offsets_object_file3_end-.debug_str_offsets_object_file3_start |
| |
| .section .debug_tu_index,"",@progbits |
| # The index header |
| .long 2 # Version |
| .long 3 # Columns of contribution matrix |
| .long 2 # number of units |
| .long 2 # number of hash buckets in table |
| |
| # The signatures for both TUs. |
| .quad 0xeeaaddbbaabbeedd # signature 1 |
| .quad 0x00ffeeffaaff00ff # signature 2 |
| # The indexes for both TUs. |
| .long 1 # index 1 |
| .long 2 # index 2 |
| # The sections to which both TUs contribute. |
| .long 2 # DW_SECT_TYPES |
| .long 3 # DW_SECT_ABBREV |
| .long 6 # DW_SECT_STR_OFFSETS |
| |
| # The starting offsets of both TU's contributions to info, |
| # abbrev and string offsets table. |
| .long TU1_5_start-.debug_types.dwo |
| .long 0 |
| .long .debug_str_offsets_object_file1_start-.debug_str_offsets.dwo |
| .long TU2_5_start-.debug_types.dwo |
| .long 0 |
| .long .debug_str_offsets_object_file2_start-.debug_str_offsets.dwo |
| |
| # The lengths of both TU's contributions to info, abbrev and |
| # string offsets table. |
| .long TU1_5_end-TU1_5_start |
| .long abbrev_end-.debug_abbrev.dwo |
| .long .debug_str_offsets_object_file1_end-.debug_str_offsets_object_file1_start |
| .long TU2_5_end-TU2_5_start |
| .long abbrev_end-.debug_abbrev.dwo |
| .long .debug_str_offsets_object_file2_end-.debug_str_offsets_object_file2_start |
| |
| |
| # Verify that the correct strings from each unit are displayed and that the |
| # index for the .debug_str_offsets section has the right values. |
| |
| # CHECK: Compile Unit |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_compile_unit |
| # CHECK-NEXT: DW_AT_producer [DW_FORM_strx] (indexed (00000000) string = "Handmade DWARF producer") |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "Compile_Unit_1") |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000002) string = "/home/test/CU1") |
| # CHECK-NOT: NULL |
| |
| # CHECK: Compile Unit |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_compile_unit |
| # CHECK-NEXT: DW_AT_producer [DW_FORM_strx] (indexed (00000000) string = "Handmade DWARF producer") |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000001) string = "Compile_Unit_2") |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000002) string = "/home/test/CU2") |
| # |
| # CHECK: Type Unit |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_type_unit |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000003) string = "Type_Unit_1") |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_structure_type |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000004) string = "MyStruct_1") |
| # |
| # CHECK: Type Unit |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_type_unit |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000003) string = "Type_Unit_2") |
| # CHECK-NOT: NULL |
| # CHECK: DW_TAG_structure_type |
| # CHECK-NEXT: DW_AT_name [DW_FORM_strx] (indexed (00000004) string = "MyStruct_2") |
| |
| # Verify the correct offets of the compile and type units contributions in the |
| # index tables. |
| |
| # CHECK: .debug_cu_index contents: |
| # CHECK-NOT: contents: |
| # CHECK: 1 0xddeeaaddbbaabbee [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) |
| # CHECK-SAME: [0x00000000 |
| # CHECK-NEXT: 2 0xff00ffeeffaaff00 [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) |
| # CHECK-SAME: [0x0000001c |
| |
| # CHECK: .debug_tu_index contents: |
| # CHECK-NOT: contents: |
| # CHECK: 1 0xeeaaddbbaabbeedd [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) |
| # CHECK-SAME: [0x00000000 |
| # CHECK-NEXT: 2 0x00ffeeffaaff00ff [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) [{{0x[0-9a-f]*, 0x[0-9a-f]*}}) |
| # CHECK: [0x0000001c |