summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/private/gcconfig.h4
-rw-r--r--os_dep.c11
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[];
diff --git a/os_dep.c b/os_dep.c
index 06345341..2d33b150 100644
--- a/os_dep.c
+++ b/os_dep.c
@@ -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)