From a71291862c7095ce2560f12b8de80b042aad120a Mon Sep 17 00:00:00 2001 From: zerico <71151164+ZERICO2005@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:35:37 -0600 Subject: [PATCH] [libcxx] added cxa_guard functions --- src/libcxx/cxa.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/libcxx/cxa.cpp diff --git a/src/libcxx/cxa.cpp b/src/libcxx/cxa.cpp new file mode 100644 index 000000000..132c25619 --- /dev/null +++ b/src/libcxx/cxa.cpp @@ -0,0 +1,33 @@ +#include +#include "abort_message.h" + +// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor-runtime-api + +// __int64_t +typedef int64_t __guard; + +extern "C" { +[[gnu::cold]] int __cxa_guard_acquire(__guard *); +[[gnu::cold]] void __cxa_guard_release(__guard *); +[[noreturn, gnu::cold]] void __cxa_guard_abort(__guard *); +} + +int __cxa_guard_acquire(__guard *guard_object) { + unsigned char const *flag = (unsigned char const *)guard_object; + if (*flag == 0) { + // initialization not yet complete + return 1; + } + // otherwise + return 0; +} + +void __cxa_guard_release(__guard *guard_object) { + unsigned char *flag = (unsigned char *)guard_object; + // set to a non-zero value + *flag = 1; +} + +void __cxa_guard_abort([[maybe_unused]] __guard *guard_object) { + std::__abort_message("__cxa_guard_abort"); +}