From aa7e65d5ba865132e7080b9d1c8a2fb0eb38cc28 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Wed, 30 Nov 2022 22:51:39 +0200 Subject: [PATCH] Merge pull request #13719 from Vexu/debug Improve debuggability of programs built by the self hosted compiler --- lib/build_runner.zig | 2 ++ lib/std/build.zig | 5 +++++ src/Sema.zig | 12 +++++++++--- src/codegen/llvm.zig | 12 ++++++++++++ src/main.zig | 5 +++++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/build_runner.zig b/lib/build_runner.zig index f47822f0b7..510bae4a52 100644 --- a/lib/build_runner.zig +++ b/lib/build_runner.zig @@ -142,6 +142,8 @@ pub fn main() !void { return usageAndErr(builder, false, stderr_stream); }; try debug_log_scopes.append(next_arg); + } else if (mem.eql(u8, arg, "--debug-compile-errors")) { + builder.debug_compile_errors = true; } else if (mem.eql(u8, arg, "--glibc-runtimes")) { builder.glibc_runtimes_dir = nextArg(args, &arg_idx) orelse { std.debug.print("Expected argument after --glibc-runtimes\n\n", .{}); diff --git a/lib/std/build.zig b/lib/std/build.zig index 8c6af98eea..1b9a61beb6 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -72,6 +72,7 @@ pub const Builder = struct { pkg_config_pkg_list: ?(PkgConfigError![]const PkgConfigPkg) = null, args: ?[][]const u8 = null, debug_log_scopes: []const []const u8 = &.{}, + debug_compile_errors: bool = false, /// Experimental. Use system Darling installation to run cross compiled macOS build artifacts. enable_darling: bool = false, @@ -2674,6 +2675,10 @@ pub const LibExeObjStep = struct { try zig_args.append(log_scope); } + if (builder.debug_compile_errors) { + try zig_args.append("--debug-compile-errors"); + } + if (builder.verbose_cimport) zig_args.append("--verbose-cimport") catch unreachable; if (builder.verbose_air) zig_args.append("--verbose-air") catch unreachable; if (builder.verbose_llvm_ir) zig_args.append("--verbose-llvm-ir") catch unreachable; diff --git a/src/Sema.zig b/src/Sema.zig index 92eadc3387..54e312b523 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2091,10 +2091,16 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError { @setCold(true); if (crash_report.is_enabled and sema.mod.comp.debug_compile_errors) { - std.debug.print("compile error during Sema: {s}, src: {s}:{}\n", .{ + const err_path = err_msg.src_loc.file_scope.fullPath(sema.mod.gpa) catch unreachable; + const err_source = err_msg.src_loc.file_scope.getSource(sema.mod.gpa) catch unreachable; + const err_span = err_msg.src_loc.span(sema.mod.gpa) catch unreachable; + const err_loc = std.zig.findLineColumn(err_source.bytes, err_span.main); + std.debug.print("compile error during Sema:\n{s}:{d}:{d}: error: {s}\n{s}\n\n", .{ + err_path, + err_loc.line + 1, + err_loc.column + 1, err_msg.msg, - err_msg.src_loc.file_scope.sub_file_path, - err_msg.src_loc.lazy, + err_loc.source_line, }); crash_report.compilerPanic("unexpected compile error occurred", null, null); } diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 085f55cc3a..e698b3c30e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -6090,6 +6090,12 @@ pub const FuncGen = struct { const insert_block = self.builder.getInsertBlock(); if (isByRef(operand_ty)) { _ = dib.insertDeclareAtEnd(operand, di_local_var, debug_loc, insert_block); + } else if (self.dg.module.comp.bin_file.options.optimize_mode == .Debug) { + const alignment = operand_ty.abiAlignment(self.dg.module.getTarget()); + const alloca = self.buildAlloca(operand.typeOf(), alignment); + const store_inst = self.builder.buildStore(operand, alloca); + store_inst.setAlignment(alignment); + _ = dib.insertDeclareAtEnd(alloca, di_local_var, debug_loc, insert_block); } else { _ = dib.insertDbgValueIntrinsicAtEnd(operand, di_local_var, debug_loc, insert_block); } @@ -8028,6 +8034,12 @@ pub const FuncGen = struct { const insert_block = self.builder.getInsertBlock(); if (isByRef(inst_ty)) { _ = dib.insertDeclareAtEnd(arg_val, di_local_var, debug_loc, insert_block); + } else if (self.dg.module.comp.bin_file.options.optimize_mode == .Debug) { + const alignment = inst_ty.abiAlignment(self.dg.module.getTarget()); + const alloca = self.buildAlloca(arg_val.typeOf(), alignment); + const store_inst = self.builder.buildStore(arg_val, alloca); + store_inst.setAlignment(alignment); + _ = dib.insertDeclareAtEnd(alloca, di_local_var, debug_loc, insert_block); } else { _ = dib.insertDbgValueIntrinsicAtEnd(arg_val, di_local_var, debug_loc, insert_block); } diff --git a/src/main.zig b/src/main.zig index 3774ac40c5..786b5e089c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3752,6 +3752,7 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi var override_global_cache_dir: ?[]const u8 = try optionalStringEnvVar(arena, "ZIG_GLOBAL_CACHE_DIR"); var override_local_cache_dir: ?[]const u8 = try optionalStringEnvVar(arena, "ZIG_LOCAL_CACHE_DIR"); var child_argv = std.ArrayList([]const u8).init(arena); + var debug_compile_errors = false; const argv_index_exe = child_argv.items.len; _ = try child_argv.addOne(); @@ -3807,6 +3808,9 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi try child_argv.append(arg); } else if (mem.eql(u8, arg, "-fno-reference-trace")) { try child_argv.append(arg); + } else if (mem.eql(u8, arg, "--debug-compile-errors")) { + try child_argv.append(arg); + debug_compile_errors = true; } } try child_argv.append(arg); @@ -3940,6 +3944,7 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi .thread_pool = &thread_pool, .use_stage1 = use_stage1, .cache_mode = .whole, + .debug_compile_errors = debug_compile_errors, }) catch |err| { fatal("unable to create compilation: {s}", .{@errorName(err)}); };