summaryrefslogtreecommitdiff
path: root/dyn_load.c
diff options
context:
space:
mode:
authorCalvin Buckley <calvin@openmailbox.org>2018-01-23 17:54:59 +0300
committerIvan Maidanski <ivmai@mail.ru>2018-01-24 17:05:22 +0300
commit847927f0e71ef1a8e3dcf2ee0879bf416311daae (patch)
tree4109df0beef3cc829dda00faa1e95b603f2b0e66 /dyn_load.c
parente9f26e6de5a1a4b4ded6d55f1a09838da5056c07 (diff)
downloadbdwgc-847927f0e71ef1a8e3dcf2ee0879bf416311daae.tar.gz
Initial support of Haiku/amd64
(port of commit e52f300 from 'mono_libgc') * configure.ac [THREADS=posix && host=*-*-haiku*] (GC_THREADS, _REENTRANT, PARALLEL_MARK, THREAD_LOCAL_ALLOC): Define macro. * include/gc_config_macros.h [GC_THREADS && __HAIKU__] (GC_HAIKU_THREADS): Likewise. * include/private/gcconfig.h [__HAIKU__ && _X86_] (I386, HAIKU, mach_type_known): Likewise. * include/private/gcconfig.h [__HAIKU__ && __amd64__] (X86_64, HAIKU, mach_type_known): Likewise. * include/private/gcconfig.h [I386 && HAIKU] (DYNAMIC_LOADING, MPROTECT_VDB): Likewise. * include/private/gcconfig.h [X86_64 && HAIKU] (OS_TYPE, GETPAGESIZE, DATASTART, DYNAMIC_LOADING, MPROTECT_VDB): Likewise. * include/private/gcconfig.h [HAIKU] (UNIX_LIKE, GET_MEM): Likewise. * os_dep.c [MPROTECT_VDB && !DARWIN && !MSWIN32 && !MSWINCE && HAIKU] (CODE_OK): Likewise. * dyn_load.c [HAIKU] (GC_register_dynamic_libraries): Implement. * os_dep.c [HAIKU] (GC_haiku_get_mem): Likewise. * include/private/gcconfig.h (BEOS): Rename to HAIKU. * os_dep.c (BEOS): Likewise. * include/private/gcconfig.h [I386 && HAIKU] (OS_TYPE): Change value to "HAIKU". * include/private/gcconfig.h [X86_64 && HAIKU]: Include OS.h; declare etext symbol. * include/private/gcconfig.h [HAIKU] (GC_haiku_get_mem): Declare prototype. * os_dep.c [(NEED_FIND_LIMIT || UNIX_LIKE) && HAIKU] (old_segv_act): Define static variable. * os_dep.c [(NEED_FIND_LIMIT || UNIX_LIKE) && HAIKU] (GC_set_and_save_fault_handler): Use old_segv_act; call sigaction(SIGSEGV). * os_dep.c [NEED_FIND_LIMIT || (USE_PROC_FOR_LIBRARIES && THREADS)] (GC_reset_fault_handler): Likewise. * os_dep.c [MPROTECT_VDB && !DARWIN && !USE_WINALLOC && HAIKU]: Do not include sys/syscall.h. * pthread_support.c [GC_HAIKU_THREADS] (GC_get_nprocs): Define function.
Diffstat (limited to 'dyn_load.c')
-rw-r--r--dyn_load.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/dyn_load.c b/dyn_load.c
index e15c2cc0..e1368207 100644
--- a/dyn_load.c
+++ b/dyn_load.c
@@ -58,7 +58,8 @@ STATIC GC_has_static_roots_func GC_has_static_roots = 0;
&& !(defined(ALPHA) && defined(OSF1)) \
&& !(defined(FREEBSD) && defined(__ELF__)) \
&& !((defined(LINUX) || defined(NACL)) && defined(__ELF__)) \
- && !(defined(NETBSD) && defined(__ELF__)) && !defined(HURD) \
+ && !(defined(NETBSD) && defined(__ELF__)) \
+ && !defined(HAIKU) && !defined(HURD) \
&& !(defined(OPENBSD) && (defined(__ELF__) || defined(M68K))) \
&& !defined(CPPCHECK)
# error We only know how to find data segments of dynamic libraries for above.
@@ -1484,6 +1485,21 @@ GC_INNER GC_bool GC_register_main_static_data(void)
#endif /* DARWIN */
+#if defined(HAIKU)
+# include <kernel/image.h>
+
+ GC_INNER void GC_register_dynamic_libraries(void)
+ {
+ image_info info;
+ int32 cookie = 0;
+
+ while (get_next_image_info(0, &cookie, &info) == B_OK) {
+ ptr_t data = (ptr_t)info.data;
+ GC_add_roots_inner(data, data + info.data_size, TRUE);
+ }
+ }
+#endif /* HAIKU */
+
#elif defined(PCR)
# include "il/PCR_IL.h"