aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-03-05 15:19:54 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-03-06 14:17:36 -0500
commit6d84f22fa0d30f688a2fbe69acab2979373a7806 (patch)
tree03d39cb2386d7c9da060e84de495a9e2de9dfc51 /src/codegen
parent716abe338907dbcb0ea115dd014c2e13c3a6637b (diff)
downloadzig-6d84f22fa0d30f688a2fbe69acab2979373a7806.tar.gz
zig-6d84f22fa0d30f688a2fbe69acab2979373a7806.zip
stage2: Fix wasm linker for llvm backend
This fixes 2 entrypoints within the self-hosted wasm linker that would be called for the llvm backend, whereas we should simply call into the llvm backend to perform such action. i.e. not allocate a decl index when we have an llvm object, and when flushing a module, we should be calling it on llvm's object, rather than have the wasm linker perform the operation. Also, this fixes the wasm intrinsics for wasm.memory.size and wasm.memory.grow. Lastly, this commit ensures that when an extern function is being resolved, we tell LLVM how to import such function.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 368a67f4b4..446876dfe5 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -708,6 +708,14 @@ pub const DeclGen = struct {
if (!is_extern) {
llvm_fn.setLinkage(.Internal);
llvm_fn.setUnnamedAddr(.True);
+ } else if (dg.module.getTarget().isWasm()) {
+ dg.addFnAttrString(llvm_fn, "wasm-import-name", std.mem.sliceTo(decl.name, 0));
+ if (decl.getExternFn().?.lib_name) |lib_name| {
+ const module_name = std.mem.sliceTo(lib_name, 0);
+ if (!std.mem.eql(u8, module_name, "c")) {
+ dg.addFnAttrString(llvm_fn, "wasm-import-module", module_name);
+ }
+ }
}
if (sret) {
@@ -3483,7 +3491,7 @@ pub const FuncGen = struct {
const pl_op = self.air.instructions.items(.data)[inst].pl_op;
const index = pl_op.payload;
const llvm_u32 = self.context.intType(32);
- const llvm_fn = self.getIntrinsic("llvm.wasm.memory.size.i32", &.{llvm_u32});
+ const llvm_fn = self.getIntrinsic("llvm.wasm.memory.size", &.{llvm_u32});
const args: [1]*const llvm.Value = .{llvm_u32.constInt(index, .False)};
return self.builder.buildCall(llvm_fn, &args, args.len, .Fast, .Auto, "");
}
@@ -3493,7 +3501,7 @@ pub const FuncGen = struct {
const index = pl_op.payload;
const operand = try self.resolveInst(pl_op.operand);
const llvm_u32 = self.context.intType(32);
- const llvm_fn = self.getIntrinsic("llvm.wasm.memory.grow.i32", &.{ llvm_u32, llvm_u32 });
+ const llvm_fn = self.getIntrinsic("llvm.wasm.memory.grow", &.{llvm_u32});
const args: [2]*const llvm.Value = .{
llvm_u32.constInt(index, .False),
operand,