authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-29 17:03:09-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-29 19:14:17-07:00
log7c605ba62ce9fcecb7674a6a28abc3ccc4ba3a62
tree53182b7c4b776092edd722ef23019cf863480cf9
parent0d841e827ac120725eef1100b79f1807a2bc04bd

C backend: remove ?*Decl from DeclGen

Another simplification. DeclGen already has `decl_index` which can be used to retrieve the `*Decl` if needed.

3 files changed, 33 insertions(+), 28 deletions(-)

src/Compilation.zig+1-1
...@@ -3495,7 +3495,7 @@ fn processOneJob(comp: *Compilation, job: Job, prog_node: *std.Progress.Node) !v...@@ -3495,7 +3495,7 @@ fn processOneJob(comp: *Compilation, job: Job, prog_node: *std.Progress.Node) !v
3495 .module = module,3495 .module = module,
3496 .error_msg = null,3496 .error_msg = null,
3497 .decl_index = decl_index.toOptional(),3497 .decl_index = decl_index.toOptional(),
3498 .decl = decl,3498 .is_naked_fn = false,
3499 .fwd_decl = fwd_decl.toManaged(gpa),3499 .fwd_decl = fwd_decl.toManaged(gpa),
3500 .ctypes = .{},3500 .ctypes = .{},
3501 };3501 };
src/codegen/c.zig+27-21
...@@ -522,8 +522,8 @@ pub const Object = struct {...@@ -522,8 +522,8 @@ pub const Object = struct {
522pub const DeclGen = struct {522pub const DeclGen = struct {
523 gpa: mem.Allocator,523 gpa: mem.Allocator,
524 module: *Module,524 module: *Module,
525 decl: ?*Decl,
526 decl_index: Decl.OptionalIndex,525 decl_index: Decl.OptionalIndex,
526 is_naked_fn: bool,
527 /// This is a borrowed reference from `link.C`.527 /// This is a borrowed reference from `link.C`.
528 fwd_decl: std.ArrayList(u8),528 fwd_decl: std.ArrayList(u8),
529 error_msg: ?*Module.ErrorMsg,529 error_msg: ?*Module.ErrorMsg,
...@@ -532,8 +532,10 @@ pub const DeclGen = struct {...@@ -532,8 +532,10 @@ pub const DeclGen = struct {
532 fn fail(dg: *DeclGen, comptime format: []const u8, args: anytype) error{ AnalysisFail, OutOfMemory } {532 fn fail(dg: *DeclGen, comptime format: []const u8, args: anytype) error{ AnalysisFail, OutOfMemory } {
533 @setCold(true);533 @setCold(true);
534 const mod = dg.module;534 const mod = dg.module;
535 const decl_index = dg.decl_index.unwrap().?;
536 const decl = mod.declPtr(decl_index);
535 const src = LazySrcLoc.nodeOffset(0);537 const src = LazySrcLoc.nodeOffset(0);
536 const src_loc = src.toSrcLoc(dg.decl.?, mod);538 const src_loc = src.toSrcLoc(decl, mod);
537 dg.error_msg = try Module.ErrorMsg.create(dg.gpa, src_loc, format, args);539 dg.error_msg = try Module.ErrorMsg.create(dg.gpa, src_loc, format, args);
538 return error.AnalysisFail;540 return error.AnalysisFail;
539 }541 }
...@@ -2493,8 +2495,8 @@ fn genExports(o: *Object) !void {...@@ -2493,8 +2495,8 @@ fn genExports(o: *Object) !void {
24932495
2494 const mod = o.dg.module;2496 const mod = o.dg.module;
2495 const ip = &mod.intern_pool;2497 const ip = &mod.intern_pool;
2496 const decl = o.dg.decl.?;
2497 const decl_index = o.dg.decl_index.unwrap().?;2498 const decl_index = o.dg.decl_index.unwrap().?;
2499 const decl = mod.declPtr(decl_index);
2498 const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() };2500 const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() };
2499 const fwd = o.dg.fwd_decl.writer();2501 const fwd = o.dg.fwd_decl.writer();
25002502
...@@ -2634,9 +2636,10 @@ pub fn genFunc(f: *Function) !void {...@@ -2634,9 +2636,10 @@ pub fn genFunc(f: *Function) !void {
2634 const mod = o.dg.module;2636 const mod = o.dg.module;
2635 const gpa = o.dg.gpa;2637 const gpa = o.dg.gpa;
2636 const decl_index = o.dg.decl_index.unwrap().?;2638 const decl_index = o.dg.decl_index.unwrap().?;
2639 const decl = mod.declPtr(decl_index);
2637 const tv: TypedValue = .{2640 const tv: TypedValue = .{
2638 .ty = o.dg.decl.?.ty,2641 .ty = decl.ty,
2639 .val = o.dg.decl.?.val,2642 .val = decl.val,
2640 };2643 };
26412644
2642 o.code_header = std.ArrayList(u8).init(gpa);2645 o.code_header = std.ArrayList(u8).init(gpa);
...@@ -2719,19 +2722,20 @@ pub fn genDecl(o: *Object) !void {...@@ -2719,19 +2722,20 @@ pub fn genDecl(o: *Object) !void {
2719 defer tracy.end();2722 defer tracy.end();
27202723
2721 const mod = o.dg.module;2724 const mod = o.dg.module;
2722 const decl = o.dg.decl.?;2725 const decl_index = o.dg.decl_index.unwrap().?;
2723 const decl_c_value = .{ .decl = o.dg.decl_index.unwrap().? };2726 const decl_c_value = .{ .decl = decl_index };
2727 const decl = mod.declPtr(decl_index);
2724 const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() };2728 const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() };
27252729
2726 if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return;2730 if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return;
2727 if (tv.val.getExternFunc(mod)) |_| {2731 if (tv.val.getExternFunc(mod)) |_| {
2728 const fwd_decl_writer = o.dg.fwd_decl.writer();2732 const fwd_decl_writer = o.dg.fwd_decl.writer();
2729 try fwd_decl_writer.writeAll("zig_extern ");2733 try fwd_decl_writer.writeAll("zig_extern ");
2730 try o.dg.renderFunctionSignature(fwd_decl_writer, decl_c_value.decl, .forward, .{ .export_index = 0 });2734 try o.dg.renderFunctionSignature(fwd_decl_writer, decl_index, .forward, .{ .export_index = 0 });
2731 try fwd_decl_writer.writeAll(";\n");2735 try fwd_decl_writer.writeAll(";\n");
2732 try genExports(o);2736 try genExports(o);
2733 } else if (tv.val.getVariable(mod)) |variable| {2737 } else if (tv.val.getVariable(mod)) |variable| {
2734 try o.dg.renderFwdDecl(decl_c_value.decl, variable);2738 try o.dg.renderFwdDecl(decl_index, variable);
2735 try genExports(o);2739 try genExports(o);
27362740
2737 if (variable.is_extern) return;2741 if (variable.is_extern) return;
...@@ -2750,7 +2754,7 @@ pub fn genDecl(o: *Object) !void {...@@ -2750,7 +2754,7 @@ pub fn genDecl(o: *Object) !void {
2750 try w.writeByte(';');2754 try w.writeByte(';');
2751 try o.indent_writer.insertNewline();2755 try o.indent_writer.insertNewline();
2752 } else {2756 } else {
2753 const is_global = o.dg.module.decl_exports.contains(decl_c_value.decl);2757 const is_global = o.dg.module.decl_exports.contains(decl_index);
2754 const fwd_decl_writer = o.dg.fwd_decl.writer();2758 const fwd_decl_writer = o.dg.fwd_decl.writer();
27552759
2756 try fwd_decl_writer.writeAll(if (is_global) "zig_extern " else "static ");2760 try fwd_decl_writer.writeAll(if (is_global) "zig_extern " else "static ");
...@@ -2773,12 +2777,14 @@ pub fn genHeader(dg: *DeclGen) error{ AnalysisFail, OutOfMemory }!void {...@@ -2773,12 +2777,14 @@ pub fn genHeader(dg: *DeclGen) error{ AnalysisFail, OutOfMemory }!void {
2773 const tracy = trace(@src());2777 const tracy = trace(@src());
2774 defer tracy.end();2778 defer tracy.end();
27752779
2780 const mod = dg.module;
2781 const decl_index = dg.decl_index.unwrap().?;
2782 const decl = mod.declPtr(decl_index);
2776 const tv: TypedValue = .{2783 const tv: TypedValue = .{
2777 .ty = dg.decl.?.ty,2784 .ty = decl.ty,
2778 .val = dg.decl.?.val,2785 .val = decl.val,
2779 };2786 };
2780 const writer = dg.fwd_decl.writer();2787 const writer = dg.fwd_decl.writer();
2781 const mod = dg.module;
27822788
2783 switch (tv.ty.zigTypeTag(mod)) {2789 switch (tv.ty.zigTypeTag(mod)) {
2784 .Fn => {2790 .Fn => {
...@@ -3504,8 +3510,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValue {...@@ -3504,8 +3510,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValue {
3504 } else {3510 } else {
3505 try reap(f, inst, &.{un_op});3511 try reap(f, inst, &.{un_op});
3506 // Not even allowed to return void in a naked function.3512 // Not even allowed to return void in a naked function.
3507 if (if (f.object.dg.decl) |decl| decl.ty.fnCallingConvention(mod) != .Naked else true)3513 if (!f.object.dg.is_naked_fn) try writer.writeAll("return;\n");
3508 try writer.writeAll("return;\n");
3509 }3514 }
3510 return .none;3515 return .none;
3511}3516}
...@@ -4144,7 +4149,7 @@ fn airCall(...@@ -4144,7 +4149,7 @@ fn airCall(
4144) !CValue {4149) !CValue {
4145 const mod = f.object.dg.module;4150 const mod = f.object.dg.module;
4146 // Not even allowed to call panic in a naked function.4151 // Not even allowed to call panic in a naked function.
4147 if (f.object.dg.decl) |decl| if (decl.ty.fnCallingConvention(mod) == .Naked) return .none;4152 if (f.object.dg.is_naked_fn) return .none;
41484153
4149 const gpa = f.object.dg.gpa;4154 const gpa = f.object.dg.gpa;
4150 const writer = f.object.writer();4155 const writer = f.object.writer();
...@@ -4637,9 +4642,8 @@ fn bitcast(f: *Function, dest_ty: Type, operand: CValue, operand_ty: Type) !Loca...@@ -4637,9 +4642,8 @@ fn bitcast(f: *Function, dest_ty: Type, operand: CValue, operand_ty: Type) !Loca
4637}4642}
46384643
4639fn airTrap(f: *Function, writer: anytype) !CValue {4644fn airTrap(f: *Function, writer: anytype) !CValue {
4640 const mod = f.object.dg.module;
4641 // Not even allowed to call trap in a naked function.4645 // Not even allowed to call trap in a naked function.
4642 if (f.object.dg.decl) |decl| if (decl.ty.fnCallingConvention(mod) == .Naked) return .none;4646 if (f.object.dg.is_naked_fn) return .none;
46434647
4644 try writer.writeAll("zig_trap();\n");4648 try writer.writeAll("zig_trap();\n");
4645 return .none;4649 return .none;
...@@ -4682,9 +4686,8 @@ fn airFence(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -4682,9 +4686,8 @@ fn airFence(f: *Function, inst: Air.Inst.Index) !CValue {
4682}4686}
46834687
4684fn airUnreach(f: *Function) !CValue {4688fn airUnreach(f: *Function) !CValue {
4685 const mod = f.object.dg.module;
4686 // Not even allowed to call unreachable in a naked function.4689 // Not even allowed to call unreachable in a naked function.
4687 if (f.object.dg.decl) |decl| if (decl.ty.fnCallingConvention(mod) == .Naked) return .none;4690 if (f.object.dg.is_naked_fn) return .none;
46884691
4689 try f.object.writer().writeAll("zig_unreachable();\n");4692 try f.object.writer().writeAll("zig_unreachable();\n");
4690 return .none;4693 return .none;
...@@ -7194,8 +7197,11 @@ fn airMulAdd(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7194,8 +7197,11 @@ fn airMulAdd(f: *Function, inst: Air.Inst.Index) !CValue {
7194}7197}
71957198
7196fn airCVaStart(f: *Function, inst: Air.Inst.Index) !CValue {7199fn airCVaStart(f: *Function, inst: Air.Inst.Index) !CValue {
7200 const mod = f.object.dg.module;
7197 const inst_ty = f.typeOfIndex(inst);7201 const inst_ty = f.typeOfIndex(inst);
7198 const fn_cty = try f.typeToCType(f.object.dg.decl.?.ty, .complete);7202 const decl_index = f.object.dg.decl_index.unwrap().?;
7203 const decl = mod.declPtr(decl_index);
7204 const fn_cty = try f.typeToCType(decl.ty, .complete);
7199 const param_len = fn_cty.castTag(.varargs_function).?.data.param_types.len;7205 const param_len = fn_cty.castTag(.varargs_function).?.data.param_types.len;
72007206
7201 const writer = f.object.writer();7207 const writer = f.object.writer();
src/link/C.zig+5-6
...@@ -139,6 +139,7 @@ pub fn updateFunc(self: *C, module: *Module, func_index: InternPool.Index, air:...@@ -139,6 +139,7 @@ pub fn updateFunc(self: *C, module: *Module, func_index: InternPool.Index, air:
139139
140 const func = module.funcInfo(func_index);140 const func = module.funcInfo(func_index);
141 const decl_index = func.owner_decl;141 const decl_index = func.owner_decl;
142 const decl = module.declPtr(decl_index);
142 const gop = try self.decl_table.getOrPut(gpa, decl_index);143 const gop = try self.decl_table.getOrPut(gpa, decl_index);
143 if (!gop.found_existing) {144 if (!gop.found_existing) {
144 gop.value_ptr.* = .{};145 gop.value_ptr.* = .{};
...@@ -163,7 +164,7 @@ pub fn updateFunc(self: *C, module: *Module, func_index: InternPool.Index, air:...@@ -163,7 +164,7 @@ pub fn updateFunc(self: *C, module: *Module, func_index: InternPool.Index, air:
163 .module = module,164 .module = module,
164 .error_msg = null,165 .error_msg = null,
165 .decl_index = decl_index.toOptional(),166 .decl_index = decl_index.toOptional(),
166 .decl = module.declPtr(decl_index),167 .is_naked_fn = decl.ty.fnCallingConvention(module) == .Naked,
167 .fwd_decl = fwd_decl.toManaged(gpa),168 .fwd_decl = fwd_decl.toManaged(gpa),
168 .ctypes = ctypes.*,169 .ctypes = ctypes.*,
169 },170 },
...@@ -216,15 +217,13 @@ pub fn updateDecl(self: *C, module: *Module, decl_index: Module.Decl.Index) !voi...@@ -216,15 +217,13 @@ pub fn updateDecl(self: *C, module: *Module, decl_index: Module.Decl.Index) !voi
216 fwd_decl.clearRetainingCapacity();217 fwd_decl.clearRetainingCapacity();
217 code.clearRetainingCapacity();218 code.clearRetainingCapacity();
218219
219 const decl = module.declPtr(decl_index);
220
221 var object: codegen.Object = .{220 var object: codegen.Object = .{
222 .dg = .{221 .dg = .{
223 .gpa = gpa,222 .gpa = gpa,
224 .module = module,223 .module = module,
225 .error_msg = null,224 .error_msg = null,
226 .decl_index = decl_index.toOptional(),225 .decl_index = decl_index.toOptional(),
227 .decl = decl,226 .is_naked_fn = false,
228 .fwd_decl = fwd_decl.toManaged(gpa),227 .fwd_decl = fwd_decl.toManaged(gpa),
229 .ctypes = ctypes.*,228 .ctypes = ctypes.*,
230 },229 },
...@@ -510,7 +509,7 @@ fn flushErrDecls(self: *C, ctypes: *codegen.CType.Store) FlushDeclError!void {...@@ -510,7 +509,7 @@ fn flushErrDecls(self: *C, ctypes: *codegen.CType.Store) FlushDeclError!void {
510 .module = self.base.options.module.?,509 .module = self.base.options.module.?,
511 .error_msg = null,510 .error_msg = null,
512 .decl_index = .none,511 .decl_index = .none,
513 .decl = null,512 .is_naked_fn = false,
514 .fwd_decl = fwd_decl.toManaged(gpa),513 .fwd_decl = fwd_decl.toManaged(gpa),
515 .ctypes = ctypes.*,514 .ctypes = ctypes.*,
516 },515 },
...@@ -544,7 +543,7 @@ fn flushLazyFn(self: *C, ctypes: *codegen.CType.Store, lazy_fn: codegen.LazyFnMa...@@ -544,7 +543,7 @@ fn flushLazyFn(self: *C, ctypes: *codegen.CType.Store, lazy_fn: codegen.LazyFnMa
544 .module = self.base.options.module.?,543 .module = self.base.options.module.?,
545 .error_msg = null,544 .error_msg = null,
546 .decl_index = .none,545 .decl_index = .none,
547 .decl = null,546 .is_naked_fn = false,
548 .fwd_decl = fwd_decl.toManaged(gpa),547 .fwd_decl = fwd_decl.toManaged(gpa),
549 .ctypes = ctypes.*,548 .ctypes = ctypes.*,
550 },549 },