authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-13 19:05:17-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
logba4521ac85bbfc7cf6e6ea8d36e75907d94878c3
tree40f995916c56a10464e40338dd26e745b9590e3b
parent0cf163089e7948efa9082e519229beeb7e651f25

wasm linker: fix data segment names


2 files changed, 10 insertions(+), 9 deletions(-)

src/link/Wasm.zig+2-1
......@@ -1930,7 +1930,8 @@ pub const DataSegmentId = enum(u32) {
19301930 const zcu = wasm.base.comp.zcu.?;
19311931 const ip = &zcu.intern_pool;
19321932 const nav = ip.getNav(i.key(wasm).*);
1933 return nav.getLinkSection().toSlice(ip) orelse ".data";
1933 return nav.getLinkSection().toSlice(ip) orelse
1934 if (nav.isThreadlocal(ip)) ".tdata" else ".data";
19341935 },
19351936 };
19361937 }
src/link/Wasm/Flush.zig+8-8
......@@ -842,10 +842,10 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
842842 group_end_addr = f.data_segment_groups.items[group_index].end_addr;
843843 segment_offset = 0;
844844 }
845 const flags: Object.DataSegmentFlags = if (segment_id.isPassive(wasm)) .passive else .active;
845846 if (segment_offset == 0) {
846847 const group_size = group_end_addr - group_start_addr;
847848 log.debug("emit data section group, {d} bytes", .{group_size});
848 const flags: Object.DataSegmentFlags = if (segment_id.isPassive(wasm)) .passive else .active;
849849 try leb.writeUleb128(binary_writer, @intFromEnum(flags));
850850 // Passive segments are initialized at runtime.
851851 if (flags != .passive) {
......@@ -853,7 +853,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
853853 }
854854 try leb.writeUleb128(binary_writer, group_size);
855855 }
856 if (segment_id.isEmpty(wasm)) {
856 if (flags == .passive or segment_id.isEmpty(wasm)) {
857857 // It counted for virtual memory but it does not go into the binary.
858858 continue;
859859 }
......@@ -933,7 +933,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
933933 // try wasm.emitDataRelocations(binary_bytes, data_index, symbol_table);
934934 //}
935935 } else if (comp.config.debug_format != .strip) {
936 try emitNameSection(wasm, &f.data_segments, binary_bytes);
936 try emitNameSection(wasm, f.data_segment_groups.items, binary_bytes);
937937 }
938938
939939 if (comp.config.debug_format != .strip) {
......@@ -992,7 +992,7 @@ const VirtualAddrs = struct {
992992
993993fn emitNameSection(
994994 wasm: *Wasm,
995 data_segments: *const std.AutoArrayHashMapUnmanaged(Wasm.DataSegmentId, u32),
995 data_segment_groups: []const DataSegmentGroup,
996996 binary_bytes: *std.ArrayListUnmanaged(u8),
997997) !void {
998998 const f = &wasm.flush_buffer;
......@@ -1052,11 +1052,11 @@ fn emitNameSection(
10521052 const sub_offset = try reserveCustomSectionHeader(gpa, binary_bytes);
10531053 defer replaceHeader(binary_bytes, sub_offset, @intFromEnum(std.wasm.NameSubsection.data_segment));
10541054
1055 const total_globals: u32 = @intCast(f.global_imports.entries.len + wasm.globals.entries.len);
1056 try leb.writeUleb128(binary_bytes.writer(gpa), total_globals);
1055 const total_data_segments: u32 = @intCast(data_segment_groups.len);
1056 try leb.writeUleb128(binary_bytes.writer(gpa), total_data_segments);
10571057
1058 for (data_segments.keys(), 0..) |ds, i| {
1059 const name = ds.name(wasm);
1058 for (data_segment_groups, 0..) |group, i| {
1059 const name = group.first_segment.name(wasm);
10601060 try leb.writeUleb128(binary_bytes.writer(gpa), @as(u32, @intCast(i)));
10611061 try leb.writeUleb128(binary_bytes.writer(gpa), @as(u32, @intCast(name.len)));
10621062 try binary_bytes.appendSlice(gpa, name);