From 209373b1f5770dc175e06996a152df6484f59af2 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 22 Aug 2025 15:39:40 +0200 Subject: feat: implement `CompilerKitDylibTraits` container for future and current frontend tools. Signed-off-by: Amlal El Mahrouss --- dev/CompilerKit/utils/DylibHelpers.h | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'dev/CompilerKit/utils') diff --git a/dev/CompilerKit/utils/DylibHelpers.h b/dev/CompilerKit/utils/DylibHelpers.h index 1ae7c03..31e0b68 100644 --- a/dev/CompilerKit/utils/DylibHelpers.h +++ b/dev/CompilerKit/utils/DylibHelpers.h @@ -7,7 +7,57 @@ #pragma once #include +#include #include +struct CompilerKitDylibTraits; + typedef Int32 (*CompilerKitEntrypoint)(Int32 argc, Char const* argv[]); typedef VoidPtr CompilerKitDylib; + +struct CompilerKitDylibTraits final { + CompilerKitDylib fDylib{nullptr}; + CompilerKitEntrypoint fEntrypoint{nullptr}; + std::mutex fMutex; + + CompilerKitDylibTraits& operator()(const Char* path, const Char* fEntrypoint) { + std::lock_guard lock(this->fMutex); + + if (!path || !fEntrypoint) return *this; + + if (this->fDylib) { + dlclose(this->fDylib); + this->fDylib = nullptr; + } + + this->fDylib = dlopen(path, RTLD_LAZY); + + if (!this->fDylib) { + return *this; + } + + this->fEntrypoint = (CompilerKitEntrypoint)dlsym(this->fDylib, fEntrypoint); + + if (!this->fEntrypoint) { + dlclose(this->fDylib); + this->fDylib = nullptr; + + return *this; + } + + return *this; + } + + NECTI_COPY_DELETE(CompilerKitDylibTraits); + + CompilerKitDylibTraits() = default; + + ~CompilerKitDylibTraits() { + if (this->fDylib) { + dlclose(this->fDylib); + this->fDylib = nullptr; + } + + this->fEntrypoint = nullptr; + } +}; -- cgit v1.2.3 From bdc13bdc0a163d6839ed19a6077e61c162220826 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 22 Aug 2025 15:46:57 +0200 Subject: feat: c++abi: introduce atexit ptr to cleanup data when exiting program. Signed-off-by: Amlal El Mahrouss --- dev/CompilerKit/utils/DylibHelpers.h | 10 +++++----- dev/LibC++/base_process.h | 12 +++++++++++- tools/pef-amd64-cxxdrv.cc | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) (limited to 'dev/CompilerKit/utils') diff --git a/dev/CompilerKit/utils/DylibHelpers.h b/dev/CompilerKit/utils/DylibHelpers.h index 31e0b68..fede406 100644 --- a/dev/CompilerKit/utils/DylibHelpers.h +++ b/dev/CompilerKit/utils/DylibHelpers.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include struct CompilerKitDylibTraits; @@ -16,13 +16,13 @@ typedef Int32 (*CompilerKitEntrypoint)(Int32 argc, Char const* argv[]); typedef VoidPtr CompilerKitDylib; struct CompilerKitDylibTraits final { - CompilerKitDylib fDylib{nullptr}; + CompilerKitDylib fDylib{nullptr}; CompilerKitEntrypoint fEntrypoint{nullptr}; - std::mutex fMutex; + std::mutex fMutex; CompilerKitDylibTraits& operator()(const Char* path, const Char* fEntrypoint) { std::lock_guard lock(this->fMutex); - + if (!path || !fEntrypoint) return *this; if (this->fDylib) { @@ -36,7 +36,7 @@ struct CompilerKitDylibTraits final { return *this; } - this->fEntrypoint = (CompilerKitEntrypoint)dlsym(this->fDylib, fEntrypoint); + this->fEntrypoint = (CompilerKitEntrypoint) dlsym(this->fDylib, fEntrypoint); if (!this->fEntrypoint) { dlclose(this->fDylib); diff --git a/dev/LibC++/base_process.h b/dev/LibC++/base_process.h index 126ac60..900198f 100644 --- a/dev/LibC++/base_process.h +++ b/dev/LibC++/base_process.h @@ -12,7 +12,10 @@ /// @param code the exit code. /// @return the return > 0 for non successful. extern "C" int exit_(int code); -extern "C" int signal_(int code); + +/// @brief CRT signal handler. +/// @param code the signal code. +extern "C" void signal_(int code); /// @brief Standard C++ namespace namespace std::base_process { @@ -21,7 +24,14 @@ inline int signal(int code) { return -1; } +extern "C" void (*__atexit_lst_ptr)(void); +extern "C" size_t __atexit_lst_cnt; + inline int exit(int code) { + for (auto i = 0UL; i < __atexit_lst_cnt; ++i) { + __atexit_lst_ptr(); + } + exit_(code); return -1; } diff --git a/tools/pef-amd64-cxxdrv.cc b/tools/pef-amd64-cxxdrv.cc index 515f6ad..ae1653e 100644 --- a/tools/pef-amd64-cxxdrv.cc +++ b/tools/pef-amd64-cxxdrv.cc @@ -25,7 +25,7 @@ Int32 main(Int32 argc, Char const* argv[]) { CompilerKitDylibTraits dylib; dylib(kPath, kSymbol); - CompilerKitEntrypoint entrypoint_cxx = (CompilerKitEntrypoint)dylib.fEntrypoint; + CompilerKitEntrypoint entrypoint_cxx = (CompilerKitEntrypoint) dylib.fEntrypoint; if (!entrypoint_cxx) { kStdOut; -- cgit v1.2.3