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 {...@@ -732,7 +732,7 @@ pub const Object = struct {
732 indent_char => o.code.shrinkRetainingCapacity(written.len - indent_width),732 indent_char => o.code.shrinkRetainingCapacity(written.len - indent_width),
733 '\n' => try o.code.writer.splatByteAll(indent_char, o.indent_counter),733 '\n' => try o.code.writer.splatByteAll(indent_char, o.indent_counter),
734 else => {734 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..])});
736 unreachable;736 unreachable;
737 },737 },
738 }738 }
...@@ -3038,20 +3038,20 @@ pub fn generate(...@@ -3038,20 +3038,20 @@ pub fn generate(
3038 .pass = .{ .nav = func.owner_nav },3038 .pass = .{ .nav = func.owner_nav },
3039 .is_naked_fn = Type.fromInterned(func.ty).fnCallingConvention(zcu) == .naked,3039 .is_naked_fn = Type.fromInterned(func.ty).fnCallingConvention(zcu) == .naked,
3040 .expected_block = null,3040 .expected_block = null,
3041 .fwd_decl = undefined,3041 .fwd_decl = .init(gpa),
3042 .ctype_pool = .empty,3042 .ctype_pool = .empty,
3043 .scratch = .empty,3043 .scratch = .empty,
3044 .uavs = .empty,3044 .uavs = .empty,
3045 },3045 },
3046 .code_header = undefined,3046 .code_header = .init(gpa),
3047 .code = undefined,3047 .code = .init(gpa),
3048 .indent_counter = 0,3048 .indent_counter = 0,
3049 },3049 },
3050 .lazy_fns = .empty,3050 .lazy_fns = .empty,
3051 };3051 };
3052 defer {3052 defer {
3053 function.object.code_header.init(gpa);3053 function.object.code_header.deinit();
3054 function.object.code.init(gpa);3054 function.object.code.deinit();
3055 function.object.dg.fwd_decl.deinit();3055 function.object.dg.fwd_decl.deinit();
3056 function.object.dg.ctype_pool.deinit(gpa);3056 function.object.dg.ctype_pool.deinit(gpa);
3057 function.object.dg.scratch.deinit(gpa);3057 function.object.dg.scratch.deinit(gpa);
...@@ -3059,18 +3059,17 @@ pub fn generate(...@@ -3059,18 +3059,17 @@ pub fn generate(
3059 function.deinit();3059 function.deinit();
3060 }3060 }
3061 try function.object.dg.ctype_pool.init(gpa);3061 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
3066 genFunc(&function) catch |err| switch (err) {3063 genFunc(&function) catch |err| switch (err) {
3067 error.AnalysisFail => return zcu.codegenFailMsg(func.owner_nav, function.object.dg.error_msg.?),3064 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,
3069 };3067 };
30703068
3071 var mir: Mir = .{3069 var mir: Mir = .{
3072 .uavs = .empty,3070 .uavs = .empty,
3073 .code = &.{},3071 .code = &.{},
3072 .code_header = &.{},
3074 .fwd_decl = &.{},3073 .fwd_decl = &.{},
3075 .ctype_pool = .empty,3074 .ctype_pool = .empty,
3076 .lazy_fns = .empty,3075 .lazy_fns = .empty,
...@@ -4016,7 +4015,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -4016,7 +4015,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
4016 try w.writeByte('(');4015 try w.writeByte('(');
4017 try f.writeCValueDeref(w, operand);4016 try f.writeCValueDeref(w, operand);
4018 try v.elem(f, w);4017 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)});
4020 if (cant_cast) try w.writeByte(')');4019 if (cant_cast) try w.writeByte(')');
4021 try f.object.dg.renderBuiltinInfo(w, field_ty, .bits);4020 try f.object.dg.renderBuiltinInfo(w, field_ty, .bits);
4022 try w.writeByte(')');4021 try w.writeByte(')');
...@@ -4077,7 +4076,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !void {...@@ -4077,7 +4076,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !void {
4077 try f.writeCValueDeref(w, ret_val)4076 try f.writeCValueDeref(w, ret_val)
4078 else4077 else
4079 try f.writeCValue(w, ret_val, .Other);4078 try f.writeCValue(w, ret_val, .Other);
4080 try w.write(";\n");4079 try w.writeAll(";\n");
4081 if (is_array) {4080 if (is_array) {
4082 try freeLocal(f, inst, ret_val.new_local, null);4081 try freeLocal(f, inst, ret_val.new_local, null);
4083 }4082 }
src/link/C.zig+20-20
...@@ -69,6 +69,7 @@ const String = extern struct {...@@ -69,6 +69,7 @@ const String = extern struct {
69pub const AvBlock = struct {69pub const AvBlock = struct {
70 fwd_decl: String = .empty,70 fwd_decl: String = .empty,
71 code: String = .empty,71 code: String = .empty,
72 code_header: String = .empty,
72 /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate73 /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate
73 /// over each `Decl` and generate the definition for each used `CType` once.74 /// over each `Decl` and generate the definition for each used `CType` once.
74 ctype_pool: codegen.CType.Pool = .empty,75 ctype_pool: codegen.CType.Pool = .empty,
...@@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 {...@@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 {
91 return this.string_bytes.items[s.start..][0..s.len];92 return this.string_bytes.items[s.start..][0..s.len];
92}93}
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 {
95 const comp = this.base.comp;96 const comp = this.base.comp;
96 const gpa = comp.gpa;97 const gpa = comp.gpa;
97 const start = this.string_bytes.items.len;98 try this.string_bytes.appendSlice(gpa, s);
98 for (writers) |writer| try this.string_bytes.appendSlice(gpa, writer.getWritten());
99 return .{99 return .{
100 .start = @intCast(start),100 .start = @intCast(this.string_bytes.items.len - s.len),
101 .len = @intCast(this.string_bytes.items.len - start),101 .len = @intCast(s.len),
102 };102 };
103}103}
104104
...@@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void {...@@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void {
233 .code = undefined,233 .code = undefined,
234 .indent_counter = 0,234 .indent_counter = 0,
235 };235 };
236 object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);236 object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
237 object.code.initOwnedSlice(gpa, self.code_buf);237 object.code = .initOwnedSlice(gpa, self.code_buf);
238 defer {238 defer {
239 object.dg.uavs.deinit(gpa);239 object.dg.uavs.deinit(gpa);
240 object.dg.ctype_pool.deinit(object.dg.gpa);240 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 {...@@ -260,8 +260,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void {
260260
261 object.dg.ctype_pool.freeUnusedCapacity(gpa);261 object.dg.ctype_pool.freeUnusedCapacity(gpa);
262 self.uavs.values()[i] = .{262 self.uavs.values()[i] = .{
263 .fwd_decl = try self.addString(&.{&object.dg.fwd_decl}),263 .fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()),
264 .code = try self.addString(&.{&object.code}),264 .code = try self.addString(object.code.getWritten()),
265 .ctype_pool = object.dg.ctype_pool.move(),265 .ctype_pool = object.dg.ctype_pool.move(),
266 };266 };
267}267}
...@@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l...@@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l
308 .code = undefined,308 .code = undefined,
309 .indent_counter = 0,309 .indent_counter = 0,
310 };310 };
311 object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);311 object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
312 object.code.initOwnedSlice(gpa, self.code_buf);312 object.code = .initOwnedSlice(gpa, self.code_buf);
313 defer {313 defer {
314 object.dg.uavs.deinit(gpa);314 object.dg.uavs.deinit(gpa);
315 ctype_pool.* = object.dg.ctype_pool.move();315 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...@@ -327,8 +327,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l
327 },327 },
328 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,328 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,
329 };329 };
330 gop.value_ptr.fwd_decl = try self.addString(&.{&object.dg.fwd_decl});330 gop.value_ptr.fwd_decl = try self.addString(object.dg.fwd_decl.getWritten());
331 gop.value_ptr.code = try self.addString(&.{&object.code});331 gop.value_ptr.code = try self.addString(object.code.getWritten());
332 try self.addUavsFromCodegen(&object.dg.uavs);332 try self.addUavsFromCodegen(&object.dg.uavs);
333}333}
334334
...@@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn...@@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn
340 _ = ti_id;340 _ = ti_id;
341}341}
342342
343fn abiDefines(w: *std.io.Writer, target: std.Target) !void {343fn abiDefines(w: *std.io.Writer, target: *const std.Target) !void {
344 switch (target.abi) {344 switch (target.abi) {
345 .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"),345 .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"),
346 else => {},346 else => {},
...@@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void {...@@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void {
639 .code = undefined,639 .code = undefined,
640 .indent_counter = 0,640 .indent_counter = 0,
641 };641 };
642 _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl);642 object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl);
643 _ = object.code.fromArrayList(gpa, &f.lazy_code);643 object.code = .fromArrayList(gpa, &f.lazy_code);
644 defer {644 defer {
645 object.dg.uavs.deinit(gpa);645 object.dg.uavs.deinit(gpa);
646 f.lazy_ctype_pool = object.dg.ctype_pool.move();646 f.lazy_ctype_pool = object.dg.ctype_pool.move();
...@@ -687,8 +687,8 @@ fn flushLazyFn(...@@ -687,8 +687,8 @@ fn flushLazyFn(
687 .code = undefined,687 .code = undefined,
688 .indent_counter = 0,688 .indent_counter = 0,
689 };689 };
690 _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl);690 object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl);
691 _ = object.code.fromArrayList(gpa, &f.lazy_code);691 object.code = .fromArrayList(gpa, &f.lazy_code);
692 defer {692 defer {
693 // If this assert trips just handle the anon_decl_deps the same as693 // If this assert trips just handle the anon_decl_deps the same as
694 // `updateFunc()` does.694 // `updateFunc()` does.
...@@ -829,7 +829,7 @@ pub fn updateExports(...@@ -829,7 +829,7 @@ pub fn updateExports(
829 .scratch = .initBuffer(self.scratch_buf),829 .scratch = .initBuffer(self.scratch_buf),
830 .uavs = .empty,830 .uavs = .empty,
831 };831 };
832 dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf);832 dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf);
833 defer {833 defer {
834 assert(dg.uavs.count() == 0);834 assert(dg.uavs.count() == 0);
835 ctype_pool.* = dg.ctype_pool.move();835 ctype_pool.* = dg.ctype_pool.move();
...@@ -841,7 +841,7 @@ pub fn updateExports(...@@ -841,7 +841,7 @@ pub fn updateExports(
841 codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) {841 codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) {
842 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,842 error.WriteFailed, error.OutOfMemory => return error.OutOfMemory,
843 };843 };
844 exported_block.* = .{ .fwd_decl = try self.addString(&.{&dg.fwd_decl}) };844 exported_block.* = .{ .fwd_decl = try self.addString(dg.fwd_decl.getWritten()) };
845}845}
846846
847pub fn deleteExport(847pub fn deleteExport(