| ... | ... | @@ -522,8 +522,8 @@ pub const Object = struct { |
| 522 | 522 | pub const DeclGen = struct { |
| 523 | 523 | gpa: mem.Allocator, |
| 524 | 524 | module: *Module, |
| 525 | | decl: ?*Decl, |
| 526 | 525 | decl_index: Decl.OptionalIndex, |
| 526 | is_naked_fn: bool, |
| 527 | 527 | /// This is a borrowed reference from `link.C`. |
| 528 | 528 | fwd_decl: std.ArrayList(u8), |
| 529 | 529 | error_msg: ?*Module.ErrorMsg, |
| ... | ... | @@ -532,8 +532,10 @@ pub const DeclGen = struct { |
| 532 | 532 | fn fail(dg: *DeclGen, comptime format: []const u8, args: anytype) error{ AnalysisFail, OutOfMemory } { |
| 533 | 533 | @setCold(true); |
| 534 | 534 | const mod = dg.module; |
| 535 | const decl_index = dg.decl_index.unwrap().?; |
| 536 | const decl = mod.declPtr(decl_index); |
| 535 | 537 | const src = LazySrcLoc.nodeOffset(0); |
| 536 | | const src_loc = src.toSrcLoc(dg.decl.?, mod); |
| 538 | const src_loc = src.toSrcLoc(decl, mod); |
| 537 | 539 | dg.error_msg = try Module.ErrorMsg.create(dg.gpa, src_loc, format, args); |
| 538 | 540 | return error.AnalysisFail; |
| 539 | 541 | } |
| ... | ... | @@ -2493,8 +2495,8 @@ fn genExports(o: *Object) !void { |
| 2493 | 2495 | |
| 2494 | 2496 | const mod = o.dg.module; |
| 2495 | 2497 | const ip = &mod.intern_pool; |
| 2496 | | const decl = o.dg.decl.?; |
| 2497 | 2498 | const decl_index = o.dg.decl_index.unwrap().?; |
| 2499 | const decl = mod.declPtr(decl_index); |
| 2498 | 2500 | const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() }; |
| 2499 | 2501 | const fwd = o.dg.fwd_decl.writer(); |
| 2500 | 2502 | |
| ... | ... | @@ -2634,9 +2636,10 @@ pub fn genFunc(f: *Function) !void { |
| 2634 | 2636 | const mod = o.dg.module; |
| 2635 | 2637 | const gpa = o.dg.gpa; |
| 2636 | 2638 | const decl_index = o.dg.decl_index.unwrap().?; |
| 2639 | const decl = mod.declPtr(decl_index); |
| 2637 | 2640 | const tv: TypedValue = .{ |
| 2638 | | .ty = o.dg.decl.?.ty, |
| 2639 | | .val = o.dg.decl.?.val, |
| 2641 | .ty = decl.ty, |
| 2642 | .val = decl.val, |
| 2640 | 2643 | }; |
| 2641 | 2644 | |
| 2642 | 2645 | o.code_header = std.ArrayList(u8).init(gpa); |
| ... | ... | @@ -2719,19 +2722,20 @@ pub fn genDecl(o: *Object) !void { |
| 2719 | 2722 | defer tracy.end(); |
| 2720 | 2723 | |
| 2721 | 2724 | const mod = o.dg.module; |
| 2722 | | const decl = o.dg.decl.?; |
| 2723 | | const decl_c_value = .{ .decl = o.dg.decl_index.unwrap().? }; |
| 2725 | const decl_index = o.dg.decl_index.unwrap().?; |
| 2726 | const decl_c_value = .{ .decl = decl_index }; |
| 2727 | const decl = mod.declPtr(decl_index); |
| 2724 | 2728 | const tv: TypedValue = .{ .ty = decl.ty, .val = (try decl.internValue(mod)).toValue() }; |
| 2725 | 2729 | |
| 2726 | 2730 | if (!tv.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) return; |
| 2727 | 2731 | if (tv.val.getExternFunc(mod)) |_| { |
| 2728 | 2732 | const fwd_decl_writer = o.dg.fwd_decl.writer(); |
| 2729 | 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 | 2735 | try fwd_decl_writer.writeAll(";\n"); |
| 2732 | 2736 | try genExports(o); |
| 2733 | 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 | 2739 | try genExports(o); |
| 2736 | 2740 | |
| 2737 | 2741 | if (variable.is_extern) return; |
| ... | ... | @@ -2750,7 +2754,7 @@ pub fn genDecl(o: *Object) !void { |
| 2750 | 2754 | try w.writeByte(';'); |
| 2751 | 2755 | try o.indent_writer.insertNewline(); |
| 2752 | 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 | 2758 | const fwd_decl_writer = o.dg.fwd_decl.writer(); |
| 2755 | 2759 | |
| 2756 | 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 | 2777 | const tracy = trace(@src()); |
| 2774 | 2778 | defer tracy.end(); |
| 2775 | 2779 | |
| 2780 | const mod = dg.module; |
| 2781 | const decl_index = dg.decl_index.unwrap().?; |
| 2782 | const decl = mod.declPtr(decl_index); |
| 2776 | 2783 | const tv: TypedValue = .{ |
| 2777 | | .ty = dg.decl.?.ty, |
| 2778 | | .val = dg.decl.?.val, |
| 2784 | .ty = decl.ty, |
| 2785 | .val = decl.val, |
| 2779 | 2786 | }; |
| 2780 | 2787 | const writer = dg.fwd_decl.writer(); |
| 2781 | | const mod = dg.module; |
| 2782 | 2788 | |
| 2783 | 2789 | switch (tv.ty.zigTypeTag(mod)) { |
| 2784 | 2790 | .Fn => { |
| ... | ... | @@ -3504,8 +3510,7 @@ fn airRet(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValue { |
| 3504 | 3510 | } else { |
| 3505 | 3511 | try reap(f, inst, &.{un_op}); |
| 3506 | 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) |
| 3508 | | try writer.writeAll("return;\n"); |
| 3513 | if (!f.object.dg.is_naked_fn) try writer.writeAll("return;\n"); |
| 3509 | 3514 | } |
| 3510 | 3515 | return .none; |
| 3511 | 3516 | } |
| ... | ... | @@ -4144,7 +4149,7 @@ fn airCall( |
| 4144 | 4149 | ) !CValue { |
| 4145 | 4150 | const mod = f.object.dg.module; |
| 4146 | 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; |
| 4148 | 4153 | |
| 4149 | 4154 | const gpa = f.object.dg.gpa; |
| 4150 | 4155 | const writer = f.object.writer(); |
| ... | ... | @@ -4637,9 +4642,8 @@ fn bitcast(f: *Function, dest_ty: Type, operand: CValue, operand_ty: Type) !Loca |
| 4637 | 4642 | } |
| 4638 | 4643 | |
| 4639 | 4644 | fn airTrap(f: *Function, writer: anytype) !CValue { |
| 4640 | | const mod = f.object.dg.module; |
| 4641 | 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; |
| 4643 | 4647 | |
| 4644 | 4648 | try writer.writeAll("zig_trap();\n"); |
| 4645 | 4649 | return .none; |
| ... | ... | @@ -4682,9 +4686,8 @@ fn airFence(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4682 | 4686 | } |
| 4683 | 4687 | |
| 4684 | 4688 | fn airUnreach(f: *Function) !CValue { |
| 4685 | | const mod = f.object.dg.module; |
| 4686 | 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; |
| 4688 | 4691 | |
| 4689 | 4692 | try f.object.writer().writeAll("zig_unreachable();\n"); |
| 4690 | 4693 | return .none; |
| ... | ... | @@ -7194,8 +7197,11 @@ fn airMulAdd(f: *Function, inst: Air.Inst.Index) !CValue { |
| 7194 | 7197 | } |
| 7195 | 7198 | |
| 7196 | 7199 | fn airCVaStart(f: *Function, inst: Air.Inst.Index) !CValue { |
| 7200 | const mod = f.object.dg.module; |
| 7197 | 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 | 7205 | const param_len = fn_cty.castTag(.varargs_function).?.data.param_types.len; |
| 7200 | 7206 | |
| 7201 | 7207 | const writer = f.object.writer(); |