xref: /llvm-project/llvm/test/MC/WebAssembly/reloc-pic64.s (revision 554a2fa4b2b18c81dc7f47599c4704577eb3a129)
1# RUN: llvm-mc -triple=wasm64-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck %s
2# RUN: llvm-mc -triple=wasm64-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=REF %s
3
4# Verify that @GOT relocation entries 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, i64
11.globaltype __table_base, i64
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 () -> (i64)
27    global.get  __memory_base
28    i64.const   .L.hidden_data@MBREL
29    i64.add
30    end_function
31
32load_hidden_func:
33    .functype   load_hidden_func () -> (i64)
34    global.get  __table_base
35    i64.const   hidden_func@TBREL
36    i64.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
53# CHECK:      --- !WASM
54# CHECK-NEXT: FileHeader:
55# CHECK-NEXT:   Version:         0x1
56# CHECK-NEXT: Sections:
57# CHECK-NEXT:   - Type:            TYPE
58# CHECK-NEXT:     Signatures:
59# CHECK-NEXT:       - Index:           0
60# CHECK-NEXT:         ParamTypes:      []
61# CHECK-NEXT:         ReturnTypes:
62# CHECK-NEXT:           - I32
63# CHECK-NEXT:       - Index:           1
64# CHECK-NEXT:         ParamTypes:      []
65# CHECK-NEXT:         ReturnTypes:
66# CHECK-NEXT:           - I64
67# CHECK-NEXT:   - Type:            IMPORT
68# CHECK-NEXT:     Imports:
69# CHECK-NEXT:       - Module:          env
70# CHECK-NEXT:         Field:           __linear_memory
71# CHECK-NEXT:         Kind:            MEMORY
72# CHECK-NEXT:         Memory:
73# CHECK-NEXT:           Flags:           [ IS_64 ]
74# CHECK-NEXT:           Minimum:         0x1
75# CHECK-NEXT:       - Module:          env
76# CHECK-NEXT:         Field:           default_func
77# CHECK-NEXT:         Kind:            FUNCTION
78# CHECK-NEXT:         SigIndex:        0
79# CHECK-NEXT:       - Module:          env
80# CHECK-NEXT:         Field:           __memory_base
81# CHECK-NEXT:         Kind:            GLOBAL
82# CHECK-NEXT:         GlobalType:      I64
83# CHECK-NEXT:         GlobalMutable:   true
84# CHECK-NEXT:       - Module:          env
85# CHECK-NEXT:         Field:           __table_base
86# CHECK-NEXT:         Kind:            GLOBAL
87# CHECK-NEXT:         GlobalType:      I64
88# CHECK-NEXT:         GlobalMutable:   true
89# CHECK-NEXT:       - Module:          env
90# CHECK-NEXT:         Field:           __indirect_function_table
91# CHECK-NEXT:         Kind:            TABLE
92# CHECK-NEXT:         Table:
93# CHECK-NEXT:           Index:           0
94# CHECK-NEXT:           ElemType:        FUNCREF
95# CHECK-NEXT:           Limits:
96# CHECK-NEXT:             Flags:           [ IS_64 ]
97# CHECK-NEXT:             Minimum:         0x1
98# CHECK-NEXT:       - Module:          GOT.mem
99# CHECK-NEXT:         Field:           default_data
100# CHECK-NEXT:         Kind:            GLOBAL
101# CHECK-NEXT:         GlobalType:      I32
102# CHECK-NEXT:         GlobalMutable:   true
103# CHECK-NEXT:       - Module:          GOT.func
104# CHECK-NEXT:         Field:           default_func
105# CHECK-NEXT:         Kind:            GLOBAL
106# CHECK-NEXT:         GlobalType:      I32
107# CHECK-NEXT:         GlobalMutable:   true
108# CHECK-NEXT:   - Type:            FUNCTION
109# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 1, 1, 0 ]
110# CHECK-NEXT:   - Type:            ELEM
111# CHECK-NEXT:     Segments:
112# CHECK-NEXT:        Offset:
113# CHECK-NEXT:          Opcode:          I64_CONST
114# CHECK-NEXT:          Value:           1
115# CHECK-NEXT:        Functions:       [ 5 ]
116# CHECK-NEXT:   - Type:            DATACOUNT
117# CHECK-NEXT:     Count:           1
118# CHECK-NEXT:   - Type:            CODE
119# CHECK-NEXT:     Relocations:
120# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
121# CHECK-NEXT:         Index:           1
122# CHECK-NEXT:         Offset:          0x4
123# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
124# CHECK-NEXT:         Index:           3
125# CHECK-NEXT:         Offset:          0x10
126# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
127# CHECK-NEXT:         Index:           5
128# CHECK-NEXT:         Offset:          0x1C
129# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_REL_SLEB64
130# CHECK-NEXT:         Index:           6
131# CHECK-NEXT:         Offset:          0x22
132# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
133# CHECK-NEXT:         Index:           8
134# CHECK-NEXT:         Offset:          0x31
135# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_REL_SLEB64
136# CHECK-NEXT:         Index:           9
137# CHECK-NEXT:         Offset:          0x37
138# CHECK-NEXT:     Functions:
139# CHECK-NEXT:       - Index:           1
140# CHECK-NEXT:         Locals:          []
141# CHECK-NEXT:         Body:            2382808080002802000B
142# CHECK-NEXT:       - Index:           2
143# CHECK-NEXT:         Locals:          []
144# CHECK-NEXT:         Body:            2383808080002802000B
145# CHECK-NEXT:       - Index:           3
146# CHECK-NEXT:         Locals:          []
147# CHECK-NEXT:         Body:            23808080800042808080808080808080007C0B
148# CHECK-NEXT:       - Index:           4
149# CHECK-NEXT:         Locals:          []
150# CHECK-NEXT:         Body:            23818080800042808080808080808080007C0B
151# CHECK-NEXT:       - Index:           5
152# CHECK-NEXT:         Locals:          []
153# CHECK-NEXT:         Body:            41000B
154# CHECK-NEXT:   - Type:            DATA
155# CHECK-NEXT:     Segments:
156# CHECK-NEXT:       - SectionOffset:   6
157# CHECK-NEXT:         InitFlags:       0
158# CHECK-NEXT:         Offset:
159# CHECK-NEXT:           Opcode:          I64_CONST
160# CHECK-NEXT:           Value:           0
161# CHECK-NEXT:         Content:         '64'
162# CHECK-NEXT:   - Type:            CUSTOM
163# CHECK-NEXT:     Name:            linking
164# CHECK-NEXT:     Version:         2
165# CHECK-NEXT:     SymbolTable:
166# CHECK-NEXT:       - Index:           0
167# CHECK-NEXT:         Kind:            FUNCTION
168# CHECK-NEXT:         Name:            load_default_data
169# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
170# CHECK-NEXT:         Function:        1
171# CHECK-NEXT:       - Index:           1
172# CHECK-NEXT:         Kind:            DATA
173# CHECK-NEXT:         Name:            default_data
174# CHECK-NEXT:         Flags:           [ UNDEFINED ]
175# CHECK-NEXT:       - Index:           2
176# CHECK-NEXT:         Kind:            FUNCTION
177# CHECK-NEXT:         Name:            load_default_func
178# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
179# CHECK-NEXT:         Function:        2
180# CHECK-NEXT:       - Index:           3
181# CHECK-NEXT:         Kind:            FUNCTION
182# CHECK-NEXT:         Name:            default_func
183# CHECK-NEXT:         Flags:           [ UNDEFINED ]
184# CHECK-NEXT:         Function:        0
185# CHECK-NEXT:       - Index:           4
186# CHECK-NEXT:         Kind:            FUNCTION
187# CHECK-NEXT:         Name:            load_hidden_data
188# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
189# CHECK-NEXT:         Function:        3
190# CHECK-NEXT:       - Index:           5
191# CHECK-NEXT:         Kind:            GLOBAL
192# CHECK-NEXT:         Name:            __memory_base
193# CHECK-NEXT:         Flags:           [ UNDEFINED ]
194# CHECK-NEXT:         Global:          0
195# CHECK-NEXT:       - Index:           6
196# CHECK-NEXT:         Kind:            DATA
197# CHECK-NEXT:         Name:            .L.hidden_data
198# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
199# CHECK-NEXT:         Segment:         0
200# CHECK-NEXT:         Size:            1
201# CHECK-NEXT:       - Index:           7
202# CHECK-NEXT:         Kind:            FUNCTION
203# CHECK-NEXT:         Name:            load_hidden_func
204# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
205# CHECK-NEXT:         Function:        4
206# CHECK-NEXT:       - Index:           8
207# CHECK-NEXT:         Kind:            GLOBAL
208# CHECK-NEXT:         Name:            __table_base
209# CHECK-NEXT:         Flags:           [ UNDEFINED ]
210# CHECK-NEXT:         Global:          1
211# CHECK-NEXT:       - Index:           9
212# CHECK-NEXT:         Kind:            FUNCTION
213# CHECK-NEXT:         Name:            hidden_func
214# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
215# CHECK-NEXT:         Function:        5
216# REF:              - Index:           10
217# REF-NEXT:           Kind:            TABLE
218# REF-NEXT:           Name:            __indirect_function_table
219# REF-NEXT:           Flags:           [ UNDEFINED, NO_STRIP ]
220# REF-NEXT:           Table:           0
221# CHECK-NEXT:     SegmentInfo:
222# CHECK-NEXT:       - Index:           0
223# CHECK-NEXT:         Name:            .rodata.hidden_data
224# CHECK-NEXT:         Alignment:       0
225# CHECK-NEXT:         Flags:           [  ]
226# CHECK-NEXT: ...
227