1*cc1b9b68SWouter van Oortmerssen; RUN: llc < %s -asm-verbose=false -O2 | FileCheck %s 2*cc1b9b68SWouter van Oortmerssen; RUN: llc < %s -asm-verbose=false -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s 3*cc1b9b68SWouter van Oortmerssen 4*cc1b9b68SWouter van Oortmerssen; This tests pointer features that may codegen differently in wasm64. 5*cc1b9b68SWouter van Oortmerssen 6*cc1b9b68SWouter van Oortmerssentarget datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128" 7*cc1b9b68SWouter van Oortmerssentarget triple = "wasm64-unknown-unknown" 8*cc1b9b68SWouter van Oortmerssen 9*cc1b9b68SWouter van Oortmerssendefine void @bar(i32 %n) { 10*cc1b9b68SWouter van Oortmerssenentry: 11*cc1b9b68SWouter van Oortmerssen ret void 12*cc1b9b68SWouter van Oortmerssen} 13*cc1b9b68SWouter van Oortmerssen 14*cc1b9b68SWouter van Oortmerssendefine void @foo(void (i32)* %fp) { 15*cc1b9b68SWouter van Oortmerssenentry: 16*cc1b9b68SWouter van Oortmerssen call void %fp(i32 1) 17*cc1b9b68SWouter van Oortmerssen ret void 18*cc1b9b68SWouter van Oortmerssen} 19*cc1b9b68SWouter van Oortmerssen 20*cc1b9b68SWouter van Oortmerssendefine void @test() { 21*cc1b9b68SWouter van Oortmerssenentry: 22*cc1b9b68SWouter van Oortmerssen call void @foo(void (i32)* @bar) 23*cc1b9b68SWouter van Oortmerssen store void (i32)* @bar, void (i32)** @fptr 24*cc1b9b68SWouter van Oortmerssen ret void 25*cc1b9b68SWouter van Oortmerssen} 26*cc1b9b68SWouter van Oortmerssen 27*cc1b9b68SWouter van Oortmerssen@fptr = global void (i32)* @bar 28*cc1b9b68SWouter van Oortmerssen 29*cc1b9b68SWouter van Oortmerssen; For simplicity (and compatibility with UB C/C++ code) we keep all types 30*cc1b9b68SWouter van Oortmerssen; of pointers the same size, so function pointers (which are 32-bit indices 31*cc1b9b68SWouter van Oortmerssen; in Wasm) are represented as 64-bit until called. 32*cc1b9b68SWouter van Oortmerssen 33*cc1b9b68SWouter van Oortmerssen; CHECK: .functype foo (i64) -> () 34*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: i32.const 1 35*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: local.get 0 36*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: i32.wrap_i64 37*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: call_indirect (i32) -> () 38*cc1b9b68SWouter van Oortmerssen 39*cc1b9b68SWouter van Oortmerssen; CHECK: .functype test () -> () 40*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: i64.const bar 41*cc1b9b68SWouter van Oortmerssen; CHECK-NEXT: call foo 42*cc1b9b68SWouter van Oortmerssen 43*cc1b9b68SWouter van Oortmerssen 44*cc1b9b68SWouter van Oortmerssen; Check we're emitting a 64-bit reloc for `i64.const bar` and the global. 45*cc1b9b68SWouter van Oortmerssen 46*cc1b9b68SWouter van Oortmerssen; YAML: Memory: 47*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Flags: [ IS_64 ] 48*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Initial: 0x00000001 49*cc1b9b68SWouter van Oortmerssen 50*cc1b9b68SWouter van Oortmerssen; YAML: - Type: CODE 51*cc1b9b68SWouter van Oortmerssen; YAML: - Type: R_WASM_TABLE_INDEX_SLEB64 52*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Index: 0 53*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Offset: 0x00000016 54*cc1b9b68SWouter van Oortmerssen 55*cc1b9b68SWouter van Oortmerssen; YAML: - Type: DATA 56*cc1b9b68SWouter van Oortmerssen; YAML: - Type: R_WASM_TABLE_INDEX_I64 57*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Index: 0 58*cc1b9b68SWouter van Oortmerssen; YAML-NEXT: Offset: 0x00000006 59