diff options
author | Mario Topf <mario.topf@unity3d.com> | 2021-03-04 12:08:44 +0100 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-02-02 00:37:14 +0300 |
commit | 8ade04b4dc6e22547cab60180948f61b93b0006b (patch) | |
tree | 3dadc5537454d71a62575831b406baea2765be6a | |
parent | 694cf83a36706437eedf8ce51a00d7dafea67be2 (diff) | |
download | bdwgc-8ade04b4dc6e22547cab60180948f61b93b0006b.tar.gz |
Use __builtin_frame_address(0) to find main stack base on QNX
(cherry-pick of 544ba4d, ef9684c from Unity-Technologies/bdwgc)
The proposed alternate approach (QNX_STACKBOTTOM) to find stack bottom
(base) of the primordial thread is not very exact but it works for the
tests, at least, unlike other available heuristics (e.g., HEURISTIC1).
* include/private/gcconfig.h [QNX] (HEURISTIC1): Do not define if
QNX_STACKBOTTOM; add TODO item.
* os_dep.c [QNX_STACKBOTTOM] (GC_qnx_main_stack_base): New function
(calls __builtin_frame_address(0)); add TODO item.
* os_dep.c [!STACKBOTTOM && !HEURISTIC1 && QNX_STACKBOTTOM]
(GC_get_main_stack_base): Call GC_qnx_main_stack_base().
Co-authored-by: Mario Hoepfner <mario.hopfner@unity3d.com>
-rw-r--r-- | include/private/gcconfig.h | 4 | ||||
-rw-r--r-- | os_dep.c | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h index 832e3a9e..9636ea64 100644 --- a/include/private/gcconfig.h +++ b/include/private/gcconfig.h @@ -968,7 +968,9 @@ EXTERN_C_BEGIN # ifdef QNX # define OS_TYPE "QNX" # define SA_RESTART 0 -# define HEURISTIC1 +# ifndef QNX_STACKBOTTOM /* TODO: not the default one for now */ +# define HEURISTIC1 +# endif extern char etext[]; # define DATASTART ((ptr_t)etext) extern int _end[]; @@ -1154,6 +1154,15 @@ GC_INNER size_t GC_page_size = 0; } #endif /* LINUX_STACKBOTTOM */ +#ifdef QNX_STACKBOTTOM + STATIC ptr_t GC_qnx_main_stack_base(void) + { + /* TODO: this approach is not very exact but it works for the */ + /* tests, at least, unlike other available heuristics. */ + return (ptr_t)__builtin_frame_address(0); + } +#endif /* QNX_STACKBOTTOM */ + #ifdef FREEBSD_STACKBOTTOM /* This uses an undocumented sysctl call, but at least one expert */ /* believes it will stay. */ @@ -1283,6 +1292,8 @@ GC_INNER size_t GC_page_size = 0; result = GC_hpux_main_stack_base(); # elif defined(LINUX_STACKBOTTOM) result = GC_linux_main_stack_base(); +# elif defined(QNX_STACKBOTTOM) + result = GC_qnx_main_stack_base(); # elif defined(FREEBSD_STACKBOTTOM) result = GC_freebsd_main_stack_base(); # elif defined(HEURISTIC2) |