1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
  
     | 
    
      # REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o
# RUN: ld.lld --gdb-index %t1.o -o %t 2>&1 | FileCheck --check-prefix=LLD %s
# RUN: llvm-dwarfdump -gdb-index %t | FileCheck %s
# FIXME: Remove this once lld correctly returns non-zero on errors like this
# There's no other behavior to test hidden behind this error - lld only parses
# the CU for the address ranges, it doesn't need to decode any strings.
# LLD-NOT: error:
## The code contains DWARF v5 sections .debug_rnglists and .debug_addr.
## Check we are able to build the correct address
## area using address range lists.
# CHECK:      .gdb_index contents:
# CHECK:      Address area offset = 0x28, has 2 entries:
# CHECK-NEXT:  Low/High address = [0x201120, 0x201121) (Size: 0x1), CU id = 0
# CHECK-NEXT:  Low/High address = [0x201121, 0x201123) (Size: 0x2), CU id = 0
.text
.section .text._Z3zedv,"ax",@progbits
.Lfunc_begin0:
  retq
.Lfunc_end0:
.section .text.main,"ax",@progbits
.Lfunc_begin1:
 retq
 retq
.Lfunc_end1:
.section .debug_str_offsets,"",@progbits
.long 32
.short 5
.short 0
.Lstr_offsets_base0:
 .long .Linfo_string0
 .long .Linfo_string0
 .long .Linfo_string0
 .long .Linfo_string0
 .long .Linfo_string0
 .long .Linfo_string0
 .long .Linfo_string0
.section .debug_str,"MS",@progbits,1
.Linfo_string0:
 .asciz "stub"
.section .debug_abbrev,"",@progbits
  .byte  1                           # Abbreviation Code
  .byte  17                          # DW_TAG_compile_unit
  .byte  1                           # DW_CHILDREN_yes
  .byte  37                          # DW_AT_producer
  .byte  37                          # DW_FORM_strx1
  .byte  19                          # DW_AT_language
  .byte  5                           # DW_FORM_data2
  .byte  3                           # DW_AT_name
  .byte  37                          # DW_FORM_strx1
  .byte  114                         # DW_AT_str_offsets_base
  .byte  23                          # DW_FORM_sec_offset
  .byte  16                          # DW_AT_stmt_list
  .byte  23                          # DW_FORM_sec_offset
  .byte  27                          # DW_AT_comp_dir
  .byte  37                          # DW_FORM_strx1
  .byte  115                         # DW_AT_addr_base
  .byte  23                          # DW_FORM_sec_offset
  .byte  17                          # DW_AT_low_pc
  .byte  1                           # DW_FORM_addr
  .byte  85                          # DW_AT_ranges
  .byte  35                          # DW_FORM_rnglistx
  .byte  116                         # DW_AT_rnglists_base
  .byte  23                          # DW_FORM_sec_offset
  .byte  0                           # EOM(1)
  .byte  0                           # EOM(2)
  .byte  2                           # Abbreviation Code
  .byte  46                          # DW_TAG_subprogram
  .byte  0                           # DW_CHILDREN_no
  .byte  17                          # DW_AT_low_pc
  .byte  27                          # DW_FORM_addrx
  .byte  18                          # DW_AT_high_pc
  .byte  6                           # DW_FORM_data4
  .byte  64                          # DW_AT_frame_base
  .byte  24                          # DW_FORM_exprloc
  .byte  110                         # DW_AT_linkage_name
  .byte  37                          # DW_FORM_strx1
  .byte  3                           # DW_AT_name
  .byte  37                          # DW_FORM_strx1
  .byte  58                          # DW_AT_decl_file
  .byte  11                          # DW_FORM_data1
  .byte  59                          # DW_AT_decl_line
  .byte  11                          # DW_FORM_data1
  .byte  73                          # DW_AT_type
  .byte  19                          # DW_FORM_ref4
  .byte  63                          # DW_AT_external
  .byte  25                          # DW_FORM_flag_present
  .byte  0                           # EOM(1)
  .byte  0                           # EOM(2)
  .byte  3                           # Abbreviation Code
  .byte  46                          # DW_TAG_subprogram
  .byte  0                           # DW_CHILDREN_no
  .byte  17                          # DW_AT_low_pc
  .byte  27                          # DW_FORM_addrx
  .byte  18                          # DW_AT_high_pc
  .byte  6                           # DW_FORM_data4
  .byte  64                          # DW_AT_frame_base
  .byte  24                          # DW_FORM_exprloc
  .byte  3                           # DW_AT_name
  .byte  37                          # DW_FORM_strx1
  .byte  58                          # DW_AT_decl_file
  .byte  11                          # DW_FORM_data1
  .byte  59                          # DW_AT_decl_line
  .byte  11                          # DW_FORM_data1
  .byte  73                          # DW_AT_type
  .byte  19                          # DW_FORM_ref4
  .byte  63                          # DW_AT_external
  .byte  25                          # DW_FORM_flag_present
  .byte  0                           # EOM(1)
  .byte  0                           # EOM(2)
  .byte  4                           # Abbreviation Code
  .byte  36                          # DW_TAG_base_type
  .byte  0                           # DW_CHILDREN_no
  .byte  3                           # DW_AT_name
  .byte  37                          # DW_FORM_strx1
  .byte  62                          # DW_AT_encoding
  .byte  11                          # DW_FORM_data1
  .byte  11                          # DW_AT_byte_size
  .byte  11                          # DW_FORM_data1
  .byte  0                           # EOM(1)
  .byte  0                           # EOM(2)
  .byte  0                           # EOM(3)
.section .debug_info,"",@progbits
.Lcu_begin0:
  .long  75                          # Length of Unit
  .short 5                           # DWARF version number
  .byte  1                           # DWARF Unit Type
  .byte  8                           # Address Size (in bytes)
  .long  .debug_abbrev               # Offset Into Abbrev. Section
  
  .byte  1                           # Abbrev [1] 0xc:0x43 DW_TAG_compile_unit
  .byte  0                           # DW_AT_producer
  .short 4                           # DW_AT_language
  .byte  1                           # DW_AT_name
  .long  .Lstr_offsets_base0         # DW_AT_str_offsets_base
  .long  0                           # DW_AT_stmt_list
  .byte  2                           # DW_AT_comp_dir
  .long  .Laddr_table_base0          # DW_AT_addr_base
  .quad  0                           # DW_AT_low_pc
  .byte  0                           # DW_AT_ranges
  .long  .Lrnglists_table_base0      # DW_AT_rnglists_base
  .byte 2                            # Abbrev [2] 0x2b:0x10 DW_TAG_subprogram
  .byte 0                            # DW_AT_low_pc
  .long .Lfunc_end0-.Lfunc_begin0    # DW_AT_high_pc
  .byte 1                            # DW_AT_frame_base
  .byte 86
  .byte 3                            # DW_AT_linkage_name
  .byte 4                            # DW_AT_name
  .byte 1                            # DW_AT_decl_file
  .byte 1                            # DW_AT_decl_line
  .long 74                           # DW_AT_type
                                     # DW_AT_external
  .byte  3                           # Abbrev [3] 0x3b:0xf DW_TAG_subprogram
  .byte  1                           # DW_AT_low_pc
  .long  .Lfunc_end1-.Lfunc_begin1   # DW_AT_high_pc
  .byte  1                           # DW_AT_frame_base
  .byte  86
  .byte  6                           # DW_AT_name
  .byte  1                           # DW_AT_decl_file
  .byte  5                           # DW_AT_decl_line
  .long  74                          # DW_AT_type
                                     # DW_AT_external
  .byte  4                           # Abbrev [4] 0x4a:0x4 DW_TAG_base_type
  .byte  5                           # DW_AT_name
  .byte  5                           # DW_AT_encoding
  .byte  4                           # DW_AT_byte_size
  .byte  0                           # End Of Children Mark
.section .debug_rnglists,"",@progbits
.long .Ldebug_rnglist_table_end0-.Ldebug_rnglist_table_start0 # Length
.Ldebug_rnglist_table_start0:        
  .short 5                           # Version
  .byte  8                           # Address size
  .byte  0                           # Segment selector size
  .long  1                           # Offset entry count
.Lrnglists_table_base0:
  .long .Ldebug_ranges0-.Lrnglists_table_base0
.Ldebug_ranges0:
  .byte 3                            # DW_RLE_startx_length
  .byte 0                            #   start index
  .uleb128 .Lfunc_end0-.Lfunc_begin0 #   length
  .byte 3                            # DW_RLE_startx_length
  .byte 1                            #   start index
  .uleb128 .Lfunc_end1-.Lfunc_begin1 #   length
  .byte 0                            # DW_RLE_end_of_list
.Ldebug_rnglist_table_end0:
.section .debug_addr,"",@progbits
  .long  20
  .short 5
  .byte  8
  .byte  0
.Laddr_table_base0:
  .quad .Lfunc_begin0
  .quad .Lfunc_begin1
 
     |