# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o # RUN: not llvm-dwarfdump -v -debug-info %t.o 2> %t.err | FileCheck %s # RUN: FileCheck %s --input-file %t.err --check-prefix=ERR --implicit-check-not=error # RUN: not llvm-dwarfdump -lookup 10 %t.o 2> %t2.err # RUN: FileCheck %s --input-file %t2.err --check-prefix=ERR --implicit-check-not=error # RUN: llvm-dwarfdump -debug-rnglists %t.o | \ # RUN: FileCheck %s --check-prefix=RNGLISTS # Test object to verify dwarfdump handles v5 range lists in 64-bit DWARF format. # This is similar to 'dwarfdump-rnglists.s', which uses 32-bit DWARF format. # We use very simplified compile unit dies. # There are 2 full CUs with DW_AT_rnglists_base, one with a DW_AT_ranges # attribute using DW_FORM_sec_offset, the other with DW_AT_ranges using # DW_FORM_rnglistx. .section .debug_abbrev,"",@progbits .byte 0x01 # Abbrev code .byte 0x11 # DW_TAG_compile_unit .byte 0x00 # DW_CHILDREN_no .byte 0x74 # DW_AT_rnglists_base .byte 0x17 # DW_FORM_sec_offset .byte 0x55 # DW_AT_ranges .byte 0x17 # DW_FORM_sec_offset .byte 0x00 # EOM(1) .byte 0x00 # EOM(2) .byte 0x02 # Abbrev code .byte 0x11 # DW_TAG_compile_unit .byte 0x00 # DW_CHILDREN_no .byte 0x74 # DW_AT_rnglists_base .byte 0x17 # DW_FORM_sec_offset .byte 0x55 # DW_AT_ranges .byte 0x23 # DW_FORM_rnglistx .byte 0x00 # EOM(1) .byte 0x00 # EOM(2) .byte 0x00 # EOM(3) # The split CU uses DW_FORM_rnglistx (the only correct option). # There is no DW_AT_rnglists_base in split units. .section .debug_abbrev.dwo,"e",@progbits .byte 0x01 # Abbrev code .byte 0x11 # DW_TAG_compile_unit .byte 0x00 # DW_CHILDREN_no .byte 0x55 # DW_AT_ranges .byte 0x23 # DW_FORM_rnglistx .byte 0x00 # EOM(1) .byte 0x00 # EOM(2) .byte 0x00 # EOM(3) .section .debug_info,"",@progbits .long 0xffffffff # DWARF64 mark .quad CU1_5_64_end - CU1_5_64_version # Length of Unit CU1_5_64_version: .short 5 # DWARF version number .byte 1 # DWARF Unit Type .byte 4 # Address Size (in bytes) .quad .debug_abbrev # Offset Into Abbrev. Section # The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges. .byte 1 # Abbreviation code .quad Rnglist_Table0_base # DW_AT_rnglists_base .quad Rnglist_Table0_Rnglist0 # DW_AT_ranges CU1_5_64_end: .long 0xffffffff # DWARF64 mark .quad CU2_5_64_end - CU2_5_64_version # Length of Unit CU2_5_64_version: .short 5 # DWARF version number .byte 1 # DWARF Unit Type .byte 4 # Address Size (in bytes) .quad .debug_abbrev # Offset Into Abbrev. Section # The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges. .byte 2 # Abbreviation code .quad Rnglist_Table0_base # DW_AT_rnglists_base .uleb128 1 # DW_AT_ranges CU2_5_64_end: # A CU with an invalid DW_AT_rnglists_base attribute .long 0xffffffff # DWARF64 mark .quad CU3_5_64_end - CU3_5_64_version # Length of Unit CU3_5_64_version: .short 5 # DWARF version number .byte 1 # DWARF Unit Type .byte 4 # Address Size (in bytes) .quad .debug_abbrev # Offset Into Abbrev. Section # The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges. .byte 2 # Abbreviation code .quad 0x8 # DW_AT_rnglists_base .uleb128 0 # DW_AT_ranges CU3_5_64_end: # A CU DIE with an incorrect DW_AT_ranges attribute .long 0xffffffff # DWARF64 mark .quad CU4_5_64_end - CU4_5_64_version # Length of Unit CU4_5_64_version: .short 5 # DWARF version number .byte 1 # DWARF Unit Type .byte 4 # Address Size (in bytes) .quad .debug_abbrev # Offset Into Abbrev. Section # The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges. .byte 1 # Abbreviation code .quad Rnglist_Table0_base # DW_AT_rnglists_base .quad 4000 # DW_AT_ranges CU4_5_64_end: .section .debug_info.dwo,"e",@progbits # DWARF v5 split CU header. .long 0xffffffff # DWARF64 mark .quad CU_split_5_64_end-CU_split_5_64_version # Length of Unit CU_split_5_64_version: .short 5 # DWARF version number .byte 5 # DWARF Unit Type .byte 4 # Address Size (in bytes) .quad 0 # Offset Into Abbrev Section .quad 0xdeadbeefbaadf00d # DWO id # The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges. .byte 1 # Abbreviation code .uleb128 1 # DW_AT_ranges CU_split_5_64_end: .section .debug_rnglists,"",@progbits # A rnglist table with 2 range lists. The first one uses DW_RLE_start_end # and DW_RLE_start_length. The second one uses DW_RLE_base_address and # DW_RLE_offset_pair. The range lists have entries in the offset table. .long 0xffffffff # DWARF64 mark .quad Rnglist_Table0_end - Rnglist_Table0 # table length Rnglist_Table0: .short 5 # version .byte 4 # address size .byte 0 # segment selector size .long 2 # offset entry count Rnglist_Table0_base: # 2 offset entries which can be used by DW_FORM_rnglistx. .quad Rnglist_Table0_Rnglist0 - Rnglist_Table0_base .quad Rnglist_Table0_Rnglist1 - Rnglist_Table0_base Rnglist_Table0_Rnglist0: .byte 6 # DW_RLE_start_end .long Range0_start .long Range0_end .byte 7 # DW_RLE_start_length .long Range1_start .uleb128 Range1_end - Range1_start .byte 0 # DW_RLE_end_of_list Rnglist_Table0_Rnglist1: .byte 5 # DW_RLE_base_address .long Range0_start .byte 4 # DW_RLE_offset_pair .uleb128 Range1_start - Range0_start .uleb128 Range1_end - Range0_start .byte 0 # DW_RLE_end_of_list Rnglist_Table0_end: # A rnglist table for the split unit with an empty rangelist and one that # uses DW_RLE_base_address and DW_RLE_offset_pair. The ranges have entries # in the offset table. We use the empty range list so we can test # DW_FORM_rnglistx with an index other than 0. .section .debug_rnglists.dwo,"e",@progbits .long 0xffffffff # DWARF64 mark .quad Rnglist_Table0_dwo_end - Rnglist_Table0_dwo # table length Rnglist_Table0_dwo: .short 5 # version .byte 4 # address size .byte 0 # segment selector size .long 2 # offset entry count Rnglist_Table0_base_dwo: # 2 offset entries which can be used by DW_FORM_rnglistx. .quad Rnglist_Table0_Rnglist0_dwo - Rnglist_Table0_base_dwo .quad Rnglist_Table0_Rnglist1_dwo - Rnglist_Table0_base_dwo Rnglist_Table0_Rnglist0_dwo: .byte 0 # DW_RLE_start_end Rnglist_Table0_Rnglist1_dwo: .byte 5 # DW_RLE_base_address .long Range0_start - .text .byte 4 # DW_RLE_offset_pair .uleb128 Range1_start - Range0_start .uleb128 Range1_end - Range0_start .byte 0 # DW_RLE_end_of_list Rnglist_Table0_dwo_end: .text .space 20 Range0_start: # Range0: 0x14 - 0x1c .space 10 Range0_end: .space 12 Range1_start: # Range1: 0x2a - 0x34 .space 10 Range1_end: # CHECK: .debug_info contents: # CHECK: Compile Unit: # CHECK-NOT: Compile Unit: # CHECK: DW_TAG_compile_unit # CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000000000014) # CHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x0000000000000024 # CHECK-NEXT: [0x00000014, 0x0000001e) ".text" # CHECK-NEXT: [0x0000002a, 0x00000034) ".text") # CHECK: Compile Unit: # CHECK-NOT: Compile Unit: # CHECK: DW_TAG_compile_unit # CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000000000014) # CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000034 # CHECK-NEXT: [0x0000002a, 0x00000034) ".text") # CHECK: .debug_info.dwo contents: # CHECK: Compile Unit: # CHECK-NOT: contents: # CHECK: DW_TAG_compile_unit # CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000025 # CHECK-NEXT: [0x0000002a, 0x00000034)) #ERR: error: decoding address ranges: invalid range list offset 0x4000500000008 #ERR: error: decoding address ranges: invalid range list offset 0xfa0 # RNGLISTS: .debug_rnglists contents: # RNGLISTS: range list header: # RNGLISTS-SAME: length = 0x0000000000000031, # RNGLISTS-SAME: format = DWARF64, # RNGLISTS-SAME: version = 0x0005, # RNGLISTS-SAME: addr_size = 0x04, # RNGLISTS-SAME: seg_size = 0x00, # RNGLISTS-SAME: offset_entry_count = 0x00000002 # RNGLISTS-NEXT: offsets: [ # RNGLISTS-NEXT: 0x0000000000000010 # RNGLISTS-NEXT: 0x0000000000000020 # RNGLISTS-NEXT: ] # RNGLISTS-NEXT: ranges: # RNGLISTS-NEXT: [0x00000014, 0x0000001e) # RNGLISTS-NEXT: [0x0000002a, 0x00000034) # RNGLISTS-NEXT: # RNGLISTS-NEXT: [0x0000002a, 0x00000034) # RNGLISTS-NEXT: # RNGLISTS: .debug_rnglists.dwo contents: # RNGLISTS: range list header: # RNGLISTS-SAME: length = 0x0000000000000022, # RNGLISTS-SAME: format = DWARF64, # RNGLISTS-SAME: version = 0x0005, # RNGLISTS-SAME: addr_size = 0x04, # RNGLISTS-SAME: seg_size = 0x00, # RNGLISTS-SAME: offset_entry_count = 0x00000002 # RNGLISTS-NEXT: offsets: [ # RNGLISTS-NEXT: 0x0000000000000010 # RNGLISTS-NEXT: 0x0000000000000011 # RNGLISTS-NEXT: ] # RNGLISTS-NEXT: ranges: # RNGLISTS-NEXT: # RNGLISTS-NEXT: [0x0000002a, 0x00000034) # RNGLISTS-NEXT: