1# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s 2# RUN: wasm-ld --no-entry %t.o -o %t.wasm 3# RUN: obj2yaml %t.wasm | FileCheck %s 4 5# This test defines a command with two exported functions, as well as a static 6# constructor and a static destructor. Check that the exports, constructor, and 7# destructor are all set up properly. 8 9 .globl foo_i32 10foo_i32: 11 .functype foo_i32 (i32, i32) -> (i32) 12 local.get 0 13 local.get 1 14 i32.add 15 end_function 16 17 .globl foo_f64 18foo_f64: 19 .functype foo_f64 (f64, f64) -> (f64) 20 local.get 0 21 local.get 1 22 f64.add 23 end_function 24 25 .globl some_ctor 26some_ctor: 27 .functype some_ctor () -> () 28 end_function 29 30 .globl some_dtor 31some_dtor: 32 .functype some_dtor () -> () 33 end_function 34 35 .hidden __cxa_atexit 36 .globl __cxa_atexit 37__cxa_atexit: 38 .functype __cxa_atexit (i32, i32, i32) -> (i32) 39 i32.const 0 40 end_function 41 42 .section .text..Lcall_dtors.1,"",@ 43.Lcall_dtors.1: 44 .functype .Lcall_dtors.1 (i32) -> () 45 call some_dtor 46 end_function 47 48 .section .text..Lregister_call_dtors.1,"",@ 49.Lregister_call_dtors.1: 50 .functype .Lregister_call_dtors.1 () -> () 51 block 52 i32.const .Lcall_dtors.1 53 i32.const 0 54 i32.const 0 55 call __cxa_atexit 56 i32.eqz 57 br_if 0 58 unreachable 59.LBB6_2: 60 end_block 61 end_function 62 63 .section .init_array.1,"",@ 64 .p2align 2 65 .int32 some_ctor 66 .int32 .Lregister_call_dtors.1 67 .export_name foo_i32, foo_i32 68 .export_name foo_f64, foo_f64 69 70# CHECK: - Type: EXPORT 71# CHECK-NEXT: Exports: 72# CHECK-NEXT: - Name: memory 73# CHECK-NEXT: Kind: MEMORY 74# CHECK-NEXT: Index: 0 75# CHECK-NEXT: - Name: foo_i32 76# CHECK-NEXT: Kind: FUNCTION 77# CHECK-NEXT: Index: 8 78# CHECK-NEXT: - Name: foo_f64 79# CHECK-NEXT: Kind: FUNCTION 80# CHECK-NEXT: Index: 9 81 82# CHECK: - Type: CODE 83 84# CHECK: - Index: 8 85# CHECK-NEXT: Locals: [] 86# CHECK-NEXT: Body: 10002000200110010B 87# CHECK-NEXT: - Index: 9 88# CHECK-NEXT: Locals: [] 89# CHECK-NEXT: Body: 10002000200110020B 90 91# CHECK: - Type: CUSTOM 92# CHECK-NEXT: Name: name 93# CHECK-NEXT: FunctionNames: 94# CHECK-NEXT: - Index: 0 95# CHECK-NEXT: Name: __wasm_call_ctors 96# CHECK-NEXT: - Index: 1 97# CHECK-NEXT: Name: foo_i32 98# CHECK-NEXT: - Index: 2 99# CHECK-NEXT: Name: foo_f64 100# CHECK-NEXT: - Index: 3 101# CHECK-NEXT: Name: some_ctor 102# CHECK-NEXT: - Index: 4 103# CHECK-NEXT: Name: some_dtor 104# CHECK-NEXT: - Index: 5 105# CHECK-NEXT: Name: __cxa_atexit 106# CHECK-NEXT: - Index: 6 107# CHECK-NEXT: Name: .Lcall_dtors.1 108# CHECK-NEXT: - Index: 7 109# CHECK-NEXT: Name: .Lregister_call_dtors.1 110# CHECK-NEXT: - Index: 8 111# CHECK-NEXT: Name: foo_i32.command_export 112# CHECK-NEXT: - Index: 9 113# CHECK-NEXT: Name: foo_f64.command_export 114