mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
LibC: Move __cxa_finalize and __cxa_atexit code to their own file
These guys aren't really related to initializing the C runtime, so move them to a new fancy file named C++ abi. Or rather, cxxabi :)
This commit is contained in:
parent
d57eed289a
commit
96a86463dd
Notes:
sideshowbarker
2024-07-19 10:29:28 +09:00
Author: https://github.com/ADKaster Commit: https://github.com/SerenityOS/serenity/commit/96a86463dd1 Pull-request: https://github.com/SerenityOS/serenity/pull/954 Reviewed-by: https://github.com/awesomekling
3 changed files with 62 additions and 55 deletions
|
@ -53,7 +53,8 @@ LIBC_OBJS = \
|
|||
libgen.o \
|
||||
wchar.o \
|
||||
serenity.o \
|
||||
syslog.o
|
||||
syslog.o \
|
||||
cxxabi.o
|
||||
|
||||
OBJS = $(AK_OBJS) $(LIBC_OBJS)
|
||||
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
//#define GLOBAL_DTORS_DEBUG
|
||||
|
||||
extern "C" {
|
||||
|
||||
int main(int, char**, char**);
|
||||
|
@ -51,58 +49,6 @@ int _start(int argc, char** argv, char** env)
|
|||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
typedef void (*AtExitFunction)(void *);
|
||||
|
||||
struct __exit_entry
|
||||
{
|
||||
AtExitFunction method;
|
||||
void* parameter;
|
||||
void* dso_handle;
|
||||
bool has_been_called;
|
||||
};
|
||||
|
||||
static __exit_entry __exit_entries[1024]{};
|
||||
static int __exit_entry_count = 0;
|
||||
|
||||
int __cxa_atexit(AtExitFunction exit_function, void *parameter, void *dso_handle)
|
||||
{
|
||||
if (__exit_entry_count >= 1024)
|
||||
return -1;
|
||||
|
||||
__exit_entries[__exit_entry_count++] = { exit_function, parameter, dso_handle, false};
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __cxa_finalize(void* dso_handle)
|
||||
{
|
||||
// From the itanium abi, https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor-runtime-api
|
||||
//
|
||||
// When __cxa_finalize(d) is called, it should walk the termination function list, calling each in turn
|
||||
// if d matches __dso_handle for the termination function entry. If d == NULL, it should call all of them.
|
||||
// Multiple calls to __cxa_finalize shall not result in calling termination function entries multiple times;
|
||||
// the implementation may either remove entries or mark them finished.
|
||||
|
||||
int entry_index = __exit_entry_count;
|
||||
|
||||
#ifdef GLOBAL_DTORS_DEBUG
|
||||
dbgprintf("__cxa_finalize: %d entries in the finalizer list\n", entry_index);
|
||||
#endif
|
||||
|
||||
while (--entry_index >= 0)
|
||||
{
|
||||
auto& exit_entry = __exit_entries[entry_index];
|
||||
bool needs_calling = !exit_entry.has_been_called && (!dso_handle || dso_handle == exit_entry.dso_handle);
|
||||
if (needs_calling) {
|
||||
#ifdef GLOBAL_DTORS_DEBUG
|
||||
dbgprintf("__cxa_finalize: calling entry[%d] %p(%p) dso: %p\n", entry_index, exit_entry.method, exit_entry.parameter, exit_entry.dso_handle);
|
||||
#endif
|
||||
exit_entry.method(exit_entry.parameter);
|
||||
exit_entry.has_been_called = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern u32 __stack_chk_guard;
|
||||
u32 __stack_chk_guard = (u32)0xc0000c13;
|
||||
|
||||
|
|
60
Libraries/LibC/cxxabi.cpp
Normal file
60
Libraries/LibC/cxxabi.cpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
#include <AK/Types.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
//#define GLOBAL_DTORS_DEBUG
|
||||
|
||||
extern "C" {
|
||||
|
||||
typedef void (*AtExitFunction)(void*);
|
||||
|
||||
struct __exit_entry {
|
||||
AtExitFunction method;
|
||||
void* parameter;
|
||||
void* dso_handle;
|
||||
bool has_been_called;
|
||||
};
|
||||
|
||||
static __exit_entry __exit_entries[1024] {};
|
||||
static int __exit_entry_count = 0;
|
||||
|
||||
int __cxa_atexit(AtExitFunction exit_function, void* parameter, void* dso_handle)
|
||||
{
|
||||
if (__exit_entry_count >= 1024)
|
||||
return -1;
|
||||
|
||||
__exit_entries[__exit_entry_count++] = { exit_function, parameter, dso_handle, false };
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __cxa_finalize(void* dso_handle)
|
||||
{
|
||||
// From the itanium abi, https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor-runtime-api
|
||||
//
|
||||
// When __cxa_finalize(d) is called, it should walk the termination function list, calling each in turn
|
||||
// if d matches __dso_handle for the termination function entry. If d == NULL, it should call all of them.
|
||||
// Multiple calls to __cxa_finalize shall not result in calling termination function entries multiple times;
|
||||
// the implementation may either remove entries or mark them finished.
|
||||
|
||||
int entry_index = __exit_entry_count;
|
||||
|
||||
#ifdef GLOBAL_DTORS_DEBUG
|
||||
dbgprintf("__cxa_finalize: %d entries in the finalizer list\n", entry_index);
|
||||
#endif
|
||||
|
||||
while (--entry_index >= 0) {
|
||||
auto& exit_entry = __exit_entries[entry_index];
|
||||
bool needs_calling = !exit_entry.has_been_called && (!dso_handle || dso_handle == exit_entry.dso_handle);
|
||||
if (needs_calling) {
|
||||
#ifdef GLOBAL_DTORS_DEBUG
|
||||
dbgprintf("__cxa_finalize: calling entry[%d] %p(%p) dso: %p\n", entry_index, exit_entry.method, exit_entry.parameter, exit_entry.dso_handle);
|
||||
#endif
|
||||
exit_entry.method(exit_entry.parameter);
|
||||
exit_entry.has_been_called = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // extern "C"
|
Loading…
Reference in a new issue