Currently we have to set 'Machine' to something in our YAML descriptions. Usually we use 'EM_X86_64' for 64-bit targets and 'EM_386' for 32-bit targets. At the same time, in fact, in most cases our tests do not need a machine type and we can use 'EM_NONE'. This is cleaner, because avoids the need of using a particular machine. In this patch I've made the 'Machine' key optional (the default value, when it is not specified is `EM_NONE`) and removed it (where possible) from yaml2obj, obj2yaml and llvm-readobj tests. There are few tests left where I decided not to remove it, because I didn't want to touch CHECK lines or doing anything more complex than a removing a "Machine: *" line and formatting lines around. Differential revision: https://reviews.llvm.org/D86202
132 lines
4.5 KiB
YAML
132 lines
4.5 KiB
YAML
## Check how obj2yaml produces SHT_GNU_HASH section descriptions.
|
|
|
|
## Check that obj2yaml uses "Header", "BloomFilter", "HashBuckets" and "HashValues"
|
|
## tags to describe a SHT_GNU_HASH section when it has content of a correct size.
|
|
|
|
# RUN: yaml2obj --docnum=1 %s -o %t1
|
|
# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=FIELDS
|
|
|
|
# FIELDS: - Name: .gnu.hash
|
|
# FIELDS-NEXT: Type: SHT_GNU_HASH
|
|
# FIELDS-NEXT: Flags: [ SHF_ALLOC ]
|
|
# FIELDS-NEXT: Header:
|
|
# FIELDS-NEXT: SymNdx: 0x00000001
|
|
# FIELDS-NEXT: Shift2: 0x00000002
|
|
# FIELDS-NEXT: BloomFilter: [ 0x0000000000000003, 0x0000000000000004 ]
|
|
# FIELDS-NEXT: HashBuckets: [ 0x00000005, 0x00000006, 0x00000007 ]
|
|
# FIELDS-NEXT: HashValues: [ 0x00000008, 0x00000009, 0x0000000A, 0x0000000B ]
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Sections:
|
|
- Name: .gnu.hash
|
|
Type: SHT_GNU_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Header:
|
|
SymNdx: 0x1
|
|
Shift2: 0x2
|
|
BloomFilter: [0x3, 0x4]
|
|
HashBuckets: [0x5, 0x6, 0x7]
|
|
HashValues: [0x8, 0x9, 0xA, 0xB]
|
|
|
|
## Check how we handle broken cases.
|
|
|
|
# RUN: yaml2obj --docnum=2 %s -o %t2
|
|
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=INVALID
|
|
|
|
# INVALID: - Name: .gnu.hash.tooshort
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Flags: [ SHF_ALLOC ]
|
|
# INVALID-NEXT: Content: 112233445566778899AABBCCDDEEFF
|
|
# INVALID-NEXT: - Name: .gnu.hash.empty
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Flags: [ SHF_ALLOC ]
|
|
# INVALID-NEXT: Address: 0x000000000000000F
|
|
# INVALID-NEXT: Header:
|
|
# INVALID-NEXT: SymNdx: 0x00000000
|
|
# INVALID-NEXT: Shift2: 0x00000000
|
|
# INVALID-NEXT: BloomFilter: [ ]
|
|
# INVALID-NEXT: HashBuckets: [ ]
|
|
# INVALID-NEXT: HashValues: [ ]
|
|
# INVALID-NEXT: - Name: .gnu.hash.broken.maskwords
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Content: '00000000000000000100000000000000'
|
|
# INVALID-NEXT: - Name: .gnu.hash.broken.nbuckets
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Content: '01000000000000000000000000000000'
|
|
# INVALID-NEXT: - Name: .gnu.hash.hashvalues.ok
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Header:
|
|
# INVALID-NEXT: SymNdx: 0x00000000
|
|
# INVALID-NEXT: Shift2: 0x00000000
|
|
# INVALID-NEXT: BloomFilter: [ ]
|
|
# INVALID-NEXT: HashBuckets: [ ]
|
|
# INVALID-NEXT: HashValues: [ 0x00000000 ]
|
|
# INVALID-NEXT: - Name: .gnu.hash.hashvalues.fail
|
|
# INVALID-NEXT: Type: SHT_GNU_HASH
|
|
# INVALID-NEXT: Content: '000000000000000000000000000000000000000000'
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Sections:
|
|
## Case 1: Content is less than 16 bytes.
|
|
- Name: .gnu.hash.tooshort
|
|
Type: SHT_GNU_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Content: "112233445566778899AABBCCDDEEFF"
|
|
## Case2: Check how we handle a fully empty hash section.
|
|
## It is almost technically valid, but uncommon. Modern linkers
|
|
## create at least one entry in Bloom filter if they want to disable it.
|
|
## Also, the dynamic symbol table has a null entry and having SymNdx = 0
|
|
## here is at least strange.
|
|
- Name: .gnu.hash.empty
|
|
Type: SHT_GNU_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Header:
|
|
SymNdx: 0x0
|
|
Shift2: 0x0
|
|
MaskWords: 0x0
|
|
NBuckets: 0x0
|
|
BloomFilter: []
|
|
HashBuckets: []
|
|
HashValues: []
|
|
## Case 3: MaskWords field is broken: it says that the number of entries
|
|
## in the Bloom filter is 1, but the Bloom filter is empty.
|
|
- Name: .gnu.hash.broken.maskwords
|
|
Type: SHT_GNU_HASH
|
|
Header:
|
|
SymNdx: 0x0
|
|
Shift2: 0x0
|
|
MaskWords: 0x1
|
|
NBuckets: 0x0
|
|
BloomFilter: []
|
|
HashBuckets: []
|
|
HashValues: []
|
|
## Case 4: NBuckets field is broken, it says that the number of entries
|
|
## in the hash buckets is 1, but it is empty.
|
|
- Name: .gnu.hash.broken.nbuckets
|
|
Type: SHT_GNU_HASH
|
|
Header:
|
|
SymNdx: 0x0
|
|
Shift2: 0x0
|
|
MaskWords: 0x0
|
|
NBuckets: 0x1
|
|
BloomFilter: []
|
|
HashBuckets: []
|
|
HashValues: []
|
|
## Case 5: Check that we use the various properties to dump the data when it
|
|
## has a size that is a multiple of 4, but fallback to dumping the whole section
|
|
## using the "Content" property otherwise.
|
|
- Name: .gnu.hash.hashvalues.ok
|
|
Type: SHT_GNU_HASH
|
|
Content: "0000000000000000000000000000000000000000"
|
|
- Name: .gnu.hash.hashvalues.fail
|
|
Type: SHT_GNU_HASH
|
|
Content: "000000000000000000000000000000000000000000"
|