aboutsummaryrefslogtreecommitdiff
path: root/src/link/Wasm.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2023-01-01 17:10:51 +0100
committerLuuk de Gram <luuk@degram.dev>2023-01-02 18:36:18 +0100
commite475ddb08e4bb3bacbc50bdd26fa83f579783dbb (patch)
tree366a5b3b61c6598b23bc7e8a3551860ba9ac39af /src/link/Wasm.zig
parent86ed96d9336c06668a727893e41856b2e4fe3d23 (diff)
downloadzig-e475ddb08e4bb3bacbc50bdd26fa83f579783dbb.tar.gz
zig-e475ddb08e4bb3bacbc50bdd26fa83f579783dbb.zip
wasm-linker: export symbols by virtual address
When exporting a data symbol, generate a regular global and use the data symbol's virtual addres as the value (init) of the global.
Diffstat (limited to 'src/link/Wasm.zig')
-rw-r--r--src/link/Wasm.zig26
1 files changed, 8 insertions, 18 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 42cc2883e2..e03c8b1ba0 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -112,8 +112,6 @@ func_types: std.ArrayListUnmanaged(std.wasm.Type) = .{},
functions: std.AutoArrayHashMapUnmanaged(struct { file: ?u16, index: u32 }, std.wasm.Func) = .{},
/// Output global section
wasm_globals: std.ArrayListUnmanaged(std.wasm.Global) = .{},
-/// Global symbols for exported data symbols
-address_globals: std.ArrayListUnmanaged(SymbolLoc) = .{},
/// Memory section
memories: std.wasm.Memory = .{ .limits = .{ .min = 0, .max = null } },
/// Output table section
@@ -880,7 +878,6 @@ pub fn deinit(wasm: *Wasm) void {
wasm.func_types.deinit(gpa);
wasm.functions.deinit(gpa);
wasm.wasm_globals.deinit(gpa);
- wasm.address_globals.deinit(gpa);
wasm.function_table.deinit(gpa);
wasm.tables.deinit(gpa);
wasm.exports.deinit(gpa);
@@ -1879,8 +1876,13 @@ fn setupExports(wasm: *Wasm) !void {
break :blk try wasm.string_table.put(wasm.base.allocator, sym_name);
};
const exp: types.Export = if (symbol.tag == .data) exp: {
- const global_index = @intCast(u32, wasm.wasm_globals.items.len + wasm.address_globals.items.len);
- try wasm.address_globals.append(wasm.base.allocator, sym_loc);
+ const atom = wasm.symbol_atom.get(sym_loc).?;
+ const va = atom.getVA(wasm, symbol);
+ const global_index = @intCast(u32, wasm.imported_globals_count + wasm.wasm_globals.items.len);
+ try wasm.wasm_globals.append(wasm.base.allocator, .{
+ .global_type = .{ .valtype = .i32, .mutable = false },
+ .init = .{ .i32_const = @intCast(i32, va) },
+ });
break :exp .{
.name = export_name,
.kind = .global,
@@ -2741,22 +2743,10 @@ fn writeToFile(
if (wasm.wasm_globals.items.len > 0) {
const header_offset = try reserveVecSectionHeader(&binary_bytes);
- var global_count: u32 = 0;
for (wasm.wasm_globals.items) |global| {
try binary_writer.writeByte(std.wasm.valtype(global.global_type.valtype));
try binary_writer.writeByte(@boolToInt(global.global_type.mutable));
try emitInit(binary_writer, global.init);
- global_count += 1;
- }
-
- for (wasm.address_globals.items) |sym_loc| {
- const atom = wasm.symbol_atom.get(sym_loc).?;
- try binary_writer.writeByte(std.wasm.valtype(.i32));
- try binary_writer.writeByte(0); // immutable
- try emitInit(binary_writer, .{
- .i32_const = @bitCast(i32, atom.offset),
- });
- global_count += 1;
}
try writeVecSectionHeader(
@@ -2764,7 +2754,7 @@ fn writeToFile(
header_offset,
.global,
@intCast(u32, binary_bytes.items.len - header_offset - header_size),
- @intCast(u32, global_count),
+ @intCast(u32, wasm.wasm_globals.items.len),
);
section_count += 1;
}