1## Test that yaml2obj emits .debug_ranges section. 2 3## a) Generate the .debug_ranges section from the "DWARF" entry. 4 5## Generate and verify a little endian .debug_ranges section. 6 7# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2LSB %s -o %t.le.o 8# RUN: llvm-readobj --sections --section-data %t.le.o | \ 9# RUN: FileCheck %s -DSIZE=120 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-LE-CONTENT 10 11# DWARF-HEADER: Index: 1 12# DWARF-HEADER-NEXT: Name: .debug_ranges (1) 13# DWARF-HEADER-NEXT: Type: SHT_PROGBITS (0x1) 14# DWARF-HEADER-NEXT: Flags [ (0x0) 15# DWARF-HEADER-NEXT: ] 16# DWARF-HEADER-NEXT: Address: 0x0 17# DWARF-HEADER-NEXT: Offset: 0x40 18# DWARF-HEADER-NEXT: Size: [[SIZE]] 19# DWARF-HEADER-NEXT: Link: 0 20# DWARF-HEADER-NEXT: Info: 0 21# DWARF-HEADER-NEXT: AddressAlignment: [[ADDRALIGN]] 22# DWARF-HEADER-NEXT: EntrySize: 0 23# DWARF-LE-CONTENT-NEXT: SectionData ( 24# DWARF-LE-CONTENT-NEXT: 0000: 10000000 20000000 30000000 40000000 25## | | | | 26## | | | +------- HighOffset (4-byte) 0x40 27## | | +------- LowOffset (4-byte) 0x30 28## | +------- HighOffset (4-byte) 0x20 29## +------- LowOffset (4-byte) 0x10 30## 31# DWARF-LE-CONTENT-NEXT: 0010: FFFFFFFF 10000000 00000000 00000000 32## | | | | 33## | | | +------- HighOffset (4-byte) 0x00 34## | | +------- LowOffset (4-byte) 0x00 35## | +------- Base Address (4-byte) 0x10 36## +------- Base Address Entry (4-byte) UINT32_MAX 37## 38# DWARF-LE-CONTENT-NEXT: 0020: 00000000 00000000 10000000 00000000 39## | | 40## | +---------------- LowOffset (8-byte) 0x10 41## +---------------- Terminating Entry (8-byte) 42## 43# DWARF-LE-CONTENT-NEXT: 0030: 20000000 00000000 30000000 00000000 44## | | 45## | +---------------- LowOffset (8-byte) 0x30 46## +---------------- HighOffset (8-byte) 0x20 47## 48# DWARF-LE-CONTENT-NEXT: 0040: 40000000 00000000 FFFFFFFF FFFFFFFF 49## | | 50## | +---------------- Base Address Entry (8-byte) UINT64_MAX 51## +---------------- HighOffset (8-byte) 0x40 52## 53# DWARF-LE-CONTENT-NEXT: 0050: 10000000 00000000 00000000 00000000 54## | | 55## | +---------------- LowOffset (8-byte) 0x00 56## +---------------- Base Address (8-byte) 0x10 57## 58# DWARF-LE-CONTENT-NEXT: 0060: 00000000 00000000 00000000 00000000 59## | | 60## | +---------------- Terminating Entry (16-byte) 61## +---------------- HighOffset (8-byte) 0x00 62## 63# DWARF-LE-CONTENT-NEXT: 0070: 00000000 00000000 64## | 65## +---------------- Terminating Entry (lower 8-byte) 66## 67# DWARF-LE-CONTENT-NEXT: ) 68 69--- !ELF 70FileHeader: 71 Class: ELFCLASS64 72 Data: [[ENDIAN]] 73 Type: ET_EXEC 74DWARF: 75 debug_ranges: 76 - AddrSize: 0x04 77 Entries: 78 - LowOffset: 0x00000010 79 HighOffset: 0x00000020 80 - LowOffset: 0x00000030 81 HighOffset: 0x00000040 82 - LowOffset: 0xffffffff 83 HighOffset: 0x00000010 84 - LowOffset: 0x00000000 85 HighOffset: 0x00000000 86 - Entries: 87 - LowOffset: 0x0000000000000010 88 HighOffset: 0x0000000000000020 89 - LowOffset: 0x0000000000000030 90 HighOffset: 0x0000000000000040 91 - LowOffset: 0xffffffffffffffff 92 HighOffset: 0x0000000000000010 93 - LowOffset: 0x0000000000000000 94 HighOffset: 0x0000000000000000 95 96## Generate and verify a big endian .debug_ranges section. 97 98# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2MSB %s -o %t.be.o 99# RUN: llvm-readobj --sections --section-data %t.be.o | \ 100# RUN: FileCheck %s -DSIZE=120 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-BE-CONTENT 101 102# DWARF-BE-CONTENT-NEXT: SectionData ( 103# DWARF-BE-CONTENT-NEXT: 0000: 00000010 00000020 00000030 00000040 104## | | | | 105## | | | +------- HighOffset (4-byte) 0x40 106## | | +------- LowOffset (4-byte) 0x30 107## | +------- HighOffset (4-byte) 0x20 108## +------- LowOffset (4-byte) 0x10 109## 110# DWARF-BE-CONTENT-NEXT: 0010: FFFFFFFF 00000010 00000000 00000000 111## | | | | 112## | | | +------- HighOffset (4-byte) 0x00 113## | | +------- LowOffset (4-byte) 0x00 114## | +------- Base Address (4-byte) 0x10 115## +------- Base Address Entry (4-byte) UINT32_MAX 116## 117# DWARF-BE-CONTENT-NEXT: 0020: 00000000 00000000 00000000 00000010 118## | | 119## | +---------------- LowOffset (8-byte) 0x10 120## +---------------- Terminating Entry (8-byte) 121## 122# DWARF-BE-CONTENT-NEXT: 0030: 00000000 00000020 00000000 00000030 123## | | 124## | +---------------- LowOffset (8-byte) 0x30 125## +---------------- HighOffset (8-byte) 0x20 126## 127# DWARF-BE-CONTENT-NEXT: 0040: 00000000 00000040 FFFFFFFF FFFFFFFF 128## | | 129## | +---------------- Base Address Entry (8-byte) UINT64_MAX 130## +---------------- HighOffset (8-byte) 0x40 131## 132# DWARF-BE-CONTENT-NEXT: 0050: 00000000 00000010 00000000 00000000 133## | | 134## | +---------------- LowOffset (8-byte) 0x00 135## +---------------- Base Address (8-byte) 0x10 136## 137# DWARF-BE-CONTENT-NEXT: 0060: 00000000 00000000 00000000 00000000 138## | | 139## | +---------------- Terminating Entry (16-byte) 140## +---------------- HighOffset (8-byte) 0x00 141## 142# DWARF-BE-CONTENT-NEXT: 0070: 00000000 00000000 143## | 144## +---------------- Terminating Entry (lower 8-byte) 145## 146# DWARF-BE-CONTENT-NEXT: ) 147 148## b) Generate the .debug_ranges section from raw section content. 149 150# RUN: yaml2obj --docnum=2 %s -o %t2.o 151# RUN: llvm-readobj --sections --section-data %t2.o | \ 152# RUN: FileCheck %s -DSIZE=3 -DADDRALIGN=0 --check-prefixes=DWARF-HEADER,ARBITRARY-CONTENT 153 154# ARBITRARY-CONTENT: SectionData ( 155# ARBITRARY-CONTENT-NEXT: 0000: 112233 156# ARBITRARY-CONTENT-NEXT: ) 157 158--- !ELF 159FileHeader: 160 Class: ELFCLASS64 161 Data: ELFDATA2LSB 162 Type: ET_EXEC 163Sections: 164 - Name: .debug_ranges 165 Type: SHT_PROGBITS 166 Content: "112233" 167 168## c) Generate the .debug_ranges section when the "Size" is specified. 169 170# RUN: yaml2obj --docnum=3 %s -o %t3.o 171# RUN: llvm-readobj --hex-dump=.debug_ranges %t3.o | FileCheck %s --check-prefix=SIZE 172 173# SIZE: Hex dump of section '.debug_ranges': 174# SIZE-NEXT: 0x00000000 00000000 00000000 00000000 00000000 ................ 175# SIZE-EMPTY: 176 177--- !ELF 178FileHeader: 179 Class: ELFCLASS64 180 Data: ELFDATA2LSB 181 Type: ET_EXEC 182Sections: 183 - Name: .debug_ranges 184 Type: SHT_PROGBITS 185 Size: 0x10 186 187## d) Test that yaml2obj emits an error message when both the "Size" and the 188## "debug_ranges" entry are specified at the same time. 189 190# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERROR 191 192# ERROR: yaml2obj: error: cannot specify section '.debug_ranges' contents in the 'DWARF' entry and the 'Content' or 'Size' in the 'Sections' entry at the same time 193 194--- !ELF 195FileHeader: 196 Class: ELFCLASS64 197 Data: ELFDATA2LSB 198 Type: ET_EXEC 199Sections: 200 - Name: .debug_ranges 201 Type: SHT_PROGBITS 202 Size: 0x10 203DWARF: 204 debug_ranges: 205 - Entries: 206 - LowOffset: 0x0000000000000001 207 HighOffset: 0x0000000000000002 208 209## e) Test that yaml2obj emits an error message when both the "Content" and the 210## "debug_ranges" entry are specified at the same time. 211 212# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=ERROR 213 214--- !ELF 215FileHeader: 216 Class: ELFCLASS64 217 Data: ELFDATA2LSB 218 Type: ET_EXEC 219Sections: 220 - Name: .debug_ranges 221 Type: SHT_PROGBITS 222 Content: "00" 223DWARF: 224 debug_ranges: 225 - Entries: 226 - LowOffset: 0x0000000000000001 227 HighOffset: 0x0000000000000002 228 229## f) Test that all the properties can be overridden by the section header when 230## the "debug_ranges" entry doesn't exist. 231 232# RUN: yaml2obj --docnum=6 %s -o %t6.o 233# RUN: llvm-readelf --sections %t6.o | FileCheck %s --check-prefix=OVERRIDDEN 234 235# OVERRIDDEN: [Nr] Name Type Address Off Size ES Flg Lk Inf Al 236# OVERRIDDEN: [ 1] .debug_ranges STRTAB 0000000000002020 000050 000020 01 A 2 1 2 237# OVERRIDDEN-NEXT: [ 2] .sec STRTAB 0000000000000000 000070 000000 00 0 0 0 238 239--- !ELF 240FileHeader: 241 Class: ELFCLASS64 242 Data: ELFDATA2LSB 243 Type: ET_EXEC 244Sections: 245 - Name: .debug_ranges 246 Type: SHT_STRTAB # SHT_PROGBITS by default. 247 Flags: [SHF_ALLOC] # 0 by default. 248 Link: .sec # 0 by default. 249 EntSize: 1 # 0 by default. 250 Info: 1 # 0 by default. 251 AddressAlign: 2 # 0 by default. 252 Address: 0x2020 # 0x00 by default. 253 Offset: 0x50 # 0x40 for the first section. 254 Size: 0x20 # Set the "Size" so that we can reuse the check tag "OVERRIDDEN". 255 - Name: .sec # Linked by .debug_ranges. 256 Type: SHT_STRTAB 257 258## g) Test that all the properties can be overridden by the section header when 259## the "debug_ranges" entry exists. 260 261# RUN: yaml2obj --docnum=7 %s -o %t7.o 262# RUN: llvm-readelf --sections %t7.o | FileCheck %s --check-prefix=OVERRIDDEN 263 264--- !ELF 265FileHeader: 266 Class: ELFCLASS64 267 Data: ELFDATA2LSB 268 Type: ET_EXEC 269Sections: 270 - Name: .debug_ranges 271 Type: SHT_STRTAB # SHT_PROGBITS by default. 272 Flags: [SHF_ALLOC] # 0 by default. 273 Link: .sec # 0 by default. 274 EntSize: 1 # 0 by default. 275 Info: 1 # 0 by default. 276 AddressAlign: 2 # 1 by default. 277 Address: 0x2020 # 0x00 by default. 278 Offset: 0x50 # 0x40 for the first section. 279 - Name: .sec # Linked by .debug_ranges. 280 Type: SHT_STRTAB 281DWARF: 282 debug_ranges: 283 - Entries: 284 - LowOffset: 0x0000000000000001 285 HighOffset: 0x0000000000000002 286 287## h) Test that yaml2obj automatically pads zeros if we try to assign an offset that 288## is greater than or equal to the number of bytes written already. 289 290# RUN: yaml2obj --docnum=8 %s -o %t8.o 291# RUN: llvm-readelf --hex-dump=.debug_ranges %t8.o | FileCheck %s --check-prefix=PADDED 292 293# PADDED: Hex dump of section '.debug_ranges': 294# PADDED-NEXT: 0x00000000 01000000 00000000 02000000 00000000 295## | | 296## | +---------------- HighOffset (8-byte) 0x02 297## +---------------- LowOffset (8-byte) 0x01 298## 299# PADDED-NEXT: 0x00000010 00000000 00000000 00000000 00000000 300## | 301## +---------------------------------- Terminating Entry (16-byte) 0x00 302## 303# PADDED-NEXT: 0x00000020 00010000 00000000 00020000 00000000 304## | | | 305## | | +------------- HighOffset (8-byte) 0x02 306## | +----------------- LowOffset (8-byte) 0x01 307## +- Padded zeros (1-byte) 0x00 308## 309# PADDED-NEXT: 0x00000030 00000000 00000000 00000000 00000000 310## | | 311## | +-------------------------------- Terminating Entry (16-byte) 0x00 312## +- higher byte(s) of HighOffset 313## 314# PADDED-NEXT: 0x00000040 00010000 00000000 00020000 00000000 315## | | | 316## | | +-------------- HighOffset (8-byte) 0x02 317## | +----------------- LowOffset (8-byte) 0x01 318## +- the last byte of terminating entry. 319## 320# PADDED-NEXT: 0x00000050 00000000 00000000 00000000 00000000 321## | | 322## | +-------------------------------- Terminating Entry (16-byte) 0x00 323## +- higher byte(s) of HighOffset 324## 325# PADDED-NEXT: 0x00000060 00 326## | 327## +- the last byte of terminating entry. 328 329--- !ELF 330FileHeader: 331 Class: ELFCLASS64 332 Data: ELFDATA2LSB 333 Type: ET_EXEC 334DWARF: 335 debug_ranges: 336 - Entries: 337 - LowOffset: 0x01 338 HighOffset: 0x02 339 - Offset: 0x21 ## There are 0x20 bytes before this entry. 340 Entries: 341 - LowOffset: 0x01 342 HighOffset: 0x02 343 - Offset: 0x41 ## There are 0x41 bytes before this entry. 344 Entries: 345 - LowOffset: 0x01 346 HighOffset: 0x02 347 348## i) Test that yaml2obj emits an error message if we try to assign an invalid offset to an 349## entry of the '.debug_ranges' section. 350 351# RUN: not yaml2obj --docnum=9 %s -o %t9.o 2>&1 | FileCheck %s --check-prefix=INVALID-OFFSET 352 353# INVALID-OFFSET: yaml2obj: error: 'Offset' for 'debug_ranges' with index 1 must be greater than or equal to the number of bytes written already (0x20) 354 355--- !ELF 356FileHeader: 357 Class: ELFCLASS64 358 Data: ELFDATA2LSB 359 Type: ET_EXEC 360DWARF: 361 debug_ranges: 362 - Entries: 363 - LowOffset: 0x01 364 HighOffset: 0x02 365 - Offset: 0x1F ## Must be greater than or equal to 0x20. 366 Entries: 367 - LowOffset: 0x01 368 HighOffset: 0x02 369 370## j) Test that yaml2obj still generates a .debug_ranges section if we assign an invalid value 371## to 'AddrSize' when the 'Entries' list is empty. 372 373# RUN: yaml2obj --docnum=10 %s -o %t10.o 374# RUN: llvm-readelf --hex-dump=.debug_ranges %t10.o | \ 375# RUN: FileCheck %s --check-prefix=ADDRSIZE 376 377# ADDRSIZE: Hex dump of section '.debug_ranges': 378# ADDRSIZE-NEXT: 0x00000000 00000000 00000000 00000000 0000 379## ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ terminating entry (2*AddrSize=14-byte) 380 381--- !ELF 382FileHeader: 383 Class: ELFCLASS64 384 Data: ELFDATA2LSB 385 Type: ET_EXEC 386DWARF: 387 debug_ranges: 388 - AddrSize: 0x07 389 Entries: [] 390 391## k) Test that yaml2obj emits an error message if we try to assign an invalid value to 392## 'AddrSize' when the 'Entries' list isn't empty. 393 394# RUN: not yaml2obj --docnum=11 %s 2>&1 | \ 395# RUN: FileCheck %s --check-prefix=INVALID-SIZE 396 397# INVALID-SIZE: yaml2obj: error: unable to write debug_ranges address offset: invalid integer write size: 7 398 399--- !ELF 400FileHeader: 401 Class: ELFCLASS64 402 Data: ELFDATA2LSB 403 Type: ET_EXEC 404DWARF: 405 debug_ranges: 406 - AddrSize: 0x07 407 Entries: 408 - LowOffset: 0x1234 409 HighOffset: 0x5678 410 411## l) Test that the .debug_ranges section header is emitted if the "debug_ranges" 412## entry is empty. 413 414# RUN: yaml2obj --docnum=12 %s -o %t12.o 415# RUN: llvm-readobj -S %t12.o | FileCheck -DSIZE=0 -DADDRALIGN=1 %s --check-prefix=DWARF-HEADER 416 417--- !ELF 418FileHeader: 419 Class: ELFCLASS64 420 Data: ELFDATA2LSB 421 Type: ET_EXEC 422DWARF: 423 debug_ranges: [] 424