xref: /llvm-project/llvm/test/MC/WebAssembly/reloc-pic.s (revision a29e8ef1c36001ff19392713c8be4bd277e9b5d7)
1# RUN: sed -e '/^REF-/d' %s | llvm-mc -triple=wasm32-unknown-unknown -filetype=obj | obj2yaml | FileCheck %s
2# RUN: sed -e 's/^REF-//g' %s | llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj | obj2yaml | FileCheck --check-prefix=REF %s
3
4# Verify that @GOT relocation entryes result in R_WASM_GLOBAL_INDEX_LEB against
5# against the corrsponding function or data symbol and that the corresponding
6# data symbols are imported as a wasm globals.
7
8.functype default_func () -> (i32)
9
10.globaltype __memory_base, i32
11.globaltype __table_base, i32
12
13load_default_data:
14    .functype   load_default_data () -> (i32)
15    global.get  default_data@GOT
16    i32.load    0
17    end_function
18
19load_default_func:
20    .functype   load_default_func () -> (i32)
21    global.get  default_func@GOT
22    i32.load    0
23    end_function
24
25load_hidden_data:
26    .functype   load_hidden_data () -> (i32)
27    global.get  __memory_base
28    i32.const   .L.hidden_data@MBREL
29    i32.add
30    end_function
31
32load_hidden_func:
33    .functype   load_hidden_func () -> (i32)
34    global.get  __table_base
35    i32.const   hidden_func@TBREL
36    i32.add
37    end_function
38
39hidden_func:
40    .functype   hidden_func () -> (i32)
41    i32.const 0
42    end_function
43
44.section .rodata.hidden_data,"",@
45.L.hidden_data:
46    .int8 100
47    .size .L.hidden_data, 1
48
49#.hidden hidden_func
50#.hidden hidden_data
51.size default_data, 4
52
53REF-mytable:
54REF-.tabletype mytable, externref
55
56# CHECK:      --- !WASM
57# CHECK-NEXT: FileHeader:
58# CHECK-NEXT:   Version:         0x1
59# CHECK-NEXT: Sections:
60# CHECK-NEXT:   - Type:            TYPE
61# CHECK-NEXT:     Signatures:
62# CHECK-NEXT:       - Index:           0
63# CHECK-NEXT:         ParamTypes:      []
64# CHECK-NEXT:         ReturnTypes:
65# CHECK-NEXT:           - I32
66# CHECK-NEXT:   - Type:            IMPORT
67# CHECK-NEXT:     Imports:
68# CHECK-NEXT:       - Module:          env
69# CHECK-NEXT:         Field:           __linear_memory
70# CHECK-NEXT:         Kind:            MEMORY
71# CHECK-NEXT:         Memory:
72# CHECK-NEXT:           Minimum:         0x1
73# CHECK-NEXT:       - Module:          env
74# CHECK-NEXT:         Field:           default_func
75# CHECK-NEXT:         Kind:            FUNCTION
76# CHECK-NEXT:         SigIndex:        0
77# CHECK-NEXT:       - Module:          env
78# CHECK-NEXT:         Field:           __memory_base
79# CHECK-NEXT:         Kind:            GLOBAL
80# CHECK-NEXT:         GlobalType:      I32
81# CHECK-NEXT:         GlobalMutable:   true
82# CHECK-NEXT:       - Module:          env
83# CHECK-NEXT:         Field:           __table_base
84# CHECK-NEXT:         Kind:            GLOBAL
85# CHECK-NEXT:         GlobalType:      I32
86# CHECK-NEXT:         GlobalMutable:   true
87# CHECK-NEXT:       - Module:          env
88# CHECK-NEXT:         Field:           __indirect_function_table
89# CHECK-NEXT:         Kind:            TABLE
90# CHECK-NEXT:         Table:
91# CHECK-NEXT:           Index:           0
92# CHECK-NEXT:           ElemType:        FUNCREF
93# CHECK-NEXT:           Limits:
94# CHECK-NEXT:             Minimum:         0x1
95# CHECK-NEXT:       - Module:          GOT.mem
96# CHECK-NEXT:         Field:           default_data
97# CHECK-NEXT:         Kind:            GLOBAL
98# CHECK-NEXT:         GlobalType:      I32
99# CHECK-NEXT:         GlobalMutable:   true
100# CHECK-NEXT:       - Module:          GOT.func
101# CHECK-NEXT:         Field:           default_func
102# CHECK-NEXT:         Kind:            GLOBAL
103# CHECK-NEXT:         GlobalType:      I32
104# CHECK-NEXT:         GlobalMutable:   true
105# CHECK-NEXT:   - Type:            FUNCTION
106# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
107# CHECK-NEXT:   - Type:            ELEM
108# CHECK-NEXT:     Segments:
109# CHECK-NEXT:        Offset:
110# CHECK-NEXT:          Opcode:          I32_CONST
111# CHECK-NEXT:          Value:           1
112# CHECK-NEXT:        Functions:       [ 5 ]
113# CHECK-NEXT:   - Type:            DATACOUNT
114# CHECK-NEXT:     Count:           1
115# CHECK-NEXT:   - Type:            CODE
116# CHECK-NEXT:     Relocations:
117# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
118# CHECK-NEXT:         Index:           1
119# CHECK-NEXT:         Offset:          0x4
120# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
121# CHECK-NEXT:         Index:           3
122# CHECK-NEXT:         Offset:          0x10
123# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
124# CHECK-NEXT:         Index:           5
125# CHECK-NEXT:         Offset:          0x1C
126# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_REL_SLEB
127# CHECK-NEXT:         Index:           6
128# CHECK-NEXT:         Offset:          0x22
129# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
130# CHECK-NEXT:         Index:           8
131# CHECK-NEXT:         Offset:          0x2C
132# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_REL_SLEB
133# CHECK-NEXT:         Index:           9
134# CHECK-NEXT:         Offset:          0x32
135# CHECK-NEXT:     Functions:
136# CHECK-NEXT:       - Index:           1
137# CHECK-NEXT:         Locals:          []
138# CHECK-NEXT:         Body:            2382808080002802000B
139# CHECK-NEXT:       - Index:           2
140# CHECK-NEXT:         Locals:          []
141# CHECK-NEXT:         Body:            2383808080002802000B
142# CHECK-NEXT:       - Index:           3
143# CHECK-NEXT:         Locals:          []
144# CHECK-NEXT:         Body:            2380808080004180808080006A0B
145# CHECK-NEXT:       - Index:           4
146# CHECK-NEXT:         Locals:          []
147# CHECK-NEXT:         Body:            2381808080004180808080006A0B
148# CHECK-NEXT:       - Index:           5
149# CHECK-NEXT:         Locals:          []
150# CHECK-NEXT:         Body:            41000B
151# CHECK-NEXT:   - Type:            DATA
152# CHECK-NEXT:     Segments:
153# CHECK-NEXT:       - SectionOffset:   6
154# CHECK-NEXT:         InitFlags:       0
155# CHECK-NEXT:         Offset:
156# CHECK-NEXT:           Opcode:          I32_CONST
157# CHECK-NEXT:           Value:           0
158# CHECK-NEXT:         Content:         '64'
159# CHECK-NEXT:   - Type:            CUSTOM
160# CHECK-NEXT:     Name:            linking
161# CHECK-NEXT:     Version:         2
162# CHECK-NEXT:     SymbolTable:
163# CHECK-NEXT:       - Index:           0
164# CHECK-NEXT:         Kind:            FUNCTION
165# CHECK-NEXT:         Name:            load_default_data
166# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
167# CHECK-NEXT:         Function:        1
168# CHECK-NEXT:       - Index:           1
169# CHECK-NEXT:         Kind:            DATA
170# CHECK-NEXT:         Name:            default_data
171# CHECK-NEXT:         Flags:           [ UNDEFINED ]
172# CHECK-NEXT:       - Index:           2
173# CHECK-NEXT:         Kind:            FUNCTION
174# CHECK-NEXT:         Name:            load_default_func
175# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
176# CHECK-NEXT:         Function:        2
177# CHECK-NEXT:       - Index:           3
178# CHECK-NEXT:         Kind:            FUNCTION
179# CHECK-NEXT:         Name:            default_func
180# CHECK-NEXT:         Flags:           [ UNDEFINED ]
181# CHECK-NEXT:         Function:        0
182# CHECK-NEXT:       - Index:           4
183# CHECK-NEXT:         Kind:            FUNCTION
184# CHECK-NEXT:         Name:            load_hidden_data
185# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
186# CHECK-NEXT:         Function:        3
187# CHECK-NEXT:       - Index:           5
188# CHECK-NEXT:         Kind:            GLOBAL
189# CHECK-NEXT:         Name:            __memory_base
190# CHECK-NEXT:         Flags:           [ UNDEFINED ]
191# CHECK-NEXT:         Global:          0
192# CHECK-NEXT:       - Index:           6
193# CHECK-NEXT:         Kind:            DATA
194# CHECK-NEXT:         Name:            .L.hidden_data
195# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
196# CHECK-NEXT:         Segment:         0
197# CHECK-NEXT:         Size:            1
198# CHECK-NEXT:       - Index:           7
199# CHECK-NEXT:         Kind:            FUNCTION
200# CHECK-NEXT:         Name:            load_hidden_func
201# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
202# CHECK-NEXT:         Function:        4
203# CHECK-NEXT:       - Index:           8
204# CHECK-NEXT:         Kind:            GLOBAL
205# CHECK-NEXT:         Name:            __table_base
206# CHECK-NEXT:         Flags:           [ UNDEFINED ]
207# CHECK-NEXT:         Global:          1
208# CHECK-NEXT:       - Index:           9
209# CHECK-NEXT:         Kind:            FUNCTION
210# CHECK-NEXT:         Name:            hidden_func
211# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
212# CHECK-NEXT:         Function:        5
213# REF:              - Index:           10
214# REF-NEXT:           Kind:            TABLE
215# REF-NEXT:           Name:            mytable
216# REF-NEXT:           Flags:           [ BINDING_LOCAL ]
217# REF-NEXT:           Table:           1
218# REF-NEXT:         - Index:           11
219# REF-NEXT:           Kind:            TABLE
220# REF-NEXT:           Name:            __indirect_function_table
221# REF-NEXT:           Flags:           [ UNDEFINED, NO_STRIP ]
222# REF-NEXT:           Table:           0
223# CHECK-NEXT:     SegmentInfo:
224# CHECK-NEXT:       - Index:           0
225# CHECK-NEXT:         Name:            .rodata.hidden_data
226# CHECK-NEXT:         Alignment:       0
227# CHECK-NEXT:         Flags:           [  ]
228# CHECK-NEXT: ...
229