From d09b99d043cc097de569fb32938a423342490a83 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 3 Jul 2025 15:28:24 -0700 Subject: [PATCH] C backend: fix compilation errors --- src/codegen/c.zig | 23 +++++++++++------------ src/link/C.zig | 40 ++++++++++++++++++++-------------------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 477b260d8f0281a776cebba40dfad7745936ec45..a0bf0e271b2da675a9383c5d87f66b2b5c32fbc4 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -732,7 +732,7 @@ pub const Object = struct { indent_char => o.code.shrinkRetainingCapacity(written.len - indent_width), '\n' => try o.code.writer.splatByteAll(indent_char, o.indent_counter), else => { - std.debug.print("\"{f}\"\n", .{std.zig.fmtEscapes(written[written.len -| 100..])}); + std.debug.print("\"{f}\"\n", .{std.zig.fmtString(written[written.len -| 100..])}); unreachable; }, } @@ -3038,20 +3038,20 @@ pub fn generate( .pass = .{ .nav = func.owner_nav }, .is_naked_fn = Type.fromInterned(func.ty).fnCallingConvention(zcu) == .naked, .expected_block = null, - .fwd_decl = undefined, + .fwd_decl = .init(gpa), .ctype_pool = .empty, .scratch = .empty, .uavs = .empty, }, - .code_header = undefined, - .code = undefined, + .code_header = .init(gpa), + .code = .init(gpa), .indent_counter = 0, }, .lazy_fns = .empty, }; defer { - function.object.code_header.init(gpa); - function.object.code.init(gpa); + function.object.code_header.deinit(); + function.object.code.deinit(); function.object.dg.fwd_decl.deinit(); function.object.dg.ctype_pool.deinit(gpa); function.object.dg.scratch.deinit(gpa); @@ -3059,18 +3059,17 @@ pub fn generate( function.deinit(); } try function.object.dg.ctype_pool.init(gpa); - function.object.dg.fwd_decl.init(gpa); - function.object.code_header.init(gpa); - function.object.code.init(gpa); genFunc(&function) catch |err| switch (err) { error.AnalysisFail => return zcu.codegenFailMsg(func.owner_nav, function.object.dg.error_msg.?), - error.OutOfMemory => |e| return e, + error.OutOfMemory => return error.OutOfMemory, + error.WriteFailed => return error.OutOfMemory, }; var mir: Mir = .{ .uavs = .empty, .code = &.{}, + .code_header = &.{}, .fwd_decl = &.{}, .ctype_pool = .empty, .lazy_fns = .empty, @@ -4016,7 +4015,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue { try w.writeByte('('); try f.writeCValueDeref(w, operand); try v.elem(f, w); - try w.print(", {f})", .{try f.fmtIntLiteral(bit_offset_val)}); + try w.print(", {f})", .{try f.fmtIntLiteralDec(bit_offset_val)}); if (cant_cast) try w.writeByte(')'); try f.object.dg.renderBuiltinInfo(w, field_ty, .bits); try w.writeByte(')'); @@ -4077,7 +4076,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !void { try f.writeCValueDeref(w, ret_val) else try f.writeCValue(w, ret_val, .Other); - try w.write(";\n"); + try w.writeAll(";\n"); if (is_array) { try freeLocal(f, inst, ret_val.new_local, null); } diff --git a/src/link/C.zig b/src/link/C.zig index 0fab2b7a315ab68453f463c84a4b9dc6c32a88fe..6f32857c1ed9c826a531032f7aed9e6d53ae33bd 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -69,6 +69,7 @@ const String = extern struct { pub const AvBlock = struct { fwd_decl: String = .empty, code: String = .empty, + code_header: String = .empty, /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate /// over each `Decl` and generate the definition for each used `CType` once. ctype_pool: codegen.CType.Pool = .empty, @@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 { return this.string_bytes.items[s.start..][0..s.len]; } -pub fn addString(this: *C, writers: []const *std.io.Writer.Allocating) Allocator.Error!String { +pub fn addString(this: *C, s: []const u8) Allocator.Error!String { const comp = this.base.comp; const gpa = comp.gpa; - const start = this.string_bytes.items.len; - for (writers) |writer| try this.string_bytes.appendSlice(gpa, writer.getWritten()); + try this.string_bytes.appendSlice(gpa, s); return .{ - .start = @intCast(start), - .len = @intCast(this.string_bytes.items.len - start), + .start = @intCast(this.string_bytes.items.len - s.len), + .len = @intCast(s.len), }; } @@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void { .code = undefined, .indent_counter = 0, }; - object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); - object.code.initOwnedSlice(gpa, self.code_buf); + object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); + object.code = .initOwnedSlice(gpa, self.code_buf); defer { object.dg.uavs.deinit(gpa); 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 { object.dg.ctype_pool.freeUnusedCapacity(gpa); self.uavs.values()[i] = .{ - .fwd_decl = try self.addString(&.{&object.dg.fwd_decl}), - .code = try self.addString(&.{&object.code}), + .fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()), + .code = try self.addString(object.code.getWritten()), .ctype_pool = object.dg.ctype_pool.move(), }; } @@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l .code = undefined, .indent_counter = 0, }; - object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); - object.code.initOwnedSlice(gpa, self.code_buf); + object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); + object.code = .initOwnedSlice(gpa, self.code_buf); defer { object.dg.uavs.deinit(gpa); 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 }, error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, }; - gop.value_ptr.fwd_decl = try self.addString(&.{&object.dg.fwd_decl}); - gop.value_ptr.code = try self.addString(&.{&object.code}); + gop.value_ptr.fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()); + gop.value_ptr.code = try self.addString(object.code.getWritten()); try self.addUavsFromCodegen(&object.dg.uavs); } @@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn _ = ti_id; } -fn abiDefines(w: *std.io.Writer, target: std.Target) !void { +fn abiDefines(w: *std.io.Writer, target: *const std.Target) !void { switch (target.abi) { .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"), else => {}, @@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void { .code = undefined, .indent_counter = 0, }; - _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl); - _ = object.code.fromArrayList(gpa, &f.lazy_code); + object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl); + object.code = .fromArrayList(gpa, &f.lazy_code); defer { object.dg.uavs.deinit(gpa); f.lazy_ctype_pool = object.dg.ctype_pool.move(); @@ -687,8 +687,8 @@ fn flushLazyFn( .code = undefined, .indent_counter = 0, }; - _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl); - _ = object.code.fromArrayList(gpa, &f.lazy_code); + object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl); + object.code = .fromArrayList(gpa, &f.lazy_code); defer { // If this assert trips just handle the anon_decl_deps the same as // `updateFunc()` does. @@ -829,7 +829,7 @@ pub fn updateExports( .scratch = .initBuffer(self.scratch_buf), .uavs = .empty, }; - dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); + dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); defer { assert(dg.uavs.count() == 0); ctype_pool.* = dg.ctype_pool.move(); @@ -841,7 +841,7 @@ pub fn updateExports( codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) { error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, }; - exported_block.* = .{ .fwd_decl = try self.addString(&.{&dg.fwd_decl}) }; + exported_block.* = .{ .fwd_decl = try self.addString(dg.fwd_decl.getWritten()) }; } pub fn deleteExport( -- 2.54.0