| # RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=CHECK %s |
| # RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=REF %s |
| |
| # 'foo_alias()' is weak alias of function 'foo()' |
| # 'bar_alias' is weak alias of global variable 'bar' |
| # Generates two exports of the same function, one of them weak |
| |
| .functype foo_alias () -> (i32) |
| |
| foo: |
| .hidden foo |
| .globl foo |
| .functype foo () -> (i32) |
| i32.const 0 |
| end_function |
| |
| call_direct: |
| .hidden call_direct |
| .globl call_direct |
| .functype call_direct () -> (i32) |
| call foo |
| end_function |
| |
| call_alias: |
| .hidden call_alias |
| .globl call_alias |
| .functype call_alias () -> (i32) |
| call foo_alias |
| end_function |
| |
| call_direct_ptr: |
| .hidden call_direct_ptr |
| .globl call_direct_ptr |
| .functype call_direct_ptr () -> (i32) |
| i32.const 0 |
| i32.load direct_address |
| call_indirect () -> (i32) |
| end_function |
| |
| call_alias_ptr: |
| .hidden call_alias_ptr |
| .globl call_alias_ptr |
| .functype call_alias_ptr () -> (i32) |
| i32.const 0 |
| i32.load alias_address |
| call_indirect () -> (i32) |
| end_function |
| |
| .section .data.bar,"",@ |
| bar: |
| .int32 7 |
| .size bar, 4 |
| .globl bar |
| .p2align 3 |
| |
| .section .data.direct_address,"",@ |
| direct_address: |
| .int32 foo |
| .size direct_address, 4 |
| .globl direct_address |
| .p2align 3 |
| |
| .section .data.alias_address,"",@ |
| alias_address: |
| .int32 foo_alias |
| .size alias_address, 4 |
| .globl alias_address |
| .p2align 3 |
| |
| # Define Aliases |
| .set foo_alias, foo |
| .weak foo_alias |
| .type foo_alias,@function |
| .hidden foo_alias |
| |
| .set bar_alias, bar |
| .weak bar_alias |
| .hidden bar_alias |
| |
| # CHECK: - Type: TYPE |
| # CHECK-NEXT: Signatures: |
| # CHECK-NEXT: - Index: 0 |
| # CHECK-NEXT: ParamTypes: [] |
| # CHECK-NEXT: ReturnTypes: |
| # CHECK-NEXT: - I32 |
| # CHECK-NEXT: - Type: IMPORT |
| # CHECK-NEXT: Imports: |
| # CHECK-NEXT: - Module: env |
| # CHECK-NEXT: Field: __linear_memory |
| # CHECK-NEXT: Kind: MEMORY |
| # CHECK-NEXT: Memory: |
| # CHECK-NEXT: Minimum: 0x1 |
| # CHECK-NEXT: - Module: env |
| # CHECK-NEXT: Field: __indirect_function_table |
| # CHECK-NEXT: Kind: TABLE |
| # CHECK-NEXT: Table: |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: ElemType: FUNCREF |
| # CHECK-NEXT: Limits: |
| # CHECK-NEXT: Minimum: 0x1 |
| # CHECK-NEXT: - Type: FUNCTION |
| # CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ] |
| # CHECK-NEXT: - Type: ELEM |
| # CHECK-NEXT: Segments: |
| # CHECK-NEXT: - Offset: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 1 |
| # CHECK-NEXT: Functions: [ 0 ] |
| # CHECK-NEXT: - Type: DATACOUNT |
| # CHECK-NEXT: Count: 3 |
| # CHECK-NEXT: - Type: CODE |
| # CHECK-NEXT: Relocations: |
| # CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: Offset: 0x9 |
| # CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB |
| # CHECK-NEXT: Index: 3 |
| # CHECK-NEXT: Offset: 0x12 |
| # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB |
| # CHECK-NEXT: Index: 5 |
| # CHECK-NEXT: Offset: 0x1E |
| # CHECK-NEXT: - Type: R_WASM_TYPE_INDEX_LEB |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: Offset: 0x24 |
| # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB |
| # CHECK-NEXT: Index: 7 |
| # CHECK-NEXT: Offset: 0x31 |
| # CHECK-NEXT: - Type: R_WASM_TYPE_INDEX_LEB |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: Offset: 0x37 |
| # CHECK-NEXT: Functions: |
| # CHECK-NEXT: - Index: 0 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 41000B |
| # CHECK-NEXT: - Index: 1 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 1080808080000B |
| # CHECK-NEXT: - Index: 2 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 1080808080000B |
| # CHECK-NEXT: - Index: 3 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 410028028880808000118080808000000B |
| # CHECK-NEXT: - Index: 4 |
| # CHECK-NEXT: Locals: [] |
| # CHECK-NEXT: Body: 410028029080808000118080808000000B |
| # CHECK-NEXT: - Type: DATA |
| # CHECK-NEXT: Relocations: |
| # CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32 |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: Offset: 0x13 |
| # CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_I32 |
| # CHECK-NEXT: Index: 3 |
| # CHECK-NEXT: Offset: 0x20 |
| # CHECK-NEXT: Segments: |
| # CHECK-NEXT: - SectionOffset: 6 |
| # CHECK-NEXT: InitFlags: 0 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 0 |
| # CHECK-NEXT: Content: '0700000000000000' |
| # CHECK-NEXT: - SectionOffset: 19 |
| # CHECK-NEXT: InitFlags: 0 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 8 |
| # CHECK-NEXT: Content: '0100000000000000' |
| # CHECK-NEXT: - SectionOffset: 32 |
| # CHECK-NEXT: InitFlags: 0 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Opcode: I32_CONST |
| # CHECK-NEXT: Value: 16 |
| # CHECK-NEXT: Content: '0100000000000000' |
| # CHECK-NEXT: - Type: CUSTOM |
| # CHECK-NEXT: Name: linking |
| # CHECK-NEXT: Version: 2 |
| # CHECK-NEXT: SymbolTable: |
| # CHECK-NEXT: - Index: 0 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: foo |
| # CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # CHECK-NEXT: Function: 0 |
| # CHECK-NEXT: - Index: 1 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: call_direct |
| # CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # CHECK-NEXT: Function: 1 |
| # CHECK-NEXT: - Index: 2 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: call_alias |
| # CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # CHECK-NEXT: Function: 2 |
| # CHECK-NEXT: - Index: 3 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: foo_alias |
| # CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ] |
| # CHECK-NEXT: Function: 0 |
| # CHECK-NEXT: - Index: 4 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: call_direct_ptr |
| # CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # CHECK-NEXT: Function: 3 |
| # CHECK-NEXT: - Index: 5 |
| # CHECK-NEXT: Kind: DATA |
| # CHECK-NEXT: Name: direct_address |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: Segment: 1 |
| # CHECK-NEXT: Size: 4 |
| # CHECK-NEXT: - Index: 6 |
| # CHECK-NEXT: Kind: FUNCTION |
| # CHECK-NEXT: Name: call_alias_ptr |
| # CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # CHECK-NEXT: Function: 4 |
| # CHECK-NEXT: - Index: 7 |
| # CHECK-NEXT: Kind: DATA |
| # CHECK-NEXT: Name: alias_address |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: Segment: 2 |
| # CHECK-NEXT: Size: 4 |
| # CHECK-NEXT: - Index: 8 |
| # CHECK-NEXT: Kind: DATA |
| # CHECK-NEXT: Name: bar |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: Segment: 0 |
| # CHECK-NEXT: Size: 4 |
| # CHECK-NEXT: - Index: 9 |
| # CHECK-NEXT: Kind: DATA |
| # CHECK-NEXT: Name: bar_alias |
| # CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ] |
| # CHECK-NEXT: Segment: 0 |
| # CHECK-NEXT: Size: 4 |
| # CHECK-NEXT: SegmentInfo: |
| # CHECK-NEXT: - Index: 0 |
| # CHECK-NEXT: Name: .data.bar |
| # CHECK-NEXT: Alignment: 3 |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: - Index: 1 |
| # CHECK-NEXT: Name: .data.direct_address |
| # CHECK-NEXT: Alignment: 3 |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: - Index: 2 |
| # CHECK-NEXT: Name: .data.alias_address |
| # CHECK-NEXT: Alignment: 3 |
| # CHECK-NEXT: Flags: [ ] |
| # CHECK-NEXT: ... |
| |
| # REF: - Type: TYPE |
| # REF-NEXT: Signatures: |
| # REF-NEXT: - Index: 0 |
| # REF-NEXT: ParamTypes: [] |
| # REF-NEXT: ReturnTypes: |
| # REF-NEXT: - I32 |
| # REF-NEXT: - Type: IMPORT |
| # REF-NEXT: Imports: |
| # REF-NEXT: - Module: env |
| # REF-NEXT: Field: __linear_memory |
| # REF-NEXT: Kind: MEMORY |
| # REF-NEXT: Memory: |
| # REF-NEXT: Minimum: 0x1 |
| # REF-NEXT: - Module: env |
| # REF-NEXT: Field: __indirect_function_table |
| # REF-NEXT: Kind: TABLE |
| # REF-NEXT: Table: |
| # REF-NEXT: Index: 0 |
| # REF-NEXT: ElemType: FUNCREF |
| # REF-NEXT: Limits: |
| # REF-NEXT: Minimum: 0x1 |
| # REF-NEXT: - Type: FUNCTION |
| # REF-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ] |
| # REF-NEXT: - Type: ELEM |
| # REF-NEXT: Segments: |
| # REF-NEXT: - Offset: |
| # REF-NEXT: Opcode: I32_CONST |
| # REF-NEXT: Value: 1 |
| # REF-NEXT: Functions: [ 0 ] |
| # REF-NEXT: - Type: DATACOUNT |
| # REF-NEXT: Count: 3 |
| # REF-NEXT: - Type: CODE |
| # REF-NEXT: Relocations: |
| # REF-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB |
| # REF-NEXT: Index: 0 |
| # REF-NEXT: Offset: 0x9 |
| # REF-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB |
| # REF-NEXT: Index: 3 |
| # REF-NEXT: Offset: 0x12 |
| # REF-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB |
| # REF-NEXT: Index: 5 |
| # REF-NEXT: Offset: 0x1E |
| # REF-NEXT: - Type: R_WASM_TYPE_INDEX_LEB |
| # REF-NEXT: Index: 0 |
| # REF-NEXT: Offset: 0x24 |
| # REF-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # REF-NEXT: Index: 6 |
| # REF-NEXT: Offset: 0x29 |
| # REF-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB |
| # REF-NEXT: Index: 8 |
| # REF-NEXT: Offset: 0x35 |
| # REF-NEXT: - Type: R_WASM_TYPE_INDEX_LEB |
| # REF-NEXT: Index: 0 |
| # REF-NEXT: Offset: 0x3B |
| # REF-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # REF-NEXT: Index: 6 |
| # REF-NEXT: Offset: 0x40 |
| # REF-NEXT: Functions: |
| # REF-NEXT: - Index: 0 |
| # REF-NEXT: Locals: [] |
| # REF-NEXT: Body: 41000B |
| # REF-NEXT: - Index: 1 |
| # REF-NEXT: Locals: [] |
| # REF-NEXT: Body: 1080808080000B |
| # REF-NEXT: - Index: 2 |
| # REF-NEXT: Locals: [] |
| # REF-NEXT: Body: 1080808080000B |
| # REF-NEXT: - Index: 3 |
| # REF-NEXT: Locals: [] |
| # REF-NEXT: Body: 41002802888080800011808080800080808080000B |
| # REF-NEXT: - Index: 4 |
| # REF-NEXT: Locals: [] |
| # REF-NEXT: Body: 41002802908080800011808080800080808080000B |
| # REF-NEXT: - Type: DATA |
| # REF-NEXT: Relocations: |
| # REF-NEXT: - Type: R_WASM_TABLE_INDEX_I32 |
| # REF-NEXT: Index: 0 |
| # REF-NEXT: Offset: 0x13 |
| # REF-NEXT: - Type: R_WASM_TABLE_INDEX_I32 |
| # REF-NEXT: Index: 3 |
| # REF-NEXT: Offset: 0x20 |
| # REF-NEXT: Segments: |
| # REF-NEXT: - SectionOffset: 6 |
| # REF-NEXT: InitFlags: 0 |
| # REF-NEXT: Offset: |
| # REF-NEXT: Opcode: I32_CONST |
| # REF-NEXT: Value: 0 |
| # REF-NEXT: Content: '0700000000000000' |
| # REF-NEXT: - SectionOffset: 19 |
| # REF-NEXT: InitFlags: 0 |
| # REF-NEXT: Offset: |
| # REF-NEXT: Opcode: I32_CONST |
| # REF-NEXT: Value: 8 |
| # REF-NEXT: Content: '0100000000000000' |
| # REF-NEXT: - SectionOffset: 32 |
| # REF-NEXT: InitFlags: 0 |
| # REF-NEXT: Offset: |
| # REF-NEXT: Opcode: I32_CONST |
| # REF-NEXT: Value: 16 |
| # REF-NEXT: Content: '0100000000000000' |
| # REF-NEXT: - Type: CUSTOM |
| # REF-NEXT: Name: linking |
| # REF-NEXT: Version: 2 |
| # REF-NEXT: SymbolTable: |
| # REF-NEXT: - Index: 0 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: foo |
| # REF-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # REF-NEXT: Function: 0 |
| # REF-NEXT: - Index: 1 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: call_direct |
| # REF-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # REF-NEXT: Function: 1 |
| # REF-NEXT: - Index: 2 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: call_alias |
| # REF-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # REF-NEXT: Function: 2 |
| # REF-NEXT: - Index: 3 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: foo_alias |
| # REF-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ] |
| # REF-NEXT: Function: 0 |
| # REF-NEXT: - Index: 4 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: call_direct_ptr |
| # REF-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # REF-NEXT: Function: 3 |
| # REF-NEXT: - Index: 5 |
| # REF-NEXT: Kind: DATA |
| # REF-NEXT: Name: direct_address |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: Segment: 1 |
| # REF-NEXT: Size: 4 |
| # REF-NEXT: - Index: 6 |
| # REF-NEXT: Kind: TABLE |
| # REF-NEXT: Name: __indirect_function_table |
| # REF-NEXT: Flags: [ UNDEFINED, NO_STRIP ] |
| # REF-NEXT: Table: 0 |
| # REF-NEXT: - Index: 7 |
| # REF-NEXT: Kind: FUNCTION |
| # REF-NEXT: Name: call_alias_ptr |
| # REF-NEXT: Flags: [ VISIBILITY_HIDDEN ] |
| # REF-NEXT: Function: 4 |
| # REF-NEXT: - Index: 8 |
| # REF-NEXT: Kind: DATA |
| # REF-NEXT: Name: alias_address |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: Segment: 2 |
| # REF-NEXT: Size: 4 |
| # REF-NEXT: - Index: 9 |
| # REF-NEXT: Kind: DATA |
| # REF-NEXT: Name: bar |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: Segment: 0 |
| # REF-NEXT: Size: 4 |
| # REF-NEXT: - Index: 10 |
| # REF-NEXT: Kind: DATA |
| # REF-NEXT: Name: bar_alias |
| # REF-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ] |
| # REF-NEXT: Segment: 0 |
| # REF-NEXT: Size: 4 |
| # REF-NEXT: SegmentInfo: |
| # REF-NEXT: - Index: 0 |
| # REF-NEXT: Name: .data.bar |
| # REF-NEXT: Alignment: 3 |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: - Index: 1 |
| # REF-NEXT: Name: .data.direct_address |
| # REF-NEXT: Alignment: 3 |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: - Index: 2 |
| # REF-NEXT: Name: .data.alias_address |
| # REF-NEXT: Alignment: 3 |
| # REF-NEXT: Flags: [ ] |
| # REF-NEXT: ... |
| |
| # CHECK-SYMS: SYMBOL TABLE: |
| # CHECK-SYMS-NEXT: 00000001 g F CODE .hidden foo |
| # CHECK-SYMS-NEXT: 00000006 g F CODE .hidden call_direct |
| # CHECK-SYMS-NEXT: 0000000f g F CODE .hidden call_alias |
| # CHECK-SYMS-NEXT: 00000001 gw F CODE .hidden foo_alias |
| # CHECK-SYMS-NEXT: 00000018 g F CODE .hidden call_direct_ptr |
| # CHECK-SYMS-NEXT: 00000008 g O DATA direct_address |
| # CHECK-SYMS-NEXT: 0000002b g F CODE .hidden call_alias_ptr |
| # CHECK-SYMS-NEXT: 00000010 g O DATA alias_address |
| # CHECK-SYMS-NEXT: 00000000 g O DATA bar |
| # CHECK-SYMS-NEXT: 00000000 gw O DATA .hidden bar_alias |