diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2025-01-05 04:59:31 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-01-05 17:15:56 -0500 |
| commit | 0bf44c30934bced6fc8f6451cf418ae40db665e6 (patch) | |
| tree | c9d715c9907060ef77c1cd807c3ce42e1e133f15 /src/codegen.zig | |
| parent | 137787edbb1320ce50bd4193d69f21ffaf8593e8 (diff) | |
| download | zig-0bf44c30934bced6fc8f6451cf418ae40db665e6.tar.gz zig-0bf44c30934bced6fc8f6451cf418ae40db665e6.zip | |
x86_64: fix `@errorName` data
The final offset was clobbering the first error name, which is revealed
by an out of bounds when the global error set is empty.
Closes #22362
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 7b607f13f9..a70fc8642d 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -148,19 +148,23 @@ pub fn generateLazySymbol( if (lazy_sym.ty == .anyerror_type) { alignment.* = .@"4"; const err_names = ip.global_error_set.getNamesFromMainThread(); - mem.writeInt(u32, try code.addManyAsArray(4), @intCast(err_names.len), endian); - var offset = code.items.len; - try code.resize((err_names.len + 1) * 4); + var offset_index: u32 = @intCast(code.items.len); + var string_index: u32 = @intCast(4 * (1 + err_names.len + @intFromBool(err_names.len > 0))); + try code.resize(offset_index + string_index); + mem.writeInt(u32, code.items[offset_index..][0..4], @intCast(err_names.len), endian); + if (err_names.len == 0) return .ok; + offset_index += 4; for (err_names) |err_name_nts| { const err_name = err_name_nts.toSlice(ip); - mem.writeInt(u32, code.items[offset..][0..4], @intCast(code.items.len), endian); - offset += 4; + mem.writeInt(u32, code.items[offset_index..][0..4], string_index, endian); + offset_index += 4; try code.ensureUnusedCapacity(err_name.len + 1); code.appendSliceAssumeCapacity(err_name); code.appendAssumeCapacity(0); + string_index += @intCast(err_name.len + 1); } - mem.writeInt(u32, code.items[offset..][0..4], @intCast(code.items.len), endian); - return Result.ok; + mem.writeInt(u32, code.items[offset_index..][0..4], string_index, endian); + return .ok; } else if (Type.fromInterned(lazy_sym.ty).zigTypeTag(pt.zcu) == .@"enum") { alignment.* = .@"1"; const enum_ty = Type.fromInterned(lazy_sym.ty); @@ -171,8 +175,8 @@ pub fn generateLazySymbol( code.appendSliceAssumeCapacity(tag_name); code.appendAssumeCapacity(0); } - return Result.ok; - } else return .{ .fail = try ErrorMsg.create( + return .ok; + } else return .{ .fail = try .create( gpa, src_loc, "TODO implement generateLazySymbol for {s} {}", |
