The WebAssembly text and binary formats have different operand orders for the "type" and "table" fields of call_indirect (and return_call_indirect). In LLVM we use the binary order for the MCInstr, but when we produce or consume the text format we should use the text order. For compilation units targetting WebAssembly 1.0 (without the reference types feature), we omit the table operand entirely. Differential Revision: https://reviews.llvm.org/D97761
65 lines
1.7 KiB
LLVM
65 lines
1.7 KiB
LLVM
; RUN: llc < %s -asm-verbose=false -O2 | FileCheck %s
|
|
; RUN: llc < %s -asm-verbose=false -mattr=+reference-types -O2 | FileCheck --check-prefix=REF %s
|
|
; RUN: llc < %s -asm-verbose=false -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s
|
|
|
|
; This tests pointer features that may codegen differently in wasm64.
|
|
|
|
target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128"
|
|
target triple = "wasm64-unknown-unknown"
|
|
|
|
define void @bar(i32 %n) {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
define void @foo(void (i32)* %fp) {
|
|
entry:
|
|
call void %fp(i32 1)
|
|
ret void
|
|
}
|
|
|
|
define void @test() {
|
|
entry:
|
|
call void @foo(void (i32)* @bar)
|
|
store void (i32)* @bar, void (i32)** @fptr
|
|
ret void
|
|
}
|
|
|
|
@fptr = global void (i32)* @bar
|
|
|
|
; For simplicity (and compatibility with UB C/C++ code) we keep all types
|
|
; of pointers the same size, so function pointers (which are 32-bit indices
|
|
; in Wasm) are represented as 64-bit until called.
|
|
|
|
; CHECK: .functype foo (i64) -> ()
|
|
; CHECK-NEXT: i32.const 1
|
|
; CHECK-NEXT: local.get 0
|
|
; CHECK-NEXT: i32.wrap_i64
|
|
; CHECK-NEXT: call_indirect (i32) -> ()
|
|
; REF: call_indirect __indirect_function_table, (i32) -> ()
|
|
|
|
; CHECK: .functype test () -> ()
|
|
; CHECK-NEXT: i64.const bar
|
|
; CHECK-NEXT: call foo
|
|
|
|
|
|
; Check we're emitting a 64-bit relocs for the call_indirect, the
|
|
; `i64.const bar` reference in code, and the global.
|
|
|
|
; YAML: Memory:
|
|
; YAML-NEXT: Flags: [ IS_64 ]
|
|
; YAML-NEXT: Initial: 0x1
|
|
|
|
; YAML: - Type: CODE
|
|
; YAML: - Type: R_WASM_TABLE_INDEX_SLEB64
|
|
; YAML-NEXT: Index: 0
|
|
; YAML-NEXT: Offset: 0x16
|
|
; YAML: - Type: R_WASM_TABLE_INDEX_SLEB64
|
|
; YAML-NEXT: Index: 0
|
|
; YAML-NEXT: Offset: 0x29
|
|
|
|
; YAML: - Type: DATA
|
|
; YAML: - Type: R_WASM_TABLE_INDEX_I64
|
|
; YAML-NEXT: Index: 0
|
|
; YAML-NEXT: Offset: 0x6
|