Commit d09b99d043

Andrew Kelley <andrew@ziglang.org>
2025-07-04 00:28:24
C backend: fix compilation errors
1 parent f409457
Changed files (2)
src
codegen
link
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);
         }
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(