diff --git a/src-self-hosted/stage1.zig b/src-self-hosted/stage1.zig index 9acc45c99a..3d2606c5ec 100644 --- a/src-self-hosted/stage1.zig +++ b/src-self-hosted/stage1.zig @@ -455,3 +455,10 @@ export const stage2_DepNextResult = extern struct { prereq, }; }; + +// ABI warning +export fn stage2_attach_segfault_handler() void { + if (std.debug.runtime_safety and std.debug.have_segfault_handling_support) { + std.debug.attachSegfaultHandler(); + } +} diff --git a/src/main.cpp b/src/main.cpp index 57eeef59df..016967a889 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -262,6 +262,8 @@ static bool get_cache_opt(CacheOpt opt, bool default_value) { extern "C" int ZigClang_main(int argc, char **argv); int main(int argc, char **argv) { + stage2_attach_segfault_handler(); + char *arg0 = argv[0]; Error err; diff --git a/src/userland.cpp b/src/userland.cpp index d0330669dd..d82f776cd6 100644 --- a/src/userland.cpp +++ b/src/userland.cpp @@ -26,6 +26,8 @@ void stage2_zen(const char **ptr, size_t *len) { stage2_panic(msg, strlen(msg)); } +void stage2_attach_segfault_handler(void) { } + void stage2_panic(const char *ptr, size_t len) { fwrite(ptr, 1, len, stderr); fprintf(stderr, "\n"); diff --git a/src/userland.h b/src/userland.h index eac28053e6..43bdbd18b1 100644 --- a/src/userland.h +++ b/src/userland.h @@ -113,6 +113,9 @@ ZIG_EXTERN_C void stage2_render_ast(struct Stage2Ast *ast, FILE *output_file); // ABI warning ZIG_EXTERN_C void stage2_zen(const char **ptr, size_t *len); +// ABI warning +ZIG_EXTERN_C void stage2_attach_segfault_handler(void); + // ABI warning ZIG_EXTERN_C ZIG_ATTRIBUTE_NORETURN void stage2_panic(const char *ptr, size_t len);