From 4e64373fc07a1e24735bcbdfd463e11839c8c273 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 30 Dec 2022 14:28:04 +0200 Subject: fix generic function arg debug info referencing wrong parameter Closes #14123 --- src/codegen/llvm.zig | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 887e8d2bfc..fcf9423cd0 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -8062,7 +8062,7 @@ pub const FuncGen = struct { return arg_val; } - const src_index = self.getSrcArgIndex(self.arg_index - 1); + const src_index = self.air.instructions.items(.data)[inst].arg.src_index; const func = self.dg.decl.getFunction().?; const lbrace_line = self.dg.module.declPtr(func.owner_decl).src_line + func.lbrace_line + 1; const lbrace_col = func.lbrace_column + 1; @@ -8095,16 +8095,6 @@ pub const FuncGen = struct { return arg_val; } - fn getSrcArgIndex(self: *FuncGen, runtime_index: u32) u32 { - const fn_info = self.dg.decl.ty.fnInfo(); - var i: u32 = 0; - for (fn_info.param_types) |param_ty, src_index| { - if (!param_ty.hasRuntimeBitsIgnoreComptime()) continue; - if (i == runtime_index) return @intCast(u32, src_index); - i += 1; - } else unreachable; - } - fn airAlloc(self: *FuncGen, inst: Air.Inst.Index) !?*llvm.Value { if (self.liveness.isUnused(inst)) return null; const ptr_ty = self.air.typeOfIndex(inst); -- cgit v1.2.3 From f874b5e1e08860c169b9a318391aabedfd3f7ff0 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 30 Dec 2022 16:21:16 +0200 Subject: llvm: work around lldb bugs Closes #14122 --- src/codegen/llvm.zig | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index fcf9423cd0..230f306dac 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1459,7 +1459,8 @@ pub const Object = struct { .signed => DW.ATE.signed, .unsigned => DW.ATE.unsigned, }; - const di_type = dib.createBasicType(name, info.bits, dwarf_encoding); + const di_bits = ty.abiSize(target) * 8; // lldb cannot handle non-byte sized types + const di_type = dib.createBasicType(name, di_bits, dwarf_encoding); gop.value_ptr.* = AnnotatedDITypePtr.initFull(di_type); return di_type; }, @@ -1550,7 +1551,8 @@ pub const Object = struct { return di_type; }, .Bool => { - const di_type = dib.createBasicType("bool", 1, DW.ATE.boolean); + const di_bits = 8; // lldb cannot handle non-byte sized types + const di_type = dib.createBasicType("bool", di_bits, DW.ATE.boolean); gop.value_ptr.* = AnnotatedDITypePtr.initFull(di_type); return di_type; }, @@ -1739,7 +1741,8 @@ pub const Object = struct { var buf: Type.Payload.ElemType = undefined; const child_ty = ty.optionalChild(&buf); if (!child_ty.hasRuntimeBitsIgnoreComptime()) { - const di_ty = dib.createBasicType(name, 1, DW.ATE.boolean); + const di_bits = 8; // lldb cannot handle non-byte sized types + const di_ty = dib.createBasicType(name, di_bits, DW.ATE.boolean); gop.value_ptr.* = AnnotatedDITypePtr.initFull(di_ty); return di_ty; } @@ -1934,7 +1937,8 @@ pub const Object = struct { .signed => DW.ATE.signed, .unsigned => DW.ATE.unsigned, }; - const di_ty = dib.createBasicType(name, info.bits, dwarf_encoding); + const di_bits = ty.abiSize(target) * 8; // lldb cannot handle non-byte sized types + const di_ty = dib.createBasicType(name, di_bits, dwarf_encoding); gop.value_ptr.* = AnnotatedDITypePtr.initFull(di_ty); return di_ty; } -- cgit v1.2.3 From bd711dfd255447883d25f422031592e3824ca296 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 30 Dec 2022 20:54:24 +0200 Subject: llvm: do not pad vector element debug types --- src/codegen/llvm.zig | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/codegen') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 230f306dac..c693beaabf 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1725,10 +1725,31 @@ pub const Object = struct { return array_di_ty; }, .Vector => { + const elem_ty = ty.elemType2(); + // Vector elements cannot be padded since that would make + // @bitSizOf(elem) * len > @bitSizOf(vec). + // Neither gdb nor lldb seem to be able to display non-byte sized + // vectors properly. + const elem_di_type = switch (elem_ty.zigTypeTag()) { + .Int => blk: { + const info = elem_ty.intInfo(target); + assert(info.bits != 0); + const name = try ty.nameAlloc(gpa, o.module); + defer gpa.free(name); + const dwarf_encoding: c_uint = switch (info.signedness) { + .signed => DW.ATE.signed, + .unsigned => DW.ATE.unsigned, + }; + break :blk dib.createBasicType(name, info.bits, dwarf_encoding); + }, + .Bool => dib.createBasicType("bool", 1, DW.ATE.boolean), + else => try o.lowerDebugType(ty.childType(), .full), + }; + const vector_di_ty = dib.createVectorType( ty.abiSize(target) * 8, ty.abiAlignment(target) * 8, - try o.lowerDebugType(ty.childType(), .full), + elem_di_type, ty.vectorLen(), ); // The recursive call to `lowerDebugType` means we can't use `gop` anymore. -- cgit v1.2.3