xref: /llvm-project/lld/test/wasm/pie.s (revision 22b7b84860d39da71964c9b329937f2ee1d875ba)
1a0bd6361SSam Clegg# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-emscripten -o %t.o %s
2a0bd6361SSam Clegg# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-emscripten %S/Inputs/internal_func.s -o %t.internal_func.o
3*22b7b848SSam Clegg# RUN: wasm-ld --no-gc-sections --experimental-pic -pie --unresolved-symbols=import-dynamic -o %t.wasm %t.o %t.internal_func.o
4a0bd6361SSam Clegg# RUN: obj2yaml %t.wasm | FileCheck %s
5a0bd6361SSam Clegg# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM
6a0bd6361SSam Clegg
7a0bd6361SSam Clegg.functype external_func () -> ()
8a0bd6361SSam Clegg.functype internal_func1 () -> (i32)
9a0bd6361SSam Clegg.functype internal_func2 () -> (i32)
10a0bd6361SSam Clegg.globaltype __stack_pointer, i32
11a0bd6361SSam Clegg
12a0bd6361SSam Clegg.section  .data,"",@
13a0bd6361SSam Clegg.p2align  2
14a0bd6361SSam Cleggdata:
15a0bd6361SSam Clegg  .int32  2
16a0bd6361SSam Clegg  .size data, 4
17a0bd6361SSam Clegg
18a0bd6361SSam Cleggindirect_func:
19a0bd6361SSam Clegg  .int32  foo
20a0bd6361SSam Clegg  .size indirect_func, 4
21a0bd6361SSam Clegg
22a0bd6361SSam Cleggdata_addr:
23a0bd6361SSam Clegg  .int32  data
24a0bd6361SSam Clegg  .size data_addr, 4
25a0bd6361SSam Clegg
26a0bd6361SSam Cleggdata_addr_external:
27a0bd6361SSam Clegg  .int32 data_external
28a0bd6361SSam Clegg  .size data_addr_external, 4
29a0bd6361SSam Clegg
30a0bd6361SSam Clegg.section  .text,"",@
31a0bd6361SSam Cleggfoo:
32a0bd6361SSam Clegg  .functype foo () -> (i32)
33a0bd6361SSam Clegg
34a0bd6361SSam Clegg  global.get data@GOT
35a0bd6361SSam Clegg  i32.load 0
36a0bd6361SSam Clegg  drop
37a0bd6361SSam Clegg
38a0bd6361SSam Clegg  global.get indirect_func@GOT
39a0bd6361SSam Clegg  i32.load 0
40a0bd6361SSam Clegg  call_indirect  () -> (i32)
41a0bd6361SSam Clegg  drop
42a0bd6361SSam Clegg
43a0bd6361SSam Clegg  global.get __stack_pointer
44a0bd6361SSam Clegg  end_function
45a0bd6361SSam Clegg
46a0bd6361SSam Cleggget_data_address:
47a0bd6361SSam Clegg  .functype get_data_address () -> (i32)
48a0bd6361SSam Clegg  global.get data_addr_external@GOT
49a0bd6361SSam Clegg  end_function
50a0bd6361SSam Clegg
51a0bd6361SSam Cleggget_internal_func1_address:
52a0bd6361SSam Clegg  .functype get_internal_func1_address () -> (i32)
53a0bd6361SSam Clegg  global.get internal_func1@GOT
54a0bd6361SSam Clegg  end_function
55a0bd6361SSam Clegg
56a0bd6361SSam Cleggget_internal_func2_address:
57a0bd6361SSam Clegg  .functype get_internal_func2_address () -> (i32)
58a0bd6361SSam Clegg  global.get internal_func2@GOT
59a0bd6361SSam Clegg  end_function
60a0bd6361SSam Clegg
61a0bd6361SSam Clegg.globl _start
62a0bd6361SSam Clegg_start:
63a0bd6361SSam Clegg  .functype _start () -> ()
64a0bd6361SSam Clegg  call external_func
65a0bd6361SSam Clegg  end_function
66a0bd6361SSam Clegg
67a0bd6361SSam Clegg.section  .custom_section.target_features,"",@
68a0bd6361SSam Clegg.int8 2
69a0bd6361SSam Clegg.int8 43
70a0bd6361SSam Clegg.int8 7
71a0bd6361SSam Clegg.ascii  "atomics"
72a0bd6361SSam Clegg.int8 43
73a0bd6361SSam Clegg.int8 11
74a0bd6361SSam Clegg.ascii  "bulk-memory"
75a0bd6361SSam Clegg
76a0bd6361SSam Clegg# CHECK:      Sections:
77a0bd6361SSam Clegg# CHECK-NEXT:   - Type:            CUSTOM
78a0bd6361SSam Clegg# CHECK-NEXT:     Name:            dylink.0
79a0bd6361SSam Clegg# CHECK-NEXT:     MemorySize:      16
80a0bd6361SSam Clegg# CHECK-NEXT:     MemoryAlignment: 2
81a0bd6361SSam Clegg# CHECK-NEXT:     TableSize:       3
82a0bd6361SSam Clegg# CHECK-NEXT:     TableAlignment:  0
83a0bd6361SSam Clegg# CHECK-NEXT:     Needed:          []
84a0bd6361SSam Clegg
85a0bd6361SSam Clegg# CHECK:        - Type:            IMPORT
86a0bd6361SSam Clegg# CHECK-NEXT:     Imports:
87a0bd6361SSam Clegg# CHECK-NEXT:      - Module:          env
88a0bd6361SSam Clegg# CHECK-NEXT:        Field:           __indirect_function_table
89a0bd6361SSam Clegg# CHECK-NEXT:        Kind:            TABLE
90a0bd6361SSam Clegg# CHECK-NEXT:        Table:
91a0bd6361SSam Clegg# CHECK-NEXT:          Index:           0
92a0bd6361SSam Clegg# CHECK-NEXT:          ElemType:        FUNCREF
93a0bd6361SSam Clegg# CHECK-NEXT:          Limits:
94a0bd6361SSam Clegg# CHECK-NEXT:            Minimum:         0x3
95a0bd6361SSam Clegg# CHECK-NEXT:       - Module:          env
96a0bd6361SSam Clegg# CHECK-NEXT:         Field:           __stack_pointer
97a0bd6361SSam Clegg# CHECK-NEXT:         Kind:            GLOBAL
98a0bd6361SSam Clegg# CHECK-NEXT:         GlobalType:      I32
99a0bd6361SSam Clegg# CHECK-NEXT:         GlobalMutable:   true
100a0bd6361SSam Clegg# CHECK-NEXT:       - Module:          env
101a0bd6361SSam Clegg# CHECK-NEXT:         Field:           __memory_base
102a0bd6361SSam Clegg# CHECK-NEXT:         Kind:            GLOBAL
103a0bd6361SSam Clegg# CHECK-NEXT:         GlobalType:      I32
104a0bd6361SSam Clegg# CHECK-NEXT:         GlobalMutable:   false
105a0bd6361SSam Clegg# CHECK-NEXT:       - Module:          env
106a0bd6361SSam Clegg# CHECK-NEXT:         Field:           __table_base
107a0bd6361SSam Clegg# CHECK-NEXT:         Kind:            GLOBAL
108a0bd6361SSam Clegg# CHECK-NEXT:         GlobalType:      I32
109a0bd6361SSam Clegg# CHECK-NEXT:         GlobalMutable:   false
110a0bd6361SSam Clegg
111a0bd6361SSam Clegg# CHECK:        - Type:            START
112a0bd6361SSam Clegg# CHECK-NEXT:     StartFunction:   3
113a0bd6361SSam Clegg
114a0bd6361SSam Clegg# CHECK:        - Type:            CUSTOM
115a0bd6361SSam Clegg# CHECK-NEXT:     Name:            name
116a0bd6361SSam Clegg# CHECK-NEXT:     FunctionNames:
117a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           0
118a0bd6361SSam Clegg# CHECK-NEXT:         Name:            external_func
119a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           1
120a0bd6361SSam Clegg# CHECK-NEXT:         Name:            __wasm_call_ctors
121a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           2
122a0bd6361SSam Clegg# CHECK-NEXT:         Name:            __wasm_apply_data_relocs
123a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           3
124a0bd6361SSam Clegg# CHECK-NEXT:         Name:            __wasm_apply_global_relocs
125a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           4
126a0bd6361SSam Clegg# CHECK-NEXT:         Name:            foo
127a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           5
128a0bd6361SSam Clegg# CHECK-NEXT:         Name:            get_data_address
129a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           6
130a0bd6361SSam Clegg# CHECK-NEXT:         Name:            get_internal_func1_address
131a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           7
132a0bd6361SSam Clegg# CHECK-NEXT:         Name:            get_internal_func2_address
133a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           8
134a0bd6361SSam Clegg# CHECK-NEXT:         Name:            _start
135a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           9
136a0bd6361SSam Clegg# CHECK-NEXT:         Name:            internal_func1
137a0bd6361SSam Clegg# CHECK-NEXT:       - Index:           10
138a0bd6361SSam Clegg# CHECK-NEXT:         Name:            internal_func2
139a0bd6361SSam Clegg# CHECK-NEXT:     GlobalNames:
140a0bd6361SSam Clegg
141a0bd6361SSam Clegg# DISASSEM-LABEL:  <__wasm_call_ctors>:
142a0bd6361SSam Clegg# DISASSEM-EMPTY:
143a0bd6361SSam Clegg# DISASSEM-NEXT:   end
144a0bd6361SSam Clegg
145a0bd6361SSam Clegg# DISASSEM-LABEL:  <__wasm_apply_data_relocs>:
146a0bd6361SSam Clegg# DISASSEM:        end
147a0bd6361SSam Clegg
148a0bd6361SSam Clegg# Run the same test with extended-const support.  When this is available
149a0bd6361SSam Clegg# we don't need __wasm_apply_global_relocs and instead rely on the add
150a0bd6361SSam Clegg# instruction in the InitExpr.  We also, therefore, do not need these globals
151a0bd6361SSam Clegg# to be mutable.
152a0bd6361SSam Clegg
153*22b7b848SSam Clegg# RUN: wasm-ld --no-gc-sections --experimental-pic -pie --unresolved-symbols=import-dynamic --extra-features=extended-const -o %t.extended.wasm %t.o %t.internal_func.o
154a0bd6361SSam Clegg# RUN: obj2yaml %t.extended.wasm | FileCheck %s --check-prefix=EXTENDED-CONST
155a0bd6361SSam Clegg
156a0bd6361SSam Clegg# EXTENDED-CONST-NOT: __wasm_apply_global_relocs
157a0bd6361SSam Clegg
158a0bd6361SSam Clegg# EXTENDED-CONST:       - Type:            GLOBAL
159a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:    Globals:
160a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           4
161a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Type:            I32
162a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Mutable:         false
163a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        InitExpr:
164a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Opcode:        GLOBAL_GET
165a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Index:         1
166a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           5
167a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Type:            I32
168a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Mutable:         false
169a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        InitExpr:
170a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Extended:        true
171a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Body:            230141046A0B
172a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           6
173a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Type:            I32
174a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Mutable:         false
175a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        InitExpr:
176a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Extended:        true
177a0bd6361SSam Clegg# This instruction sequence decodes to:
178a0bd6361SSam Clegg# (global.get[0x23] 0x1 i32.const[0x41] 0x0C i32.add[0x6A] end[0x0b])
179a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Body:            2301410C6A0B
180a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           7
181a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Type:            I32
182a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Mutable:         false
183a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        InitExpr:
184a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Opcode:        GLOBAL_GET
185a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Index:         2
186a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           8
187a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Type:            I32
188a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Mutable:         false
189a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        InitExpr:
190a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Extended:        true
191a0bd6361SSam Clegg# This instruction sequence decodes to:
192a0bd6361SSam Clegg# (global.get[0x23] 0x2 i32.const[0x41] 0x1 i32.add[0x6A] end[0x0b])
193a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:          Body:            230241016A0B
194a0bd6361SSam Clegg
195a0bd6361SSam Clegg#  EXTENDED-CONST-NOT:  - Type:            START
196a0bd6361SSam Clegg
197a0bd6361SSam Clegg#      EXTENDED-CONST:    FunctionNames:
198a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           0
199a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Name:            external_func
200a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           1
201a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Name:            __wasm_call_ctors
202a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:      - Index:           2
203a0bd6361SSam Clegg# EXTENDED-CONST-NEXT:        Name:            __wasm_apply_data_relocs
204a0bd6361SSam Clegg
205a0bd6361SSam Clegg# Run the same test with threading support.  In this mode
206a0bd6361SSam Clegg# we expect __wasm_init_memory and __wasm_apply_data_relocs
207a0bd6361SSam Clegg# to be generated along with __wasm_start as the start
208a0bd6361SSam Clegg# function.
209a0bd6361SSam Clegg
210*22b7b848SSam Clegg# RUN: wasm-ld --no-gc-sections --shared-memory --experimental-pic -pie --unresolved-symbols=import-dynamic -o %t.shmem.wasm %t.o %t.internal_func.o
211a0bd6361SSam Clegg# RUN: obj2yaml %t.shmem.wasm | FileCheck %s --check-prefix=SHMEM
212a0bd6361SSam Clegg# RUN: llvm-objdump --disassemble-symbols=__wasm_start --no-show-raw-insn --no-leading-addr %t.shmem.wasm | FileCheck %s --check-prefix DISASSEM-SHMEM
213a0bd6361SSam Clegg
214a0bd6361SSam Clegg# SHMEM:         - Type:            START
215a0bd6361SSam Clegg# SHMEM-NEXT:      StartFunction:   6
216a0bd6361SSam Clegg
217a0bd6361SSam Clegg# DISASSEM-SHMEM-LABEL:  <__wasm_start>:
218a0bd6361SSam Clegg# DISASSEM-SHMEM-EMPTY:
219a0bd6361SSam Clegg# DISASSEM-SHMEM-NEXT:   call 5
220a0bd6361SSam Clegg# DISASSEM-SHMEM-NEXT:   call 4
221a0bd6361SSam Clegg# DISASSEM-SHMEM-NEXT:   end
222a0bd6361SSam Clegg
223a0bd6361SSam Clegg# SHMEM:         FunctionNames:
224a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           0
225a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            external_func
226a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           1
227a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_call_ctors
228a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           2
229a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_init_tls
230a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           3
231a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_apply_data_relocs
232a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           4
233a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_init_memory
234a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           5
235a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_apply_global_relocs
236a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           6
237a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            __wasm_start
238a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           7
239a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            foo
240a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           8
241a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            get_data_address
242a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           9
243a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            get_internal_func1_address
244a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           10
245a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            get_internal_func2_address
246a0bd6361SSam Clegg# SHMEM-NEXT:      - Index:           11
247a0bd6361SSam Clegg# SHMEM-NEXT:        Name:            _start
248