From c9dc50bbbc9f98dbd4a8b3b2de92576b1362f94f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 2 Feb 2026 11:32:10 -0800 Subject: [PATCH 1/3] wip: abort when throwing std::logic_error, else continue --- src/libmain/shared.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index cac9e38ad85..089c77ec9f4 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -408,3 +409,17 @@ PrintFreed::~PrintFreed() } } // namespace nix + +typedef void (*cxa_throw_type)(void *, void *, void (*) (void *)); + +void __cxa_throw(void * exc, void * tinfo_, void (*dest)(void *)) +{ + auto * tinfo = (std::type_info *) tinfo_; + std::cerr << nix::fmt("THROW %s\n", tinfo->name()); + + if (*tinfo == typeid(std::logic_error)) + abort(); + + auto orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw"); + orig_cxa_throw(exc, tinfo_, dest); +} From f1a800ea5b3dad30f8e480916731bd56348bee66 Mon Sep 17 00:00:00 2001 From: Cole Helbling Date: Mon, 2 Feb 2026 12:58:41 -0800 Subject: [PATCH 2/3] wip: drop print --- src/libmain/shared.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 089c77ec9f4..e84b6ce2c72 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -415,7 +415,6 @@ typedef void (*cxa_throw_type)(void *, void *, void (*) (void *)); void __cxa_throw(void * exc, void * tinfo_, void (*dest)(void *)) { auto * tinfo = (std::type_info *) tinfo_; - std::cerr << nix::fmt("THROW %s\n", tinfo->name()); if (*tinfo == typeid(std::logic_error)) abort(); From 4606522da424374ed404be207b9d8b7a63b38764 Mon Sep 17 00:00:00 2001 From: Cole Helbling Date: Tue, 3 Feb 2026 06:16:03 -0800 Subject: [PATCH 3/3] lookup throw only once Co-authored-by: Eelco Dolstra --- src/libmain/shared.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index e84b6ce2c72..afbddbfd030 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -419,6 +419,6 @@ void __cxa_throw(void * exc, void * tinfo_, void (*dest)(void *)) if (*tinfo == typeid(std::logic_error)) abort(); - auto orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw"); + static auto orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw"); orig_cxa_throw(exc, tinfo_, dest); }