1// REQUIRES: x86
2// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
3// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/resolution.s -o %t2
4// RUN: ld.lld -discard-all %t %t2 -o %t3
5// RUN: llvm-readobj --symbols %t3 | FileCheck %s
6
7// This is an exhaustive test for checking which symbol is kept when two
8// have the same name. Each symbol has a different size which is used
9// to see which one was chosen.
10
11// CHECK:      Symbols [
12// CHECK-NEXT:   Symbol {
13// CHECK-NEXT:     Name:  (0)
14// CHECK-NEXT:     Value: 0x0
15// CHECK-NEXT:     Size: 0
16// CHECK-NEXT:     Binding: Local (0x0)
17// CHECK-NEXT:     Type: None (0x0)
18// CHECK-NEXT:     Other: 0
19// CHECK-NEXT:     Section: Undefined (0x0)
20// CHECK-NEXT:   }
21// CHECK-NEXT:   Symbol {
22// CHECK-NEXT:     Name: CommonStrong_with_CommonStrong
23// CHECK-NEXT:     Value:
24// CHECK-NEXT:     Size: 63
25// CHECK-NEXT:     Binding: Global
26// CHECK-NEXT:     Type: Object
27// CHECK-NEXT:     Other: 0
28// CHECK-NEXT:     Section:
29// CHECK-NEXT:   }
30// CHECK-NEXT:   Symbol {
31// CHECK-NEXT:     Name: CommonStrong_with_CommonWeak
32// CHECK-NEXT:     Value:
33// CHECK-NEXT:     Size: 30
34// CHECK-NEXT:     Binding: Global
35// CHECK-NEXT:     Type: Object
36// CHECK-NEXT:     Other: 0
37// CHECK-NEXT:     Section:
38// CHECK-NEXT:   }
39// CHECK-NEXT:   Symbol {
40// CHECK-NEXT:     Name: CommonStrong_with_RegularStrong
41// CHECK-NEXT:     Value:
42// CHECK-NEXT:     Size: 55
43// CHECK-NEXT:     Binding: Global
44// CHECK-NEXT:     Type: None
45// CHECK-NEXT:     Other: 0
46// CHECK-NEXT:     Section: .text
47// CHECK-NEXT:   }
48// CHECK-NEXT:   Symbol {
49// CHECK-NEXT:     Name: CommonStrong_with_RegularWeak
50// CHECK-NEXT:     Value:
51// CHECK-NEXT:     Size: 22
52// CHECK-NEXT:     Binding: Global
53// CHECK-NEXT:     Type: Object
54// CHECK-NEXT:     Other: 0
55// CHECK-NEXT:     Section:
56// CHECK-NEXT:   }
57// CHECK-NEXT:   Symbol {
58// CHECK-NEXT:     Name: CommonStrong_with_UndefStrong
59// CHECK-NEXT:     Value:
60// CHECK-NEXT:     Size: 27
61// CHECK-NEXT:     Binding: Global
62// CHECK-NEXT:     Type: Object
63// CHECK-NEXT:     Other: 0
64// CHECK-NEXT:     Section:
65// CHECK-NEXT:   }
66// CHECK-NEXT:   Symbol {
67// CHECK-NEXT:     Name: CommonStrong_with_UndefWeak
68// CHECK-NEXT:     Value:
69// CHECK-NEXT:     Size: 26
70// CHECK-NEXT:     Binding: Global
71// CHECK-NEXT:     Type: Object
72// CHECK-NEXT:     Other: 0
73// CHECK-NEXT:     Section:
74// CHECK-NEXT:   }
75// CHECK-NEXT:   Symbol {
76// CHECK-NEXT:     Name: CommonWeak_with_CommonStrong
77// CHECK-NEXT:     Value:
78// CHECK-NEXT:     Size: 61
79// CHECK-NEXT:     Binding: Global
80// CHECK-NEXT:     Type: Object
81// CHECK-NEXT:     Other: 0
82// CHECK-NEXT:     Section:
83// CHECK-NEXT:   }
84// CHECK-NEXT:   Symbol {
85// CHECK-NEXT:     Name: CommonWeak_with_CommonWeak
86// CHECK-NEXT:     Value:
87// CHECK-NEXT:     Size: 28
88// CHECK-NEXT:     Binding: Weak
89// CHECK-NEXT:     Type: Object
90// CHECK-NEXT:     Other: 0
91// CHECK-NEXT:     Section:
92// CHECK-NEXT:   }
93// CHECK-NEXT:   Symbol {
94// CHECK-NEXT:     Name: CommonWeak_with_RegularStrong
95// CHECK-NEXT:     Value:
96// CHECK-NEXT:     Size: 53
97// CHECK-NEXT:     Binding: Global
98// CHECK-NEXT:     Type: None
99// CHECK-NEXT:     Other: 0
100// CHECK-NEXT:     Section: .text
101// CHECK-NEXT:   }
102// CHECK-NEXT:   Symbol {
103// CHECK-NEXT:     Name: CommonWeak_with_RegularWeak
104// CHECK-NEXT:     Value:
105// CHECK-NEXT:     Size: 20
106// CHECK-NEXT:     Binding: Weak
107// CHECK-NEXT:     Type: Object
108// CHECK-NEXT:     Other: 0
109// CHECK-NEXT:     Section:
110// CHECK-NEXT:   }
111// CHECK-NEXT:   Symbol {
112// CHECK-NEXT:     Name: CommonWeak_with_UndefStrong
113// CHECK-NEXT:     Value:
114// CHECK-NEXT:     Size: 25
115// CHECK-NEXT:     Binding: Weak
116// CHECK-NEXT:     Type: Object
117// CHECK-NEXT:     Other: 0
118// CHECK-NEXT:     Section:
119// CHECK-NEXT:   }
120// CHECK-NEXT:   Symbol {
121// CHECK-NEXT:     Name: CommonWeak_with_UndefWeak
122// CHECK-NEXT:     Value:
123// CHECK-NEXT:     Size: 24
124// CHECK-NEXT:     Binding: Weak
125// CHECK-NEXT:     Type: Object
126// CHECK-NEXT:     Other: 0
127// CHECK-NEXT:     Section:
128// CHECK-NEXT:   }
129// CHECK-NEXT:   Symbol {
130// CHECK-NEXT:     Name: RegularStrong_with_CommonStrong
131// CHECK-NEXT:     Value:
132// CHECK-NEXT:     Size: 10
133// CHECK-NEXT:     Binding: Global
134// CHECK-NEXT:     Type: None
135// CHECK-NEXT:     Other: 0
136// CHECK-NEXT:     Section: .text
137// CHECK-NEXT:   }
138// CHECK-NEXT:   Symbol {
139// CHECK-NEXT:     Name: RegularStrong_with_CommonWeak
140// CHECK-NEXT:     Value:
141// CHECK-NEXT:     Size: 9
142// CHECK-NEXT:     Binding: Global
143// CHECK-NEXT:     Type: None
144// CHECK-NEXT:     Other: 0
145// CHECK-NEXT:     Section: .text
146// CHECK-NEXT:   }
147// CHECK-NEXT:   Symbol {
148// CHECK-NEXT:     Name: RegularStrong_with_RegularWeak
149// CHECK-NEXT:     Value:
150// CHECK-NEXT:     Size: 2
151// CHECK-NEXT:     Binding: Global
152// CHECK-NEXT:     Type: None
153// CHECK-NEXT:     Other: 0
154// CHECK-NEXT:     Section: .text
155// CHECK-NEXT:   }
156// CHECK-NEXT:   Symbol {
157// CHECK-NEXT:     Name: RegularStrong_with_UndefStrong
158// CHECK-NEXT:     Value:
159// CHECK-NEXT:     Size: 6
160// CHECK-NEXT:     Binding: Global
161// CHECK-NEXT:     Type: None
162// CHECK-NEXT:     Other: 0
163// CHECK-NEXT:     Section: .text
164// CHECK-NEXT:   }
165// CHECK-NEXT:   Symbol {
166// CHECK-NEXT:     Name: RegularStrong_with_UndefWeak
167// CHECK-NEXT:     Value:
168// CHECK-NEXT:     Size: 5
169// CHECK-NEXT:     Binding: Global
170// CHECK-NEXT:     Type: None
171// CHECK-NEXT:     Other: 0
172// CHECK-NEXT:     Section: .text
173// CHECK-NEXT:   }
174// CHECK-NEXT:   Symbol {
175// CHECK-NEXT:     Name: RegularWeak_with_CommonStrong
176// CHECK-NEXT:     Value:
177// CHECK-NEXT:     Size: 40
178// CHECK-NEXT:     Binding: Global
179// CHECK-NEXT:     Type: Object
180// CHECK-NEXT:     Other: 0
181// CHECK-NEXT:     Section:
182// CHECK-NEXT:   }
183// CHECK-NEXT:   Symbol {
184// CHECK-NEXT:     Name: RegularWeak_with_CommonWeak
185// CHECK-NEXT:     Value:
186// CHECK-NEXT:     Size: 7
187// CHECK-NEXT:     Binding: Weak
188// CHECK-NEXT:     Type: None
189// CHECK-NEXT:     Other: 0
190// CHECK-NEXT:     Section: .text
191// CHECK-NEXT:   }
192// CHECK-NEXT:   Symbol {
193// CHECK-NEXT:     Name: RegularWeak_with_RegularStrong
194// CHECK-NEXT:     Value:
195// CHECK-NEXT:     Size: 33
196// CHECK-NEXT:     Binding: Global
197// CHECK-NEXT:     Type: None
198// CHECK-NEXT:     Other: 0
199// CHECK-NEXT:     Section: .text
200// CHECK-NEXT:   }
201// CHECK-NEXT:   Symbol {
202// CHECK-NEXT:     Name: RegularWeak_with_RegularWeak
203// CHECK-NEXT:     Value:
204// CHECK-NEXT:     Size: 0
205// CHECK-NEXT:     Binding: Weak
206// CHECK-NEXT:     Type: None
207// CHECK-NEXT:     Other: 0
208// CHECK-NEXT:     Section: .text
209// CHECK-NEXT:   }
210// CHECK-NEXT:   Symbol {
211// CHECK-NEXT:     Name: RegularWeak_with_UndefStrong
212// CHECK-NEXT:     Value:
213// CHECK-NEXT:     Size: 4
214// CHECK-NEXT:     Binding: Weak
215// CHECK-NEXT:     Type: None
216// CHECK-NEXT:     Other: 0
217// CHECK-NEXT:     Section: .text
218// CHECK-NEXT:   }
219// CHECK-NEXT:   Symbol {
220// CHECK-NEXT:     Name: RegularWeak_with_UndefWeak
221// CHECK-NEXT:     Value:
222// CHECK-NEXT:     Size: 3
223// CHECK-NEXT:     Binding: Weak
224// CHECK-NEXT:     Type: None
225// CHECK-NEXT:     Other: 0
226// CHECK-NEXT:     Section: .text
227// CHECK-NEXT:   }
228// CHECK-NEXT:   Symbol {
229// CHECK-NEXT:     Name: UndefStrong_with_CommonStrong
230// CHECK-NEXT:     Value:
231// CHECK-NEXT:     Size: 51
232// CHECK-NEXT:     Binding: Global
233// CHECK-NEXT:     Type: Object
234// CHECK-NEXT:     Other: 0
235// CHECK-NEXT:     Section:
236// CHECK-NEXT:   }
237// CHECK-NEXT:   Symbol {
238// CHECK-NEXT:     Name: UndefStrong_with_CommonWeak
239// CHECK-NEXT:     Value:
240// CHECK-NEXT:     Size: 50
241// CHECK-NEXT:     Binding: Weak
242// CHECK-NEXT:     Type: Object
243// CHECK-NEXT:     Other: 0
244// CHECK-NEXT:     Section:
245// CHECK-NEXT:   }
246// CHECK-NEXT:   Symbol {
247// CHECK-NEXT:     Name: UndefStrong_with_RegularStrong
248// CHECK-NEXT:     Value:
249// CHECK-NEXT:     Size: 46
250// CHECK-NEXT:     Binding: Global
251// CHECK-NEXT:     Type: None
252// CHECK-NEXT:     Other: 0
253// CHECK-NEXT:     Section: .text
254// CHECK-NEXT:   }
255// CHECK-NEXT:   Symbol {
256// CHECK-NEXT:     Name: UndefStrong_with_RegularWeak
257// CHECK-NEXT:     Value:
258// CHECK-NEXT:     Size: 45
259// CHECK-NEXT:     Binding: Weak
260// CHECK-NEXT:     Type: None
261// CHECK-NEXT:     Other: 0
262// CHECK-NEXT:     Section: .text
263// CHECK-NEXT:   }
264// CHECK-NEXT:   Symbol {
265// CHECK-NEXT:     Name: UndefWeak_with_CommonStrong
266// CHECK-NEXT:     Value:
267// CHECK-NEXT:     Size: 49
268// CHECK-NEXT:     Binding: Global
269// CHECK-NEXT:     Type: Object
270// CHECK-NEXT:     Other: 0
271// CHECK-NEXT:     Section:
272// CHECK-NEXT:   }
273// CHECK-NEXT:   Symbol {
274// CHECK-NEXT:     Name: UndefWeak_with_CommonWeak
275// CHECK-NEXT:     Value:
276// CHECK-NEXT:     Size: 48
277// CHECK-NEXT:     Binding: Weak
278// CHECK-NEXT:     Type: Object
279// CHECK-NEXT:     Other: 0
280// CHECK-NEXT:     Section:
281// CHECK-NEXT:   }
282// CHECK-NEXT:   Symbol {
283// CHECK-NEXT:     Name: UndefWeak_with_RegularStrong
284// CHECK-NEXT:     Value:
285// CHECK-NEXT:     Size: 44
286// CHECK-NEXT:     Binding: Global
287// CHECK-NEXT:     Type: None
288// CHECK-NEXT:     Other: 0
289// CHECK-NEXT:     Section: .text
290// CHECK-NEXT:   }
291// CHECK-NEXT:   Symbol {
292// CHECK-NEXT:     Name: UndefWeak_with_RegularWeak
293// CHECK-NEXT:     Value:
294// CHECK-NEXT:     Size: 43
295// CHECK-NEXT:     Binding: Weak
296// CHECK-NEXT:     Type: None
297// CHECK-NEXT:     Other: 0
298// CHECK-NEXT:     Section: .text
299// CHECK-NEXT:   }
300// CHECK-NEXT:   Symbol {
301// CHECK-NEXT:     Name: UndefWeak_with_UndefWeak
302// CHECK-NEXT:     Value: 0x0
303// CHECK-NEXT:     Size: 0
304// CHECK-NEXT:     Binding: Weak
305// CHECK-NEXT:     Type: None
306// CHECK-NEXT:     Other: 0
307// CHECK-NEXT:     Section: Undefined
308// CHECK-NEXT:   }
309// CHECK-NEXT:  Symbol {
310// CHECK-NEXT:    Name: _start
311// CHECK-NEXT:    Value:
312// CHECK-NEXT:    Size: 0
313// CHECK-NEXT:    Binding: Global (0x1)
314// CHECK-NEXT:    Type: None (0x0)
315// CHECK-NEXT:    Other: 0
316// CHECK-NEXT:    Section: .text (0x1)
317// CHECK-NEXT:  }
318// CHECK-NEXT: ]
319
320.globl _start
321_start:
322        nop
323
324local:
325
326.weak RegularWeak_with_RegularWeak
327.size RegularWeak_with_RegularWeak, 0
328RegularWeak_with_RegularWeak:
329
330.weak RegularWeak_with_RegularStrong
331.size RegularWeak_with_RegularStrong, 1
332RegularWeak_with_RegularStrong:
333
334.global RegularStrong_with_RegularWeak
335.size RegularStrong_with_RegularWeak, 2
336RegularStrong_with_RegularWeak:
337
338.weak RegularWeak_with_UndefWeak
339.size RegularWeak_with_UndefWeak, 3
340RegularWeak_with_UndefWeak:
341
342.weak RegularWeak_with_UndefStrong
343.size RegularWeak_with_UndefStrong, 4
344RegularWeak_with_UndefStrong:
345
346.global RegularStrong_with_UndefWeak
347.size RegularStrong_with_UndefWeak, 5
348RegularStrong_with_UndefWeak:
349
350.global RegularStrong_with_UndefStrong
351.size RegularStrong_with_UndefStrong, 6
352RegularStrong_with_UndefStrong:
353
354.weak RegularWeak_with_CommonWeak
355.size RegularWeak_with_CommonWeak, 7
356RegularWeak_with_CommonWeak:
357
358.weak RegularWeak_with_CommonStrong
359.size RegularWeak_with_CommonStrong, 8
360RegularWeak_with_CommonStrong:
361
362.global RegularStrong_with_CommonWeak
363.size RegularStrong_with_CommonWeak, 9
364RegularStrong_with_CommonWeak:
365
366.global RegularStrong_with_CommonStrong
367.size RegularStrong_with_CommonStrong, 10
368RegularStrong_with_CommonStrong:
369
370.weak UndefWeak_with_RegularWeak
371.size UndefWeak_with_RegularWeak, 11
372.quad UndefWeak_with_RegularWeak
373
374.weak UndefWeak_with_RegularStrong
375.size UndefWeak_with_RegularStrong, 12
376.quad UndefWeak_with_RegularStrong
377
378.size UndefStrong_with_RegularWeak, 13
379.quad UndefStrong_with_RegularWeak
380
381.size UndefStrong_with_RegularStrong, 14
382.quad UndefStrong_with_RegularStrong
383
384.weak UndefWeak_with_UndefWeak
385.size UndefWeak_with_UndefWeak, 15
386.quad UndefWeak_with_UndefWeak
387
388.weak UndefWeak_with_CommonWeak
389.size UndefWeak_with_CommonWeak, 16
390.quad UndefWeak_with_CommonWeak
391
392.weak UndefWeak_with_CommonStrong
393.size UndefWeak_with_CommonStrong, 17
394.quad UndefWeak_with_CommonStrong
395
396.size UndefStrong_with_CommonWeak, 18
397.quad UndefStrong_with_CommonWeak
398
399.size UndefStrong_with_CommonStrong, 19
400.quad UndefStrong_with_CommonStrong
401
402.weak CommonWeak_with_RegularWeak
403.comm CommonWeak_with_RegularWeak,20,4
404
405.weak CommonWeak_with_RegularStrong
406.comm CommonWeak_with_RegularStrong,21,4
407
408.comm CommonStrong_with_RegularWeak,22,4
409
410.comm CommonStrong_with_RegularStrong,23,4
411
412.weak CommonWeak_with_UndefWeak
413.comm CommonWeak_with_UndefWeak,24,4
414
415.weak CommonWeak_with_UndefStrong
416.comm CommonWeak_with_UndefStrong,25,4
417
418.comm CommonStrong_with_UndefWeak,26,4
419
420.comm CommonStrong_with_UndefStrong,27,4
421
422.weak CommonWeak_with_CommonWeak
423.comm CommonWeak_with_CommonWeak,28,4
424
425.weak CommonWeak_with_CommonStrong
426.comm CommonWeak_with_CommonStrong,29,4
427
428.comm CommonStrong_with_CommonWeak,30,4
429
430.comm CommonStrong_with_CommonStrong,31,4
431