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