aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2023-06-15 19:30:00 +0200
committerLuuk de Gram <luuk@degram.dev>2023-06-16 17:16:56 +0200
commite3db210cf1007f87930c97c072c54b2fb8ae0b8c (patch)
treec11e1e47dbf59e745aef594a9e446f100b839efe
parent1cfad29f10a557df986fc940dcce7620bbd5d4d9 (diff)
downloadzig-e3db210cf1007f87930c97c072c54b2fb8ae0b8c.tar.gz
zig-e3db210cf1007f87930c97c072c54b2fb8ae0b8c.zip
wasm: support calling alias'd function pointers
When lowering a decl value we verify whether its owner decl index equals to the decl index of the decl being lowered. When this is not the case, we are lowering an alias. So instead, we will now lower the owner decl instead and call its symbol to ensure its type is being correctly generated.
-rw-r--r--src/arch/wasm/CodeGen.zig11
-rw-r--r--test/behavior.zig6
2 files changed, 12 insertions, 5 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig
index 9a19ca439c..aa44dc2bc8 100644
--- a/src/arch/wasm/CodeGen.zig
+++ b/src/arch/wasm/CodeGen.zig
@@ -3008,6 +3008,17 @@ fn lowerDeclRefValue(func: *CodeGen, tv: TypedValue, decl_index: Module.Decl.Ind
}
const decl = mod.declPtr(decl_index);
+ // check if decl is an alias to a function, in which case we
+ // want to lower the actual decl, rather than the alias itself.
+ if (decl.val.getFunction(mod)) |func_val| {
+ if (func_val.owner_decl != decl_index) {
+ return func.lowerDeclRefValue(tv, func_val.owner_decl, offset);
+ }
+ } else if (decl.val.getExternFunc(mod)) |func_val| {
+ if (func_val.decl != decl_index) {
+ return func.lowerDeclRefValue(tv, func_val.decl, offset);
+ }
+ }
if (decl.ty.zigTypeTag(mod) != .Fn and !decl.ty.hasRuntimeBitsIgnoreComptime(mod)) {
return WValue{ .imm32 = 0xaaaaaaaa };
}
diff --git a/test/behavior.zig b/test/behavior.zig
index bdc3f30ede..017b5b4824 100644
--- a/test/behavior.zig
+++ b/test/behavior.zig
@@ -158,6 +158,7 @@ test {
_ = @import("behavior/enum.zig");
_ = @import("behavior/error.zig");
_ = @import("behavior/eval.zig");
+ _ = @import("behavior/export_self_referential_type_info.zig");
_ = @import("behavior/field_parent_ptr.zig");
_ = @import("behavior/floatop.zig");
_ = @import("behavior/fn.zig");
@@ -241,7 +242,6 @@ test {
if (builtin.zig_backend != .stage2_arm and
builtin.zig_backend != .stage2_x86_64 and
builtin.zig_backend != .stage2_aarch64 and
- builtin.zig_backend != .stage2_wasm and
builtin.zig_backend != .stage2_c and
builtin.zig_backend != .stage2_spirv64)
{
@@ -250,8 +250,4 @@ test {
_ = @import("behavior/bugs/14198.zig");
_ = @import("behavior/export.zig");
}
-
- if (builtin.zig_backend != .stage2_wasm) {
- _ = @import("behavior/export_self_referential_type_info.zig");
- }
}