1# RUN: llvm-mc -filetype=obj -triple=x86_64 %s | llvm-readelf -s - | FileCheck %s
2
3# CHECK:      Symbol table '.symtab' contains 34 entries:
4# CHECK-NEXT: Num:    Value          Size Type    Bind   Vis       Ndx Name
5# CHECK-NEXT:   0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND
6# CHECK-NEXT:   1: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 foo
7# CHECK-NEXT:   2: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 bar
8# CHECK-NEXT:   3: 0000000000000000     0 OBJECT  UNIQUE DEFAULT     2 zed
9# CHECK-NEXT:   4: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 obj
10# CHECK-NEXT:   5: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 func
11# CHECK-NEXT:   6: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 ifunc
12# CHECK-NEXT:   7: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls
13# CHECK-NEXT:   8: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls_quoted
14# CHECK-NEXT:   9: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls_upper_case
15# CHECK-NEXT:  10: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym1
16# CHECK-NEXT:  11: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 alias1
17# CHECK-NEXT:  12: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym2
18# CHECK-NEXT:  13: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias2
19# CHECK-NEXT:  14: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym3
20# CHECK-NEXT:  15: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias3
21# CHECK-NEXT:  16: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym4
22# CHECK-NEXT:  17: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias4
23# CHECK-NEXT:  18: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym5
24# CHECK-NEXT:  19: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias5
25# CHECK-NEXT:  20: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 sym6
26# CHECK-NEXT:  21: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias6
27# CHECK-NEXT:  22: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym7
28# CHECK-NEXT:  23: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 alias7
29# CHECK-NEXT:  24: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym8
30# CHECK-NEXT:  25: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 alias8
31# CHECK-NEXT:  26: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym9
32# CHECK-NEXT:  27: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias9
33# CHECK-NEXT:  28: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym10
34# CHECK-NEXT:  29: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias10
35# CHECK-NEXT:  30: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym11
36# CHECK-NEXT:  31: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 alias11
37# CHECK-NEXT:  32: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym12
38# CHECK-NEXT:  33: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 alias12
39
40// Test that both % and @ are accepted.
41        .global foo
42        .type foo,%function
43foo:
44
45        .global bar
46        .type bar,@object
47bar:
48
49        .type zed,@gnu_unique_object
50zed:
51
52obj:
53        .global obj
54        .type obj,@object
55        .type obj,@notype
56
57func:
58        .global func
59        .type func,@function
60        .type func,@object
61
62ifunc:
63        .global ifunc
64        .type ifunc,@gnu_indirect_function
65
66tls:
67        .global tls
68        .type tls,@tls_object
69        .type tls,@gnu_indirect_function
70
71// Test that "<type>" is accepted.
72tls_quoted:
73        .global tls_quoted
74        .type tls_quoted,"tls_object"
75
76// Test that "<type>" is accepted.
77tls_upper_case:
78        .global tls_upper_case
79        .type tls_upper_case,STT_TLS
80
81// Test that .set doesnt downgrade the type:
82// IFUNC > FUNC > OBJECT > NOTYPE
83// TLS_OBJECT > OBJECT > NOTYPE
84// also TLS_OBJECT is incompatible with IFUNC and FUNC
85
86        .global sym1
87        .type sym1, @gnu_indirect_function
88alias1:
89        .global alias1
90        .type alias1, @function
91        .set sym1, alias1
92
93        .global sym2
94        .type sym2, @gnu_indirect_function
95alias2:
96        .global alias2
97        .type alias2, @object
98        .set sym2, alias2
99
100        .global sym3
101        .type sym3, @gnu_indirect_function
102alias3:
103        .global alias3
104        .type alias3, @notype
105        .set sym3, alias3
106
107        .global sym4
108        .type sym4, @function
109alias4:
110        .global alias4
111        .type alias4, @object
112        .set sym4, alias4
113
114        .global sym5
115        .type sym5, @function
116alias5:
117        .global alias5
118        .type alias5, @notype
119        .set sym5, alias5
120
121        .global sym6
122        .type sym6, @object
123alias6:
124        .global alias6
125        .type alias6, @notype
126        .set sym6, alias6
127
128        .global sym7
129        .type sym7, @gnu_indirect_function
130alias7:
131        .global alias7
132        .type alias7, @tls_object
133        .set sym7, alias7
134
135        .global sym8
136        .type sym8, @function
137        .global alias8
138alias8:
139        .type alias8, @tls_object
140        .set sym8, alias8
141
142        .global sym9
143        .type sym9, @tls_object
144alias9:
145        .global alias9
146        .type alias9, @object
147        .set sym9, alias9
148
149        .global sym10
150        .type sym10, @tls_object
151alias10:
152        .global alias10
153        .type alias10, @notype
154        .set sym10, alias10
155
156        .global sym11
157        .type sym11, @tls_object
158alias11:
159        .global alias11
160        .type alias11, @gnu_indirect_function
161        .set sym11, alias11
162
163        .global sym12
164        .type sym12, @tls_object
165alias12:
166        .global alias12
167        .type alias12, @function
168        .set sym12, alias12
169