diff --git a/src/Air.zig b/src/Air.zig index b291dbee7a..d1c6d184e6 100644 --- a/src/Air.zig +++ b/src/Air.zig @@ -1034,7 +1034,12 @@ pub const Inst = struct { ty: Type, arg: struct { ty: Ref, - src_index: u32, + /// Index into `extra` of a null-terminated string representing the parameter name. + /// This is `.none` if debug info is stripped. + name: enum(u32) { + none = std.math.maxInt(u32), + _, + }, }, ty_op: struct { ty: Ref, diff --git a/src/Sema.zig b/src/Sema.zig index 41087a6360..170b773d1f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6718,13 +6718,7 @@ fn addDbgVar( if (block.need_debug_scope) |ptr| ptr.* = true; // Add the name to the AIR. - const name_extra_index: u32 = @intCast(sema.air_extra.items.len); - const elements_used = name.len / 4 + 1; - try sema.air_extra.ensureUnusedCapacity(sema.gpa, elements_used); - const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice()); - @memcpy(buffer[0..name.len], name); - buffer[name.len] = 0; - sema.air_extra.items.len += elements_used; + const name_extra_index = try sema.appendAirString(name); _ = try block.addInst(.{ .tag = air_tag, @@ -6735,6 +6729,16 @@ fn addDbgVar( }); } +pub fn appendAirString(sema: *Sema, str: []const u8) Allocator.Error!u32 { + const str_extra_index: u32 = @intCast(sema.air_extra.items.len); + const elements_used = str.len / 4 + 1; + const elements = try sema.air_extra.addManyAsSlice(sema.gpa, elements_used); + const buffer = mem.sliceAsBytes(elements); + @memcpy(buffer[0..str.len], str); + buffer[str.len] = 0; + return str_extra_index; +} + fn zirDeclRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const pt = sema.pt; const mod = pt.zcu; @@ -8354,13 +8358,6 @@ fn instantiateGenericCall( } } else { // The parameter is runtime-known. - child_sema.inst_map.putAssumeCapacityNoClobber(param_inst, try child_block.addInst(.{ - .tag = .arg, - .data = .{ .arg = .{ - .ty = Air.internedToRef(arg_ty.toIntern()), - .src_index = @intCast(arg_index), - } }, - })); const param_name: Zir.NullTerminatedString = switch (param_tag) { .param_anytype => fn_zir.instructions.items(.data)[@intFromEnum(param_inst)].str_tok.start, .param => name: { @@ -8370,6 +8367,16 @@ fn instantiateGenericCall( }, else => unreachable, }; + child_sema.inst_map.putAssumeCapacityNoClobber(param_inst, try child_block.addInst(.{ + .tag = .arg, + .data = .{ .arg = .{ + .ty = Air.internedToRef(arg_ty.toIntern()), + .name = if (child_block.ownerModule().strip) + .none + else + @enumFromInt(try sema.appendAirString(fn_zir.nullTerminatedString(param_name))), + } }, + })); try child_block.params.append(sema.arena, .{ .ty = arg_ty.toIntern(), // This is the type after coercion .is_comptime = false, // We're adding only runtime args to the instantiation diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index eaff323195..48350033af 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -1907,10 +1907,17 @@ pub fn analyzeFnBody(pt: Zcu.PerThread, func_index: InternPool.Index, arena: All runtime_params_len; var runtime_param_index: usize = 0; - for (fn_info.param_body[0..src_params_len], 0..) |inst, src_param_index| { + for (fn_info.param_body[0..src_params_len]) |inst| { const gop = sema.inst_map.getOrPutAssumeCapacity(inst); if (gop.found_existing) continue; // provided above by comptime arg + const inst_info = sema.code.instructions.get(@intFromEnum(inst)); + const param_name: Zir.NullTerminatedString = switch (inst_info.tag) { + .param_anytype => inst_info.data.str_tok.start, + .param => sema.code.extraData(Zir.Inst.Param, inst_info.data.pl_tok.payload_index).data.name, + else => unreachable, + }; + const param_ty = fn_ty_info.param_types.get(ip)[runtime_param_index]; runtime_param_index += 1; @@ -1931,7 +1938,10 @@ pub fn analyzeFnBody(pt: Zcu.PerThread, func_index: InternPool.Index, arena: All .tag = .arg, .data = .{ .arg = .{ .ty = Air.internedToRef(param_ty), - .src_index = @intCast(src_param_index), + .name = if (inner_block.ownerModule().strip) + .none + else + @enumFromInt(try sema.appendAirString(sema.code.nullTerminatedString(param_name))), } }, }); } diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index 7a2c0178cd..8a020fc521 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -4231,19 +4231,19 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void { while (self.args[arg_index] == .none) arg_index += 1; self.arg_index = arg_index + 1; - const pt = self.pt; - const mod = pt.zcu; const ty = self.typeOfIndex(inst); const tag = self.air.instructions.items(.tag)[@intFromEnum(inst)]; - const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index; - const name = mod.getParamName(self.func_index, src_index); - try self.dbg_info_relocs.append(self.gpa, .{ - .tag = tag, - .ty = ty, - .name = name, - .mcv = self.args[arg_index], - }); + const name_nts = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.name; + if (name_nts != .none) { + const name = self.air.nullTerminatedString(@intFromEnum(name_nts)); + try self.dbg_info_relocs.append(self.gpa, .{ + .tag = tag, + .ty = ty, + .name = name, + .mcv = self.args[arg_index], + }); + } const result: MCValue = if (self.liveness.isUnused(inst)) .dead else self.args[arg_index]; return self.finishAir(inst, result, .{ .none, .none, .none }); diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig index 0dd513d4fe..f923c001e1 100644 --- a/src/arch/arm/CodeGen.zig +++ b/src/arch/arm/CodeGen.zig @@ -4206,19 +4206,19 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void { while (self.args[arg_index] == .none) arg_index += 1; self.arg_index = arg_index + 1; - const pt = self.pt; - const mod = pt.zcu; const ty = self.typeOfIndex(inst); const tag = self.air.instructions.items(.tag)[@intFromEnum(inst)]; - const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index; - const name = mod.getParamName(self.func_index, src_index); - try self.dbg_info_relocs.append(self.gpa, .{ - .tag = tag, - .ty = ty, - .name = name, - .mcv = self.args[arg_index], - }); + const name_nts = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.name; + if (name_nts != .none) { + const name = self.air.nullTerminatedString(@intFromEnum(name_nts)); + try self.dbg_info_relocs.append(self.gpa, .{ + .tag = tag, + .ty = ty, + .name = name, + .mcv = self.args[arg_index], + }); + } const result: MCValue = if (self.liveness.isUnused(inst)) .dead else self.args[arg_index]; return self.finishAir(inst, result, .{ .none, .none, .none }); diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index 6bea660243..70876a298b 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -4051,7 +4051,8 @@ fn genArgDbgInfo(func: Func, inst: Air.Inst.Index, mcv: MCValue) !void { const arg = func.air.instructions.items(.data)[@intFromEnum(inst)].arg; const ty = arg.ty.toType(); const owner_decl = zcu.funcOwnerDeclIndex(func.func_index); - const name = zcu.getParamName(func.func_index, arg.src_index); + if (arg.name == .none) return; + const name = func.air.nullTerminatedString(@intFromEnum(arg.name)); switch (func.debug_output) { .dwarf => |dw| switch (mcv) { diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig index 6dea497753..1c3b2327b6 100644 --- a/src/arch/sparc64/CodeGen.zig +++ b/src/arch/sparc64/CodeGen.zig @@ -3614,7 +3614,8 @@ fn genArgDbgInfo(self: Self, inst: Air.Inst.Index, mcv: MCValue) !void { const arg = self.air.instructions.items(.data)[@intFromEnum(inst)].arg; const ty = arg.ty.toType(); const owner_decl = mod.funcOwnerDeclIndex(self.func_index); - const name = mod.getParamName(self.func_index, arg.src_index); + if (arg.name == .none) return; + const name = self.air.nullTerminatedString(@intFromEnum(arg.name)); switch (self.debug_output) { .dwarf => |dw| switch (mcv) { diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index 3b81ee9c19..deab261666 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -2585,11 +2585,13 @@ fn airArg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { switch (func.debug_output) { .dwarf => |dwarf| { - const src_index = func.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index; - const name = mod.getParamName(func.func_index, src_index); - try dwarf.genArgDbgInfo(name, arg_ty, mod.funcOwnerDeclIndex(func.func_index), .{ - .wasm_local = arg.local.value, - }); + const name_nts = func.air.instructions.items(.data)[@intFromEnum(inst)].arg.name; + if (name_nts != .none) { + const name = func.air.nullTerminatedString(@intFromEnum(name_nts)); + try dwarf.genArgDbgInfo(name, arg_ty, mod.funcOwnerDeclIndex(func.func_index), .{ + .wasm_local = arg.local.value, + }); + } }, else => {}, } diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 870716966f..1b1c1dd7d7 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -11920,9 +11920,11 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void { else => return self.fail("TODO implement arg for {}", .{src_mcv}), }; - const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index; - const name = mod.getParamName(self.owner.func_index, src_index); - try self.genArgDbgInfo(arg_ty, name, src_mcv); + const name_nts = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.name; + switch (name_nts) { + .none => {}, + _ => try self.genArgDbgInfo(arg_ty, self.air.nullTerminatedString(@intFromEnum(name_nts)), src_mcv), + } break :result dst_mcv; }; diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 0a23d687d2..40110993b9 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -8859,19 +8859,21 @@ pub const FuncGen = struct { self.arg_index += 1; // llvm does not support debug info for naked function arguments - if (self.wip.strip or self.is_naked) return arg_val; + if (self.is_naked) return arg_val; const inst_ty = self.typeOfIndex(inst); if (needDbgVarWorkaround(o)) return arg_val; - const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index; + const name = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.name; + if (name == .none) return arg_val; + const func_index = self.dg.decl.getOwnedFunctionIndex(); const func = mod.funcInfo(func_index); const lbrace_line = mod.declPtr(func.owner_decl).navSrcLine(mod) + func.lbrace_line + 1; const lbrace_col = func.lbrace_column + 1; const debug_parameter = try o.builder.debugParameter( - try o.builder.metadataString(mod.getParamName(func_index, src_index)), + try o.builder.metadataString(self.air.nullTerminatedString(@intFromEnum(name))), self.file, self.scope, lbrace_line, diff --git a/src/print_air.zig b/src/print_air.zig index d85750bd27..1872b480f5 100644 --- a/src/print_air.zig +++ b/src/print_air.zig @@ -356,7 +356,13 @@ const Writer = struct { fn writeArg(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { const arg = w.air.instructions.items(.data)[@intFromEnum(inst)].arg; try w.writeType(s, arg.ty.toType()); - try s.print(", {d}", .{arg.src_index}); + switch (arg.name) { + .none => {}, + _ => { + const name = w.air.nullTerminatedString(@intFromEnum(arg.name)); + try s.print(", \"{}\"", .{std.zig.fmtEscapes(name)}); + }, + } } fn writeTyOp(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {