mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
d9c224e71b
If the reference-types feature is enabled, call_indirect will explicitly reference its corresponding function table via TABLE_NUMBER relocations against a table symbol. Also, as before, address-taken functions can also cause the function table to be created, only with reference-types they additionally cause a symbol table entry to be emitted. Differential Revision: https://reviews.llvm.org/D90948
205 lines
8.1 KiB
ArmAsm
205 lines
8.1 KiB
ArmAsm
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck %s
|
|
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=REF %s
|
|
|
|
# Verify that @GOT relocation entryes result in R_WASM_GLOBAL_INDEX_LEB against
|
|
# against the corrsponding function or data symbol and that the corresponding
|
|
# data symbols are imported as a wasm globals.
|
|
|
|
load_default_data:
|
|
.functype load_default_data () -> (i32)
|
|
global.get default_data@GOT
|
|
i32.load 0
|
|
end_function
|
|
|
|
load_default_func:
|
|
.functype load_default_func () -> (i32)
|
|
global.get default_func@GOT
|
|
i32.load 0
|
|
end_function
|
|
|
|
load_hidden_data:
|
|
.functype load_hidden_data () -> (i32)
|
|
global.get __memory_base
|
|
i32.const .L.hidden_data@MBREL
|
|
i32.add
|
|
end_function
|
|
|
|
load_hidden_func:
|
|
.functype load_hidden_func () -> (i32)
|
|
global.get __table_base
|
|
i32.const hidden_func@TBREL
|
|
i32.add
|
|
end_function
|
|
|
|
hidden_func:
|
|
.functype hidden_func () -> (i32)
|
|
i32.const 0
|
|
end_function
|
|
|
|
.section .rodata.hidden_data,"",@
|
|
.L.hidden_data:
|
|
.int8 100
|
|
.size .L.hidden_data, 1
|
|
|
|
#.hidden hidden_func
|
|
#.hidden hidden_data
|
|
.size default_data, 4
|
|
.functype default_func () -> (i32)
|
|
|
|
# CHECK: --- !WASM
|
|
# CHECK-NEXT: FileHeader:
|
|
# CHECK-NEXT: Version: 0x1
|
|
# CHECK-NEXT: Sections:
|
|
# CHECK-NEXT: - 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: Initial: 0x1
|
|
# CHECK-NEXT: - Module: env
|
|
# CHECK-NEXT: Field: default_func
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: SigIndex: 0
|
|
# 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: Initial: 0x1
|
|
# CHECK-NEXT: - Module: GOT.mem
|
|
# CHECK-NEXT: Field: default_data
|
|
# CHECK-NEXT: Kind: GLOBAL
|
|
# CHECK-NEXT: GlobalType: I32
|
|
# CHECK-NEXT: GlobalMutable: true
|
|
# CHECK-NEXT: - Module: GOT.func
|
|
# CHECK-NEXT: Field: default_func
|
|
# CHECK-NEXT: Kind: GLOBAL
|
|
# CHECK-NEXT: GlobalType: I32
|
|
# CHECK-NEXT: GlobalMutable: true
|
|
# 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: [ 5 ]
|
|
# CHECK-NEXT: - Type: DATACOUNT
|
|
# CHECK-NEXT: Count: 1
|
|
# CHECK-NEXT: - Type: CODE
|
|
# CHECK-NEXT: Relocations:
|
|
# CHECK-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB
|
|
# CHECK-NEXT: Index: 1
|
|
# CHECK-NEXT: Offset: 0x4
|
|
# CHECK-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB
|
|
# CHECK-NEXT: Index: 3
|
|
# CHECK-NEXT: Offset: 0x10
|
|
# CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB
|
|
# CHECK-NEXT: Index: 5
|
|
# CHECK-NEXT: Offset: 0x1C
|
|
# CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_REL_SLEB
|
|
# CHECK-NEXT: Index: 6
|
|
# CHECK-NEXT: Offset: 0x22
|
|
# CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB
|
|
# CHECK-NEXT: Index: 8
|
|
# CHECK-NEXT: Offset: 0x2C
|
|
# CHECK-NEXT: - Type: R_WASM_TABLE_INDEX_REL_SLEB
|
|
# CHECK-NEXT: Index: 9
|
|
# CHECK-NEXT: Offset: 0x32
|
|
# CHECK-NEXT: Functions:
|
|
# CHECK-NEXT: - Index: 1
|
|
# CHECK-NEXT: Locals: []
|
|
# CHECK-NEXT: Body: 2380808080002802000B
|
|
# CHECK-NEXT: - Index: 2
|
|
# CHECK-NEXT: Locals: []
|
|
# CHECK-NEXT: Body: 2381808080002802000B
|
|
# CHECK-NEXT: - Index: 3
|
|
# CHECK-NEXT: Locals: []
|
|
# CHECK-NEXT: Body: 2380808080004180808080006A0B
|
|
# CHECK-NEXT: - Index: 4
|
|
# CHECK-NEXT: Locals: []
|
|
# CHECK-NEXT: Body: 2380808080004180808080006A0B
|
|
# CHECK-NEXT: - Index: 5
|
|
# CHECK-NEXT: Locals: []
|
|
# CHECK-NEXT: Body: 41000B
|
|
# CHECK-NEXT: - Type: DATA
|
|
# 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: '64'
|
|
# 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: load_default_data
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Function: 1
|
|
# CHECK-NEXT: - Index: 1
|
|
# CHECK-NEXT: Kind: DATA
|
|
# CHECK-NEXT: Name: default_data
|
|
# CHECK-NEXT: Flags: [ UNDEFINED ]
|
|
# CHECK-NEXT: - Index: 2
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: Name: load_default_func
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Function: 2
|
|
# CHECK-NEXT: - Index: 3
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: Name: default_func
|
|
# CHECK-NEXT: Flags: [ UNDEFINED ]
|
|
# CHECK-NEXT: Function: 0
|
|
# CHECK-NEXT: - Index: 4
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: Name: load_hidden_data
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Function: 3
|
|
# CHECK-NEXT: - Index: 5
|
|
# CHECK-NEXT: Kind: DATA
|
|
# CHECK-NEXT: Name: __memory_base
|
|
# CHECK-NEXT: Flags: [ UNDEFINED ]
|
|
# CHECK-NEXT: - Index: 6
|
|
# CHECK-NEXT: Kind: DATA
|
|
# CHECK-NEXT: Name: .L.hidden_data
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Segment: 0
|
|
# CHECK-NEXT: Size: 1
|
|
# CHECK-NEXT: - Index: 7
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: Name: load_hidden_func
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Function: 4
|
|
# CHECK-NEXT: - Index: 8
|
|
# CHECK-NEXT: Kind: DATA
|
|
# CHECK-NEXT: Name: __table_base
|
|
# CHECK-NEXT: Flags: [ UNDEFINED ]
|
|
# CHECK-NEXT: - Index: 9
|
|
# CHECK-NEXT: Kind: FUNCTION
|
|
# CHECK-NEXT: Name: hidden_func
|
|
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
|
# CHECK-NEXT: Function: 5
|
|
# REF: - Index: 10
|
|
# REF-NEXT: Kind: TABLE
|
|
# REF-NEXT: Name: __indirect_function_table
|
|
# REF-NEXT: Flags: [ UNDEFINED, NO_STRIP ]
|
|
# REF-NEXT: Table: 0
|
|
# CHECK-NEXT: SegmentInfo:
|
|
# CHECK-NEXT: - Index: 0
|
|
# CHECK-NEXT: Name: .rodata.hidden_data
|
|
# CHECK-NEXT: Alignment: 0
|
|
# CHECK-NEXT: Flags: [ ]
|
|
# CHECK-NEXT: ...
|