| # RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types < %s | FileCheck %s |
| # RUN: llvm-mc -show-encoding -triple=wasm32-unknown-unknown -mattr=+reference-types < %s | FileCheck -check-prefix=ENC %s |
| # RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck -check-prefix=BIN %s |
| |
| # Creating several empty tables |
| |
| # CHECK: .tabletype foo, externref |
| # CHECK: foo: |
| .tabletype foo, externref |
| foo: |
| |
| |
| # CHECK: bar: |
| # CHECK-NEXT: .tabletype bar, funcref |
| bar: |
| .tabletype bar, funcref |
| |
| table1: |
| .tabletype table1, funcref, 42 |
| table2: |
| .tabletype table2, funcref, 42, 100 |
| |
| # Table instructions |
| |
| # CHECK: copy_tables: |
| # CHECK-NEXT: .functype copy_tables (i32, i32) -> () |
| # CHECK-NEXT: local.get 0 |
| # CHECK-NEXT: local.get 1 |
| # CHECK: table.size table1 |
| # CHECK: table.copy table1, table2 |
| # CHECK-NEXT: end_function |
| copy_tables: |
| .functype copy_tables (i32, i32) -> () |
| local.get 0 |
| local.get 1 |
| |
| # ENC: table.size table1 # encoding: [0xfc,0x10,0x80'A',0x80'A',0x80'A',0x80'A',A] |
| table.size table1 |
| |
| # ENC: table.copy table1, table2 # encoding: [0xfc,0x0e,0x80'A',0x80'A',0x80'A',0x80'A',A,0x80'B',0x80'B',0x80'B',0x80'B',B] |
| table.copy table1, table2 |
| end_function |
| |
| # CHECK: table_get: |
| # CHECK-NEXT: .functype table_get (i32) -> (externref) |
| # CHECK-NEXT: local.get 0 |
| # CHECK: table.get foo |
| # CHECK-NEXT: end_function |
| table_get: |
| .functype table_get (i32) -> (externref) |
| local.get 0 |
| |
| # ENC: table.get foo # encoding: [0x25,0x80'A',0x80'A',0x80'A',0x80'A',A] |
| table.get foo |
| end_function |
| |
| # CHECK: table_set: |
| # CHECK-NEXT: .functype table_set (i32, externref) -> () |
| # CHECK-NEXT: local.get 0 |
| # CHECK-NEXT: local.get 1 |
| # CHECK: table.set foo |
| # CHECK-NEXT: end_function |
| table_set: |
| .functype table_set (i32, externref) -> () |
| local.get 0 |
| local.get 1 |
| |
| # ENC: table.set foo # encoding: [0x26,0x80'A',0x80'A',0x80'A',0x80'A',A] |
| table.set foo |
| end_function |
| |
| # CHECK: table_grow: |
| # CHECK-NEXT: .functype table_grow (i32) -> (i32) |
| # CHECK-NEXT: i32.const 0 |
| # CHECK-NEXT: table.get foo |
| # CHECK-NEXT: local.get 0 |
| # CHECK: table.grow foo |
| # CHECK-NEXT: local.get 0 |
| # CHECK-NEXT: i32.add |
| # CHECK-NEXT: end_function |
| table_grow: |
| .functype table_grow (i32) -> (i32) |
| i32.const 0 |
| table.get foo |
| local.get 0 |
| |
| # ENC: table.grow foo # encoding: [0xfc,0x0f,0x80'A',0x80'A',0x80'A',0x80'A',A] |
| table.grow foo |
| local.get 0 |
| i32.add |
| end_function |
| |
| # CHECK: table_fill: |
| # CHECK-NEXT: .functype table_fill (i32, i32) -> () |
| # CHECK-NEXT: local.get 0 |
| # CHECK-NEXT: i32.const 0 |
| # CHECK-NEXT: table.get table1 |
| # CHECK-NEXT: local.get 1 |
| # CHECK: table.fill table1 |
| # CHECK-NEXT: end_function |
| table_fill: |
| .functype table_fill (i32, i32) -> () |
| local.get 0 |
| i32.const 0 |
| table.get table1 |
| local.get 1 |
| |
| # ENC: table.fill table1 # encoding: [0xfc,0x11,0x80'A',0x80'A',0x80'A',0x80'A',A] |
| table.fill table1 |
| end_function |
| |
| # BIN: - Type: TABLE |
| # BIN-NEXT: Tables: |
| # BIN-NEXT: - Index: 0 |
| # BIN-NEXT: ElemType: EXTERNREF |
| # BIN-NEXT: Limits: |
| # BIN-NEXT: Minimum: 0x0 |
| # BIN-NEXT: - Index: 1 |
| # BIN-NEXT: ElemType: FUNCREF |
| # BIN-NEXT: Limits: |
| # BIN-NEXT: Minimum: 0x0 |
| # BIN-NEXT: - Index: 2 |
| # BIN-NEXT: ElemType: FUNCREF |
| # BIN-NEXT: Limits: |
| # BIN-NEXT: Minimum: 0x2A |
| # BIN-NEXT: - Index: 3 |
| # BIN-NEXT: ElemType: FUNCREF |
| # BIN-NEXT: Limits: |
| # BIN-NEXT: Flags: [ HAS_MAX ] |
| # BIN-NEXT: Minimum: 0x2A |
| # BIN-NEXT: Maximum: 0x64 |
| |
| # BIN: - Type: CODE |
| # BIN-NEXT: Relocations: |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 2 |
| # BIN-NEXT: Offset: 0x9 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 2 |
| # BIN-NEXT: Offset: 0x10 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 3 |
| # BIN-NEXT: Offset: 0x15 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 0 |
| # BIN-NEXT: Offset: 0x20 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 0 |
| # BIN-NEXT: Offset: 0x2D |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 0 |
| # BIN-NEXT: Offset: 0x38 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 0 |
| # BIN-NEXT: Offset: 0x41 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 2 |
| # BIN-NEXT: Offset: 0x51 |
| # BIN-NEXT: - Type: R_WASM_TABLE_NUMBER_LEB |
| # BIN-NEXT: Index: 2 |
| # BIN-NEXT: Offset: 0x5A |
| # BIN-NEXT: Functions: |
| # BIN-NEXT: - Index: 0 |
| # BIN-NEXT: Locals: [] |
| # BIN-NEXT: Body: 20002001FC108280808000FC0E828080800083808080000B |
| # BIN-NEXT: - Index: 1 |
| # BIN-NEXT: Locals: [] |
| # BIN-NEXT: Body: 20002580808080000B |
| # BIN-NEXT: - Index: 2 |
| # BIN-NEXT: Locals: [] |
| # BIN-NEXT: Body: 200020012680808080000B |
| # BIN-NEXT: - Index: 3 |
| # BIN-NEXT: Locals: [] |
| # BIN-NEXT: Body: 41002580808080002000FC0F808080800020006A0B |
| # BIN-NEXT: - Index: 4 |
| # BIN-NEXT: Locals: [] |
| # BIN-NEXT: Body: 200041002582808080002001FC1182808080000B |
| |
| # BIN: - Type: CUSTOM |
| # BIN-NEXT: Name: linking |
| # BIN-NEXT: Version: 2 |
| # BIN-NEXT: SymbolTable: |
| # BIN-NEXT: - Index: 0 |
| # BIN-NEXT: Kind: TABLE |
| # BIN-NEXT: Name: foo |
| # BIN-NEXT: Flags: [ BINDING_LOCAL ] |
| # BIN-NEXT: Table: 0 |
| # BIN-NEXT: - Index: 1 |
| # BIN-NEXT: Kind: TABLE |
| # BIN-NEXT: Name: bar |
| # BIN-NEXT: Flags: [ BINDING_LOCAL ] |
| # BIN-NEXT: Table: 1 |
| # BIN-NEXT: - Index: 2 |
| # BIN-NEXT: Kind: TABLE |
| # BIN-NEXT: Name: table1 |
| # BIN-NEXT: Flags: [ BINDING_LOCAL ] |
| # BIN-NEXT: Table: 2 |
| # BIN-NEXT: - Index: 3 |
| # BIN-NEXT: Kind: TABLE |
| # BIN-NEXT: Name: table2 |
| # BIN-NEXT: Flags: [ BINDING_LOCAL ] |
| # BIN-NEXT: Table: 3 |
| # BIN-NEXT: - Index: 4 |