From 4e9724ce88569a70f21ecf83470cb13961bb29d3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 27 Dec 2023 00:03:21 +0000 Subject: Handle function pointer size being i32 on wasm64 --- .../org/shedlang/compiler/backends/wasm/PatioToWasm.java | 13 ++++++++++++- .../org/shedlang/compiler/backends/wasm/WasmTarget.java | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index 96217cc5..bc327aea 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -230,6 +230,10 @@ public class PatioToWasm { context = generateOperand(patioCallPointer.functionPointer(), context); + if (context.platformTarget == WasmTarget.WASM64) { + context = context.addInstruction(new WasmI32WrapI64()); + } + var wasmFuncType = new WasmFuncType( patioOperandsToWasmValueTypes(patioCallPointer.args(), context), List.of(patioOperandToWasmValueType(patioCallPointer.target(), context)) @@ -557,7 +561,14 @@ public class PatioToWasm { case PatioFunctionPtr patioFunctionPtr -> { var wasmFuncName = new WasmFuncName(patioFunctionPtr.name()); - yield context.addInstruction(new WasmTableElementIndexConst(wasmFuncName)); + context = context + .addInstruction(new WasmTableElementIndexConst(wasmFuncName)); + + if (context.platformTarget == WasmTarget.WASM64) { + context = context.addInstruction(new WasmI64ExtendI32Unsigned()); + } + + yield context; } case PatioInt patioInt -> diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java index 6c3dec78..986cf6cd 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java @@ -70,7 +70,9 @@ public enum WasmTarget { // it to a void* on use, or // * Change the Wasm backend to treat Patio function pointers as 64-bit, // and convert from 32-bit to 64-bit when referencing table indices. - return WasmValueType.I32; + // We currently do the latter, but may want to consider the former (or + // some other alternative). + return sizeT; } public WasmValueType patioIntType() { -- cgit v1.2.3