[clang] Propagate -ftime-report to offload lto (#122143)
[llvm-project.git] / llvm / test / tools / llvm-readobj / ELF / hash-table.test
blobdb68ebdbcc6e073a3f4012230243cfc775ef1aa6
1 ## Check how the SHT_HASH section is dumped with --hash-table.
3 # RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64
4 # RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32
6 # RUN: llvm-readobj --hash-table %t.x64 | FileCheck %s --check-prefix=HASH
7 # RUN: llvm-readelf --hash-table %t.x64 | FileCheck %s --check-prefix=HASH
9 # RUN: llvm-readobj --hash-table %t.x32 | FileCheck %s --check-prefix=HASH
10 # RUN: llvm-readelf --hash-table %t.x32 | FileCheck %s --check-prefix=HASH
12 # HASH:      HashTable {
13 # HASH-NEXT:   Num Buckets: 2
14 # HASH-NEXT:   Num Chains: 3
15 # HASH-NEXT:   Buckets: [1, 2]
16 # HASH-NEXT:   Chains: [3, 4, 5]
17 # HASH-NEXT: }
19 --- !ELF
20 FileHeader:
21   Class:   ELFCLASS[[BITS=64]]
22   Data:    ELFDATA2LSB
23   Type:    ET_DYN
24   Machine: [[MACHINE]]
25 Sections:
26   - Name:    .hash
27     Type:    SHT_HASH
28     Flags:   [ SHF_ALLOC ]
29     Bucket:  [ 1, 2 ]
30     Chain:   [ 3, 4, 5 ]
31     EntSize: [[ENTSIZE=4]]
32   - Name:  .dynamic
33     Type:  SHT_DYNAMIC
34     Flags: [ SHF_ALLOC ]
35     Entries:
36       - Tag:   DT_HASH
37         Value: 0x0
38       - Tag:   DT_NULL
39         Value: 0x0
40 ProgramHeaders:
41   - Type:     PT_LOAD
42     FirstSec: .hash
43     LastSec:  .dynamic
45 ## Document that we ignore the sh_entsize value when dumping the hash section.
46 ## Implementation assumes that the size of entries is 4, matching the ELF specification.
48 # RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64.ent8
49 # RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32.ent8
51 # RUN: llvm-readobj --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH
52 # RUN: llvm-readelf --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH
53 # RUN: llvm-readobj --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH
54 # RUN: llvm-readelf --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH
56 ## We don't support dumping hash tables on EM_S390 and EM_ALPHA platforms and report a warning.
57 ## On these platforms the size of entries is 8, which violates the ELF specification, which says that the size
58 ## of hash entries in the hash table must be 4.
60 # RUN: yaml2obj --docnum=1 -DMACHINE=EM_S390 %s -o %t.s390
61 # RUN: llvm-readobj --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390"
62 # RUN: llvm-readelf --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390"
64 # WARN-HASH:      HashTable {
65 # WARN-HASH-NEXT: warning: '[[FILE]]': the hash table at 0x78 is not supported: it contains non-standard 8 byte entries on [[NAME]] platform
66 # WARN-HASH-NEXT: }
68 # RUN: yaml2obj --docnum=1 -DMACHINE=EM_ALPHA %s -o %t.alpha
69 # RUN: llvm-readobj --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA"
70 # RUN: llvm-readelf --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA"
72 ## We don't report warnings about the unsupported hash table on EM_S390 and EM_ALPHA platforms
73 ## when --hash-table is not requested.
75 # RUN: llvm-readobj %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:"
76 # RUN: llvm-readelf %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:"
77 # RUN: llvm-readobj %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:"
78 # RUN: llvm-readelf %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:"
80 ## Check we can dump the SHT_HASH section even when an object
81 ## does not have the section header table.
83 # RUN: yaml2obj --docnum=2 -DNOHEADERS=true %s -o %t.noshdr
84 # RUN: llvm-readobj --hash-table %t.noshdr 2>&1 | \
85 # RUN:   FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning:
86 # RUN: llvm-readelf --hash-table %t.noshdr 2>&1 | \
87 # RUN:   FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning:
89 # NOSHDR:      HashTable {
90 # NOSHDR-NEXT:   Num Buckets: 1
91 # NOSHDR-NEXT:   Num Chains: 1
92 # NOSHDR-NEXT:   Buckets: [0]
93 # NOSHDR-NEXT:   Chains: [1]
94 # NOSHDR-NEXT: }
96 --- !ELF
97 FileHeader:
98   Class: ELFCLASS64
99   Data:  ELFDATA2LSB
100   Type:  ET_DYN
101 Sections:
102   - Name:   .hash
103     Type:   SHT_HASH
104     Flags:  [ SHF_ALLOC ]
105     Bucket: [ 0 ]
106     Chain:  [ 1 ]
107     EntSize: [[ENTSIZE=4]]
108   - Name:  .dynamic
109     Type:  SHT_DYNAMIC
110     Flags: [ SHF_ALLOC ]
111     Entries:
112       - Tag:   [[DYNTAG=DT_HASH]]
113         Value: 0x0
114       - Tag:   DT_NULL
115         Value: 0x0
116   - Type: SectionHeaderTable
117     NoHeaders: [[NOHEADERS=false]]
118 ProgramHeaders:
119   - Type:     PT_LOAD
120     FirstSec: .hash
121     LastSec:  .dynamic
122   - Type:     PT_DYNAMIC
123     VAddr:    0x10
124     FirstSec: .dynamic
125     LastSec:  .dynamic
127 ## Document we don't report a warning when the value of the sh_entsize field of the SHT_HASH section is not 4.
129 # RUN: yaml2obj --docnum=2 -DENTSIZE=0xff %s -o %t.ent.size
130 # RUN: llvm-readobj --hash-table %t.ent.size 2>&1 | \
131 # RUN:   FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning:
132 # RUN: llvm-readelf --hash-table %t.ent.size 2>&1 | \
133 # RUN:   FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning:
135 ## Document we need the DT_HASH dynamic tag to locate the hash table.
137 # RUN: yaml2obj --docnum=2 -DDYNTAG=DT_NULL %s -o %t.no.dyntag
138 # RUN: llvm-readobj --hash-table %t.no.dyntag 2>&1 | \
139 # RUN:   FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning:
140 # RUN: llvm-readelf --hash-table %t.no.dyntag 2>&1 | \
141 # RUN:   FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning:
143 # NODYNTAG:      HashTable {
144 # NODYNTAG-NEXT: }
146 ## Each SHT_HASH section starts with two 32-bit fields: nbucket and nchain.
147 ## Check we report an error when a DT_HASH value points to data that has size less than 8 bytes.
149 # RUN: yaml2obj --docnum=3 %s -o %t4.o
150 # RUN: llvm-readelf --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o
151 # RUN: llvm-readobj --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o
153 # ERR1:      HashTable {
154 # ERR1-NEXT:  warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8){{$}}
155 # ERR1-NEXT: }
157 --- !ELF
158 FileHeader:
159   Class: ELFCLASS64
160   Data:  ELFDATA2LSB
161   Type:  ET_DYN
162 Sections:
163   - Name:   .hash
164     Type:   SHT_HASH
165     Flags:  [ SHF_ALLOC ]
166     Bucket: [ 0 ]
167     Chain:  [ 0 ]
168   - Name:  .dynamic
169     Type:  SHT_DYNAMIC
170     Flags: [ SHF_WRITE, SHF_ALLOC ]
171     Entries:
172       - Tag:   DT_HASH
173         Value: 0x239
174       - Tag:   DT_NULL
175         Value: 0x0
176 DynamicSymbols: []
177 ProgramHeaders:
178   - Type:     PT_LOAD
179     FileSize: 0x23a
180     FirstSec: .hash
181     LastSec:  .dynamic
183 ## Check we report a warning when the hash table goes past the end of the file.
185 ## Case A.1: the hash table ends right before the EOF. We have a broken nbucket
186 ##           field that has a value larger than the number of buckets.
187 # RUN: yaml2obj --docnum=4 %s -o %t5.1.o -DNBUCKET=0x5d -DNCHAIN=0x1
188 # RUN: llvm-readelf --hash-table %t5.1.o 2>&1 | \
189 # RUN:   FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"
190 # RUN: llvm-readobj --hash-table %t5.1.o 2>&1 | \
191 # RUN:   FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"
193 # NOERR1:      HashTable {
194 # NOERR1-NEXT:  Num Buckets: 93
195 # NOERR1-NEXT:  Num Chains: 1
196 ## Here we would dump the rest of the file as buckets array because we have a broken nbucket field.
197 ## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.
198 # NOERR1-NEXT:  Buckets:
199 # NOERR1-NEXT:  Chains: [0]
200 # NOERR1-NEXT: }
202 ## Case A.2: the hash table ends 1 byte past the EOF. We have a broken nbucket
203 ##           field that has a value larger than the number of buckets.
204 # RUN: yaml2obj --docnum=4 %s -o %t5.2.o -DNBUCKET=0x5e -DNCHAIN=0x1
205 # RUN: llvm-readelf --hash-table %t5.2.o 2>&1 | \
206 # RUN:   FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"
207 # RUN: llvm-readobj --hash-table %t5.2.o 2>&1 | \
208 # RUN:   FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"
210 # ERR2:      HashTable {
211 # ERR2:       Num Buckets: 94
212 # ERR2:       Num Chains: 1
213 # ERR2-NEXT:  warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 94, nchain = 1{{$}}
214 # ERR2-NEXT: }
216 ## Case B.1: the hash table ends right before the EOF. We have a broken nchain
217 ##           field that has a value larger than the number of chains.
218 # RUN: yaml2obj --docnum=4 %s -o %t5.3.o -DNBUCKET=0x1 -DNCHAIN=0x5d
219 # RUN: llvm-readelf --hash-table %t5.3.o 2>&1 | \
220 # RUN:   FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"
221 # RUN: llvm-readobj --hash-table %t5.3.o 2>&1 | \
222 # RUN:   FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"
224 # NOERR2:      warning: '[[FILE]]': hash table nchain (93) differs from symbol count derived from SHT_DYNSYM section header (1)
225 # NOERR2:      warning: '[[FILE]]': the size (0x5d0) of the dynamic symbol table at 0x78, derived from the hash table, goes past the end of the file (0x1d4) and will be ignored
226 # NOERR2:      HashTable {
227 # NOERR2-NEXT:   Num Buckets: 1
228 # NOERR2-NEXT:   Num Chains: 93
229 # NOERR2-NEXT:   Buckets: [0]
230 ## Here we would dump the rest of the file as chain array because we have a broken nchain field.
231 ## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.
232 # NOERR2-NEXT:   Chains:
233 # NOERR2-NEXT: }
235 ## Case B.2: the hash table ends 1 byte past the EOF. We have a broken nchain
236 ##           field that has a value larger than the number of chains.
237 # RUN: yaml2obj --docnum=4 %s -o %t5.4.o -DNBUCKET=0x1 -DNCHAIN=0x5e
238 # RUN: llvm-readelf --hash-table %t5.4.o 2>&1 | \
239 # RUN:   FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"
240 # RUN: llvm-readobj --hash-table %t5.4.o 2>&1 | \
241 # RUN:   FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"
243 # ERR3:      warning: '[[FILE]]': hash table nchain (94) differs from symbol count derived from SHT_DYNSYM section header (1)
244 # ERR3:      warning: '[[FILE]]': the size (0x5e0) of the dynamic symbol table at 0x78, derived from the hash table, goes past the end of the file (0x1d4) and will be ignored
245 # ERR3:      HashTable {
246 # ERR3-NEXT:  Num Buckets: 1
247 # ERR3-NEXT:  Num Chains: 94
248 # ERR3-NEXT:  warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 1, nchain = 94{{$}}
249 # ERR3-NEXT: }
251 --- !ELF
252 FileHeader:
253   Class: ELFCLASS32
254   Data:  ELFDATA2LSB
255   Type:  ET_DYN
256 Sections:
257   - Name:    .hash
258     Type:    SHT_HASH
259     Flags:   [ SHF_ALLOC ]
260     Bucket:  [ 0 ]
261     NBucket: [[NBUCKET]]
262     Chain:   [ 0 ]
263     NChain:  [[NCHAIN]]
264   - Name:  .dynamic
265     Type:  SHT_DYNAMIC
266     Flags: [ SHF_WRITE, SHF_ALLOC ]
267     Entries:
268       - Tag:   DT_HASH
269         Value: 0x0
270       - Tag:   DT_NULL
271         Value: 0x0
272 DynamicSymbols: []
273 ProgramHeaders:
274   - Type:     PT_LOAD
275     FirstSec: .hash
276     LastSec: .dynamic
278 ## Show we do not duplicate warnings when printing both the hash table and the hash histogram.
279 ## Note that --elf-hash-histogram is only implemented for llvm-readelf currently.
280 # RUN: yaml2obj --docnum=3 %s -o %t4.o
281 # RUN: llvm-readelf --hash-table --elf-hash-histogram %t4.o 2>&1 \
282 # RUN:   | FileCheck %s --check-prefix=SINGLE-WARN -DFILE=%t4.o --implicit-check-not="warning:"
284 # SINGLE-WARN:      warning: '[[FILE]]': hash table nchain (0) differs from symbol count derived from SHT_DYNSYM section header (1)
285 # SINGLE-WARN-NEXT: HashTable {
286 # SINGLE-WARN-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8)
287 # SINGLE-WARN-NEXT: }