This fixes bug <https://github.com/llvm/llvm-project/issues/54022>. For now this means that defined functions will have two .functype directives emitted. Given discussion in that bug has suggested interest in moving towards using something other than .functype to mark the beginning of a function (which would, as a side-effect, solve this issue), this patch doesn't attempt to avoid that duplication. Some test cases that used CHECK-LABEL: foo rather than CHECK-LABEL: foo: are broken by this change. This patch updates those test cases to always have a colon at the end of the CHECK-LABEL string. Differential Revision: https://reviews.llvm.org/D122134
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 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-LABEL: foo:
|
|
; 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: Minimum: 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
|