# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s # RUN: wasm-ld --no-entry %t.o -o %t.wasm # RUN: obj2yaml %t.wasm | FileCheck %s # This test defines a command with two exported functions, as well as a static # constructor and a static destructor. Check that the exports, constructor, and # destructor are all set up properly. .globl foo_i32 foo_i32: .functype foo_i32 (i32, i32) -> (i32) local.get 0 local.get 1 i32.add end_function .globl foo_f64 foo_f64: .functype foo_f64 (f64, f64) -> (f64) local.get 0 local.get 1 f64.add end_function .globl some_ctor some_ctor: .functype some_ctor () -> () end_function .globl some_dtor some_dtor: .functype some_dtor () -> () end_function .hidden __cxa_atexit .globl __cxa_atexit __cxa_atexit: .functype __cxa_atexit (i32, i32, i32) -> (i32) i32.const 0 end_function .section .text..Lcall_dtors.1,"",@ .Lcall_dtors.1: .functype .Lcall_dtors.1 (i32) -> () call some_dtor end_function .section .text..Lregister_call_dtors.1,"",@ .Lregister_call_dtors.1: .functype .Lregister_call_dtors.1 () -> () block i32.const .Lcall_dtors.1 i32.const 0 i32.const 0 call __cxa_atexit i32.eqz br_if 0 unreachable .LBB6_2: end_block end_function .section .init_array.1,"",@ .p2align 2 .int32 some_ctor .int32 .Lregister_call_dtors.1 .export_name foo_i32, foo_i32 .export_name foo_f64, foo_f64 # CHECK: - Type: EXPORT # CHECK-NEXT: Exports: # CHECK-NEXT: - Name: memory # CHECK-NEXT: Kind: MEMORY # CHECK-NEXT: Index: 0 # CHECK-NEXT: - Name: foo_i32 # CHECK-NEXT: Kind: FUNCTION # CHECK-NEXT: Index: 8 # CHECK-NEXT: - Name: foo_f64 # CHECK-NEXT: Kind: FUNCTION # CHECK-NEXT: Index: 9 # CHECK: - Type: CODE # CHECK: - Index: 8 # CHECK-NEXT: Locals: [] # CHECK-NEXT: Body: 10002000200110010B # CHECK-NEXT: - Index: 9 # CHECK-NEXT: Locals: [] # CHECK-NEXT: Body: 10002000200110020B # CHECK: - Type: CUSTOM # CHECK-NEXT: Name: name # CHECK-NEXT: FunctionNames: # CHECK-NEXT: - Index: 0 # CHECK-NEXT: Name: __wasm_call_ctors # CHECK-NEXT: - Index: 1 # CHECK-NEXT: Name: foo_i32 # CHECK-NEXT: - Index: 2 # CHECK-NEXT: Name: foo_f64 # CHECK-NEXT: - Index: 3 # CHECK-NEXT: Name: some_ctor # CHECK-NEXT: - Index: 4 # CHECK-NEXT: Name: some_dtor # CHECK-NEXT: - Index: 5 # CHECK-NEXT: Name: __cxa_atexit # CHECK-NEXT: - Index: 6 # CHECK-NEXT: Name: .Lcall_dtors.1 # CHECK-NEXT: - Index: 7 # CHECK-NEXT: Name: .Lregister_call_dtors.1 # CHECK-NEXT: - Index: 8 # CHECK-NEXT: Name: foo_i32.command_export # CHECK-NEXT: - Index: 9 # CHECK-NEXT: Name: foo_f64.command_export