## Test that yaml2obj emits .debug_ranges section. ## a) Generate the .debug_ranges section from the "DWARF" entry. ## Generate and verify a little endian .debug_ranges section. # RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2LSB %s -o %t.le.o # RUN: llvm-readobj --sections --section-data %t.le.o | \ # RUN: FileCheck %s -DSIZE=120 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-LE-CONTENT # DWARF-HEADER: Index: 1 # DWARF-HEADER-NEXT: Name: .debug_ranges (1) # DWARF-HEADER-NEXT: Type: SHT_PROGBITS (0x1) # DWARF-HEADER-NEXT: Flags [ (0x0) # DWARF-HEADER-NEXT: ] # DWARF-HEADER-NEXT: Address: 0x0 # DWARF-HEADER-NEXT: Offset: 0x40 # DWARF-HEADER-NEXT: Size: [[SIZE]] # DWARF-HEADER-NEXT: Link: 0 # DWARF-HEADER-NEXT: Info: 0 # DWARF-HEADER-NEXT: AddressAlignment: [[ADDRALIGN]] # DWARF-HEADER-NEXT: EntrySize: 0 # DWARF-LE-CONTENT-NEXT: SectionData ( # DWARF-LE-CONTENT-NEXT: 0000: 10000000 20000000 30000000 40000000 ## | | | | ## | | | +------- HighOffset (4-byte) 0x40 ## | | +------- LowOffset (4-byte) 0x30 ## | +------- HighOffset (4-byte) 0x20 ## +------- LowOffset (4-byte) 0x10 ## # DWARF-LE-CONTENT-NEXT: 0010: FFFFFFFF 10000000 00000000 00000000 ## | | | | ## | | | +------- HighOffset (4-byte) 0x00 ## | | +------- LowOffset (4-byte) 0x00 ## | +------- Base Address (4-byte) 0x10 ## +------- Base Address Entry (4-byte) UINT32_MAX ## # DWARF-LE-CONTENT-NEXT: 0020: 00000000 00000000 10000000 00000000 ## | | ## | +---------------- LowOffset (8-byte) 0x10 ## +---------------- Terminating Entry (8-byte) ## # DWARF-LE-CONTENT-NEXT: 0030: 20000000 00000000 30000000 00000000 ## | | ## | +---------------- LowOffset (8-byte) 0x30 ## +---------------- HighOffset (8-byte) 0x20 ## # DWARF-LE-CONTENT-NEXT: 0040: 40000000 00000000 FFFFFFFF FFFFFFFF ## | | ## | +---------------- Base Address Entry (8-byte) UINT64_MAX ## +---------------- HighOffset (8-byte) 0x40 ## # DWARF-LE-CONTENT-NEXT: 0050: 10000000 00000000 00000000 00000000 ## | | ## | +---------------- LowOffset (8-byte) 0x00 ## +---------------- Base Address (8-byte) 0x10 ## # DWARF-LE-CONTENT-NEXT: 0060: 00000000 00000000 00000000 00000000 ## | | ## | +---------------- Terminating Entry (16-byte) ## +---------------- HighOffset (8-byte) 0x00 ## # DWARF-LE-CONTENT-NEXT: 0070: 00000000 00000000 ## | ## +---------------- Terminating Entry (lower 8-byte) ## # DWARF-LE-CONTENT-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: [[ENDIAN]] Type: ET_EXEC DWARF: debug_ranges: - AddrSize: 0x04 Entries: - LowOffset: 0x00000010 HighOffset: 0x00000020 - LowOffset: 0x00000030 HighOffset: 0x00000040 - LowOffset: 0xffffffff HighOffset: 0x00000010 - LowOffset: 0x00000000 HighOffset: 0x00000000 - Entries: - LowOffset: 0x0000000000000010 HighOffset: 0x0000000000000020 - LowOffset: 0x0000000000000030 HighOffset: 0x0000000000000040 - LowOffset: 0xffffffffffffffff HighOffset: 0x0000000000000010 - LowOffset: 0x0000000000000000 HighOffset: 0x0000000000000000 ## Generate and verify a big endian .debug_ranges section. # RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2MSB %s -o %t.be.o # RUN: llvm-readobj --sections --section-data %t.be.o | \ # RUN: FileCheck %s -DSIZE=120 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-BE-CONTENT # DWARF-BE-CONTENT-NEXT: SectionData ( # DWARF-BE-CONTENT-NEXT: 0000: 00000010 00000020 00000030 00000040 ## | | | | ## | | | +------- HighOffset (4-byte) 0x40 ## | | +------- LowOffset (4-byte) 0x30 ## | +------- HighOffset (4-byte) 0x20 ## +------- LowOffset (4-byte) 0x10 ## # DWARF-BE-CONTENT-NEXT: 0010: FFFFFFFF 00000010 00000000 00000000 ## | | | | ## | | | +------- HighOffset (4-byte) 0x00 ## | | +------- LowOffset (4-byte) 0x00 ## | +------- Base Address (4-byte) 0x10 ## +------- Base Address Entry (4-byte) UINT32_MAX ## # DWARF-BE-CONTENT-NEXT: 0020: 00000000 00000000 00000000 00000010 ## | | ## | +---------------- LowOffset (8-byte) 0x10 ## +---------------- Terminating Entry (8-byte) ## # DWARF-BE-CONTENT-NEXT: 0030: 00000000 00000020 00000000 00000030 ## | | ## | +---------------- LowOffset (8-byte) 0x30 ## +---------------- HighOffset (8-byte) 0x20 ## # DWARF-BE-CONTENT-NEXT: 0040: 00000000 00000040 FFFFFFFF FFFFFFFF ## | | ## | +---------------- Base Address Entry (8-byte) UINT64_MAX ## +---------------- HighOffset (8-byte) 0x40 ## # DWARF-BE-CONTENT-NEXT: 0050: 00000000 00000010 00000000 00000000 ## | | ## | +---------------- LowOffset (8-byte) 0x00 ## +---------------- Base Address (8-byte) 0x10 ## # DWARF-BE-CONTENT-NEXT: 0060: 00000000 00000000 00000000 00000000 ## | | ## | +---------------- Terminating Entry (16-byte) ## +---------------- HighOffset (8-byte) 0x00 ## # DWARF-BE-CONTENT-NEXT: 0070: 00000000 00000000 ## | ## +---------------- Terminating Entry (lower 8-byte) ## # DWARF-BE-CONTENT-NEXT: ) ## b) Generate the .debug_ranges section from raw section content. # RUN: yaml2obj --docnum=2 %s -o %t2.o # RUN: llvm-readobj --sections --section-data %t2.o | \ # RUN: FileCheck %s -DSIZE=3 -DADDRALIGN=0 --check-prefixes=DWARF-HEADER,ARBITRARY-CONTENT # ARBITRARY-CONTENT: SectionData ( # ARBITRARY-CONTENT-NEXT: 0000: 112233 # ARBITRARY-CONTENT-NEXT: ) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_PROGBITS Content: "112233" ## c) Generate the .debug_ranges section when the "Size" is specified. # RUN: yaml2obj --docnum=3 %s -o %t3.o # RUN: llvm-readobj --hex-dump=.debug_ranges %t3.o | FileCheck %s --check-prefix=SIZE # SIZE: Hex dump of section '.debug_ranges': # SIZE-NEXT: 0x00000000 00000000 00000000 00000000 00000000 ................ # SIZE-EMPTY: --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_PROGBITS Size: 0x10 ## d) Test that yaml2obj emits an error message when both the "Size" and the ## "debug_ranges" entry are specified at the same time. # RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERROR # 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 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_PROGBITS Size: 0x10 DWARF: debug_ranges: - Entries: - LowOffset: 0x0000000000000001 HighOffset: 0x0000000000000002 ## e) Test that yaml2obj emits an error message when both the "Content" and the ## "debug_ranges" entry are specified at the same time. # RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=ERROR --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_PROGBITS Content: "00" DWARF: debug_ranges: - Entries: - LowOffset: 0x0000000000000001 HighOffset: 0x0000000000000002 ## f) Test that all the properties can be overridden by the section header when ## the "debug_ranges" entry doesn't exist. # RUN: yaml2obj --docnum=6 %s -o %t6.o # RUN: llvm-readelf --sections %t6.o | FileCheck %s --check-prefix=OVERRIDDEN # OVERRIDDEN: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # OVERRIDDEN: [ 1] .debug_ranges STRTAB 0000000000002020 000050 000020 01 A 2 1 2 # OVERRIDDEN-NEXT: [ 2] .sec STRTAB 0000000000000000 000070 000000 00 0 0 0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_STRTAB # SHT_PROGBITS by default. Flags: [SHF_ALLOC] # 0 by default. Link: .sec # 0 by default. EntSize: 1 # 0 by default. Info: 1 # 0 by default. AddressAlign: 2 # 0 by default. Address: 0x2020 # 0x00 by default. Offset: 0x50 # 0x40 for the first section. Size: 0x20 # Set the "Size" so that we can reuse the check tag "OVERRIDDEN". - Name: .sec # Linked by .debug_ranges. Type: SHT_STRTAB ## g) Test that all the properties can be overridden by the section header when ## the "debug_ranges" entry exists. # RUN: yaml2obj --docnum=7 %s -o %t7.o # RUN: llvm-readelf --sections %t7.o | FileCheck %s --check-prefix=OVERRIDDEN --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .debug_ranges Type: SHT_STRTAB # SHT_PROGBITS by default. Flags: [SHF_ALLOC] # 0 by default. Link: .sec # 0 by default. EntSize: 1 # 0 by default. Info: 1 # 0 by default. AddressAlign: 2 # 1 by default. Address: 0x2020 # 0x00 by default. Offset: 0x50 # 0x40 for the first section. - Name: .sec # Linked by .debug_ranges. Type: SHT_STRTAB DWARF: debug_ranges: - Entries: - LowOffset: 0x0000000000000001 HighOffset: 0x0000000000000002 ## h) Test that yaml2obj automatically pads zeros if we try to assign an offset that ## is greater than or equal to the number of bytes written already. # RUN: yaml2obj --docnum=8 %s -o %t8.o # RUN: llvm-readelf --hex-dump=.debug_ranges %t8.o | FileCheck %s --check-prefix=PADDED # PADDED: Hex dump of section '.debug_ranges': # PADDED-NEXT: 0x00000000 01000000 00000000 02000000 00000000 ## | | ## | +---------------- HighOffset (8-byte) 0x02 ## +---------------- LowOffset (8-byte) 0x01 ## # PADDED-NEXT: 0x00000010 00000000 00000000 00000000 00000000 ## | ## +---------------------------------- Terminating Entry (16-byte) 0x00 ## # PADDED-NEXT: 0x00000020 00010000 00000000 00020000 00000000 ## | | | ## | | +------------- HighOffset (8-byte) 0x02 ## | +----------------- LowOffset (8-byte) 0x01 ## +- Padded zeros (1-byte) 0x00 ## # PADDED-NEXT: 0x00000030 00000000 00000000 00000000 00000000 ## | | ## | +-------------------------------- Terminating Entry (16-byte) 0x00 ## +- higher byte(s) of HighOffset ## # PADDED-NEXT: 0x00000040 00010000 00000000 00020000 00000000 ## | | | ## | | +-------------- HighOffset (8-byte) 0x02 ## | +----------------- LowOffset (8-byte) 0x01 ## +- the last byte of terminating entry. ## # PADDED-NEXT: 0x00000050 00000000 00000000 00000000 00000000 ## | | ## | +-------------------------------- Terminating Entry (16-byte) 0x00 ## +- higher byte(s) of HighOffset ## # PADDED-NEXT: 0x00000060 00 ## | ## +- the last byte of terminating entry. --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC DWARF: debug_ranges: - Entries: - LowOffset: 0x01 HighOffset: 0x02 - Offset: 0x21 ## There are 0x20 bytes before this entry. Entries: - LowOffset: 0x01 HighOffset: 0x02 - Offset: 0x41 ## There are 0x41 bytes before this entry. Entries: - LowOffset: 0x01 HighOffset: 0x02 ## i) Test that yaml2obj emits an error message if we try to assign an invalid offset to an ## entry of the '.debug_ranges' section. # RUN: not yaml2obj --docnum=9 %s -o %t9.o 2>&1 | FileCheck %s --check-prefix=INVALID-OFFSET # 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) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC DWARF: debug_ranges: - Entries: - LowOffset: 0x01 HighOffset: 0x02 - Offset: 0x1F ## Must be greater than or equal to 0x20. Entries: - LowOffset: 0x01 HighOffset: 0x02 ## j) Test that yaml2obj still generates a .debug_ranges section if we assign an invalid value ## to 'AddrSize' when the 'Entries' list is empty. # RUN: yaml2obj --docnum=10 %s -o %t10.o # RUN: llvm-readelf --hex-dump=.debug_ranges %t10.o | \ # RUN: FileCheck %s --check-prefix=ADDRSIZE # ADDRSIZE: Hex dump of section '.debug_ranges': # ADDRSIZE-NEXT: 0x00000000 00000000 00000000 00000000 0000 ## ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ terminating entry (2*AddrSize=14-byte) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC DWARF: debug_ranges: - AddrSize: 0x07 Entries: [] ## k) Test that yaml2obj emits an error message if we try to assign an invalid value to ## 'AddrSize' when the 'Entries' list isn't empty. # RUN: not yaml2obj --docnum=11 %s 2>&1 | \ # RUN: FileCheck %s --check-prefix=INVALID-SIZE # INVALID-SIZE: yaml2obj: error: unable to write debug_ranges address offset: invalid integer write size: 7 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC DWARF: debug_ranges: - AddrSize: 0x07 Entries: - LowOffset: 0x1234 HighOffset: 0x5678 ## l) Test that the .debug_ranges section header is emitted if the "debug_ranges" ## entry is empty. # RUN: yaml2obj --docnum=12 %s -o %t12.o # RUN: llvm-readobj -S %t12.o | FileCheck -DSIZE=0 -DADDRALIGN=1 %s --check-prefix=DWARF-HEADER --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC DWARF: debug_ranges: []