authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-03 15:28:24-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-07 22:43:52-07:00
logd09b99d043cc097de569fb32938a423342490a83
treeb574ee081ef9e4c5eb08f03a2d0f24eeccbfb8ed
parentf409457925918da254080be9ddcbe1182073d1e2

C backend: fix compilation errors


2 files changed, 31 insertions(+), 32 deletions(-)

src/codegen/c.zig+11-12
......@@ -732,7 +732,7 @@ pub const Object = struct {
732732 indent_char => o.code.shrinkRetainingCapacity(written.len - indent_width),
733733 '\n' => try o.code.writer.splatByteAll(indent_char, o.indent_counter),
734734 else => {
735 std.debug.print("\"{f}\"\n", .{std.zig.fmtEscapes(written[written.len -| 100..])});
735 std.debug.print("\"{f}\"\n", .{std.zig.fmtString(written[written.len -| 100..])});
736736 unreachable;
737737 },
738738 }
......@@ -3038,20 +3038,20 @@ pub fn generate(
30383038 .pass = .{ .nav = func.owner_nav },
30393039 .is_naked_fn = Type.fromInterned(func.ty).fnCallingConvention(zcu) == .naked,
30403040 .expected_block = null,
3041 .fwd_decl = undefined,
3041 .fwd_decl = .init(gpa),
30423042 .ctype_pool = .empty,
30433043 .scratch = .empty,
30443044 .uavs = .empty,
30453045 },
3046 .code_header = undefined,
3047 .code = undefined,
3046 .code_header = .init(gpa),
3047 .code = .init(gpa),
30483048 .indent_counter = 0,
30493049 },
30503050 .lazy_fns = .empty,
30513051 };
30523052 defer {
3053 function.object.code_header.init(gpa);
3054 function.object.code.init(gpa);
3053 function.object.code_header.deinit();
3054 function.object.code.deinit();
30553055 function.object.dg.fwd_decl.deinit();
30563056 function.object.dg.ctype_pool.deinit(gpa);
30573057 function.object.dg.scratch.deinit(gpa);
......@@ -3059,18 +3059,17 @@ pub fn generate(
30593059 function.deinit();
30603060 }
30613061 try function.object.dg.ctype_pool.init(gpa);
3062 function.object.dg.fwd_decl.init(gpa);
3063 function.object.code_header.init(gpa);
3064 function.object.code.init(gpa);
30653062
30663063 genFunc(&function) catch |err| switch (err) {
30673064 error.AnalysisFail => return zcu.codegenFailMsg(func.owner_nav, function.object.dg.error_msg.?),
3068 error.OutOfMemory => |e| return e,
3065 error.OutOfMemory => return error.OutOfMemory,
3066 error.WriteFailed => return error.OutOfMemory,
30693067 };
30703068
30713069 var mir: Mir = .{
30723070 .uavs = .empty,
30733071 .code = &.{},
3072 .code_header = &.{},
30743073 .fwd_decl = &.{},
30753074 .ctype_pool = .empty,
30763075 .lazy_fns = .empty,
......@@ -4016,7 +4015,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
40164015 try w.writeByte('(');
40174016 try f.writeCValueDeref(w, operand);
40184017 try v.elem(f, w);
4019 try w.print(", {f})", .{try f.fmtIntLiteral(bit_offset_val)});
4018 try w.print(", {f})", .{try f.fmtIntLiteralDec(bit_offset_val)});
40204019 if (cant_cast) try w.writeByte(')');
40214020 try f.object.dg.renderBuiltinInfo(w, field_ty, .bits);
40224021 try w.writeByte(')');
......@@ -4077,7 +4076,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !void {
40774076 try f.writeCValueDeref(w, ret_val)
40784077 else
40794078 try f.writeCValue(w, ret_val, .Other);
4080 try w.write(";\n");
4079 try w.writeAll(";\n");
40814080 if (is_array) {
40824081 try freeLocal(f, inst, ret_val.new_local, null);
40834082 }
src/link/C.zig+20-20
......@@ -69,6 +69,7 @@ const String = extern struct {
6969pub const AvBlock = struct {
7070 fwd_decl: String = .empty,
7171 code: String = .empty,
72 code_header: String = .empty,
7273 /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate
7374 /// over each `Decl` and generate the definition for each used `CType` once.
7475 ctype_pool: codegen.CType.Pool = .empty,
......@@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 {
9192 return this.string_bytes.items[s.start..][0..s.len];
9293}
9394
94pub fn addString(this: *C, writers: []const *std.io.Writer.Allocating) Allocator.Error!String {
95pub fn addString(this: *C, s: []const u8) Allocator.Error!String {
9596 const comp = this.base.comp;
9697 const gpa = comp.gpa;
97 const start = this.string_bytes.items.len;
98 for (writers) |writer| try this.string_bytes.appendSlice(gpa, writer.getWritten());
98 try this.string_bytes.appendSlice(gpa, s);
9999 return .{
100 .start = @intCast(start),
101 .len = @intCast(this.string_bytes.items.len - start),
100 .start = @intCast(this.string_bytes.items.len - s.len),
101 .len = @intCast(s.len),
102102 };
103103}
104104
......@@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void {
233233 .code = undefined,
234234 .indent_counter = 0,
235235 };
236 object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);
237 object.code.initOwnedSlice(gpa, self.code_buf);
236 object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
237 object.code = .initOwnedSlice(gpa, self.code_buf);
238238 defer {
239239 object.dg.uavs.deinit(gpa);
240240 object.dg.ctype_pool.deinit(object.dg.gpa);
......@@ -260,8 +260,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void {
260260
261261 object.dg.ctype_pool.freeUnusedCapacity(gpa);
262262 self.uavs.values()[i] = .{
263 .fwd_decl = try self.addString(&.{&object.dg.fwd_decl}),
264 .code = try self.addString(&.{&object.code}),
263 .fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()),
264 .code = try self.addString(object.code.getWritten()),
265265 .ctype_pool = object.dg.ctype_pool.move(),
266266 };
267267}
......@@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l
308308 .code = undefined,
309309 .indent_counter = 0,
310310 };
311 object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);
312 object.code.initOwnedSlice(gpa, self.code_buf);
311 object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
312 object.code = .initOwnedSlice(gpa, self.code_buf);
313313 defer {
314314 object.dg.uavs.deinit(gpa);
315315 ctype_pool.* = object.dg.ctype_pool.move();
......@@ -327,8 +327,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l
327327 },
328328 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,
329329 };
330 gop.value_ptr.fwd_decl = try self.addString(&.{&object.dg.fwd_decl});
331 gop.value_ptr.code = try self.addString(&.{&object.code});
330 gop.value_ptr.fwd_decl = try self.addString(object.dg.fwd_decl.getWritten());
331 gop.value_ptr.code = try self.addString(object.code.getWritten());
332332 try self.addUavsFromCodegen(&object.dg.uavs);
333333}
334334
......@@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn
340340 _ = ti_id;
341341}
342342
343fn abiDefines(w: *std.io.Writer, target: std.Target) !void {
343fn abiDefines(w: *std.io.Writer, target: *const std.Target) !void {
344344 switch (target.abi) {
345345 .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"),
346346 else => {},
......@@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void {
639639 .code = undefined,
640640 .indent_counter = 0,
641641 };
642 _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl);
643 _ = object.code.fromArrayList(gpa, &f.lazy_code);
642 object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl);
643 object.code = .fromArrayList(gpa, &f.lazy_code);
644644 defer {
645645 object.dg.uavs.deinit(gpa);
646646 f.lazy_ctype_pool = object.dg.ctype_pool.move();
......@@ -687,8 +687,8 @@ fn flushLazyFn(
687687 .code = undefined,
688688 .indent_counter = 0,
689689 };
690 _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl);
691 _ = object.code.fromArrayList(gpa, &f.lazy_code);
690 object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl);
691 object.code = .fromArrayList(gpa, &f.lazy_code);
692692 defer {
693693 // If this assert trips just handle the anon_decl_deps the same as
694694 // `updateFunc()` does.
......@@ -829,7 +829,7 @@ pub fn updateExports(
829829 .scratch = .initBuffer(self.scratch_buf),
830830 .uavs = .empty,
831831 };
832 dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);
832 dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
833833 defer {
834834 assert(dg.uavs.count() == 0);
835835 ctype_pool.* = dg.ctype_pool.move();
......@@ -841,7 +841,7 @@ pub fn updateExports(
841841 codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) {
842842 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,
843843 };
844 exported_block.* = .{ .fwd_decl = try self.addString(&.{&dg.fwd_decl}) };
844 exported_block.* = .{ .fwd_decl = try self.addString(dg.fwd_decl.getWritten()) };
845845}
846846
847847pub fn deleteExport(