diff --git a/src/Compilation.zig b/src/Compilation.zig index 3007a5d336..f997b53388 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -82,6 +82,9 @@ disable_c_depfile: bool, time_report: bool, stack_report: bool, unwind_tables: bool, +test_evented_io: bool, +debug_compiler_runtime_libs: bool, +debug_compile_errors: bool, c_source_files: []const CSourceFile, clang_argv: []const []const u8, @@ -138,8 +141,6 @@ mutex: std.Thread.Mutex = .{}, test_filter: ?[]const u8, test_name_prefix: ?[]const u8, -test_evented_io: bool, -debug_compiler_runtime_libs: bool, emit_asm: ?EmitLoc, emit_llvm_ir: ?EmitLoc, @@ -727,6 +728,7 @@ pub const InitOptions = struct { is_test: bool = false, test_evented_io: bool = false, debug_compiler_runtime_libs: bool = false, + debug_compile_errors: bool = false, /// Normally when you create a `Compilation`, Zig will automatically build /// and link in required dependencies, such as compiler-rt and libc. When /// building such dependencies themselves, this flag must be set to avoid @@ -1471,6 +1473,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { .test_name_prefix = options.test_name_prefix, .test_evented_io = options.test_evented_io, .debug_compiler_runtime_libs = options.debug_compiler_runtime_libs, + .debug_compile_errors = options.debug_compile_errors, .work_queue_wait_group = undefined, .astgen_wait_group = undefined, }; diff --git a/src/Sema.zig b/src/Sema.zig index 0d0faf2a4b..31846a0f91 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1213,6 +1213,15 @@ pub fn fail( 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", .{ + err_msg.msg, + err_msg.src_loc.file_scope.sub_file_path, + err_msg.src_loc.lazy, + }); + crash_report.compilerPanic("unexpected compile error occurred", null); + } + const mod = sema.mod; { diff --git a/src/crash_report.zig b/src/crash_report.zig index 88c5f704c1..aed6efa9f0 100644 --- a/src/crash_report.zig +++ b/src/crash_report.zig @@ -151,7 +151,7 @@ fn writeFullyQualifiedDeclWithFile(decl: *Decl, stream: anytype) !void { try decl.renderFullyQualifiedDebugName(stream); } -fn compilerPanic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace) noreturn { +pub fn compilerPanic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace) noreturn { PanicSwitch.preDispatch(); @setCold(true); const ret_addr = @returnAddress(); diff --git a/src/main.zig b/src/main.zig index feaea7f435..fbe388ed47 100644 --- a/src/main.zig +++ b/src/main.zig @@ -433,6 +433,7 @@ const usage_build_generic = \\ --verbose-cimport Enable compiler debug output for C imports \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features \\ --debug-log [scope] Enable printing debug/info log messages for scope + \\ --debug-compile-errors Crash with helpful diagnostics at the first compile error \\ ; @@ -549,6 +550,7 @@ fn buildOutputType( var single_threaded = false; var function_sections = false; var watch = false; + var debug_compile_errors = false; var verbose_link = std.process.hasEnvVarConstant("ZIG_VERBOSE_LINK"); var verbose_cc = std.process.hasEnvVarConstant("ZIG_VERBOSE_CC"); var verbose_air = false; @@ -1078,6 +1080,8 @@ fn buildOutputType( linker_allow_shlib_undefined = false; } else if (mem.eql(u8, arg, "-Bsymbolic")) { linker_bind_global_refs_locally = true; + } else if (mem.eql(u8, arg, "--debug-compile-errors")) { + debug_compile_errors = true; } else if (mem.eql(u8, arg, "--verbose-link")) { verbose_link = true; } else if (mem.eql(u8, arg, "--verbose-cc")) { @@ -2134,6 +2138,7 @@ fn buildOutputType( .disable_lld_caching = !have_enable_cache, .subsystem = subsystem, .wasi_exec_model = wasi_exec_model, + .debug_compile_errors = debug_compile_errors, }) catch |err| { fatal("unable to create compilation: {s}", .{@errorName(err)}); };