summaryrefslogtreecommitdiff
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
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.
-rw-r--r--configure.ac6
-rw-r--r--dyn_load.c18
-rw-r--r--include/gc_config_macros.h2
-rw-r--r--include/private/gcconfig.h29
-rw-r--r--os_dep.c36
-rw-r--r--pthread_support.c4
6 files changed, 75 insertions, 20 deletions
diff --git a/configure.ac b/configure.ac
index 1ecc31df..fb485d6b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -185,9 +185,9 @@ case "$THREADS" in
# Common defines for most POSIX platforms.
case "$host" in
*-*-aix* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
- *-*-freebsd* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
- *-*-gnu* | *-*-*linux* | *-*-nacl* | *-*-netbsd* | *-*-openbsd* | \
- *-*-osf* | *-*-solaris*)
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
AC_DEFINE(GC_THREADS)
AC_DEFINE([_REENTRANT], [1],
[Required define if using POSIX threads.])
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"
diff --git a/include/gc_config_macros.h b/include/gc_config_macros.h
index d1dc5e62..ac130477 100644
--- a/include/gc_config_macros.h
+++ b/include/gc_config_macros.h
@@ -86,6 +86,8 @@
# elif defined(_PA_RISC1_1) || defined(_PA_RISC2_0) || defined(hppa) \
|| defined(__HPPA) || (defined(__ia64) && defined(_HPUX_SOURCE))
# define GC_HPUX_THREADS
+# elif defined(__HAIKU__)
+# define GC_HAIKU_THREADS
# elif defined(__OpenBSD__)
# define GC_OPENBSD_THREADS
# elif defined(__FreeBSD__) || defined(__DragonFly__)
diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h
index c1d4c0ee..2bce2343 100644
--- a/include/private/gcconfig.h
+++ b/include/private/gcconfig.h
@@ -305,9 +305,14 @@
# endif
# define mach_type_known
# endif
-# if defined(__BEOS__) && defined(_X86_)
+# if (defined(__BEOS__) || defined(__HAIKU__)) && defined(_X86_)
# define I386
-# define BEOS
+# define HAIKU
+# define mach_type_known
+# endif
+# if defined(__HAIKU__) && defined(__amd64__)
+# define X86_64
+# define HAIKU
# define mach_type_known
# endif
# if defined(OPENBSD) && defined(__amd64__)
@@ -1270,12 +1275,14 @@
# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~0xfff))
# define STACKBOTTOM ((ptr_t)0x3ffff000)
# endif
-# ifdef BEOS
-# define OS_TYPE "BEOS"
+# ifdef HAIKU
+# define OS_TYPE "HAIKU"
# include <OS.h>
# define GETPAGESIZE() (unsigned)B_PAGE_SIZE
extern int etext[];
# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~0xfff))
+# define DYNAMIC_LOADING
+# define MPROTECT_VDB
# endif
# ifdef SOLARIS
# define OS_TYPE "SOLARIS"
@@ -2486,6 +2493,15 @@
# define SEARCH_FOR_DATA_START
# endif
# endif
+# ifdef HAIKU
+# define OS_TYPE "HAIKU"
+# include <OS.h>
+# define GETPAGESIZE() (unsigned)B_PAGE_SIZE
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word)etext) + 0xfff) & ~0xfff))
+# define DYNAMIC_LOADING
+# define MPROTECT_VDB
+# endif
# ifdef SOLARIS
# define OS_TYPE "SOLARIS"
# define ELF_CLASS ELFCLASS64
@@ -2757,7 +2773,7 @@
#if defined(SVR4) || defined(LINUX) || defined(IRIX5) || defined(HPUX) \
|| defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \
- || defined(DGUX) || defined(BSD) || defined(HURD) \
+ || defined(DGUX) || defined(BSD) || defined(HAIKU) || defined(HURD) \
|| defined(AIX) || defined(DARWIN) || defined(OSF1)
# define UNIX_LIKE /* Basic Unix-like system calls work. */
#endif
@@ -3304,6 +3320,9 @@
# elif defined(SN_TARGET_PS3)
void *ps3_get_mem(size_t bytes);
# define GET_MEM(bytes) (struct hblk*)ps3_get_mem(bytes)
+# elif defined(HAIKU)
+ ptr_t GC_haiku_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)GC_haiku_get_mem(bytes)
# else
ptr_t GC_unix_get_mem(size_t bytes);
# define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
diff --git a/os_dep.c b/os_dep.c
index aff08992..3a54fa6f 100644
--- a/os_dep.c
+++ b/os_dep.c
@@ -829,7 +829,7 @@ GC_INNER size_t GC_page_size = 0;
}
#endif /* !MSWIN32 */
-#ifdef BEOS
+#ifdef HAIKU
# include <kernel/OS.h>
GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
@@ -840,7 +840,7 @@ GC_INNER size_t GC_page_size = 0;
return GC_SUCCESS;
}
# define HAVE_GET_STACK_BASE
-#endif /* BEOS */
+#endif /* HAIKU */
#ifdef OS2
GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
@@ -869,7 +869,8 @@ GC_INNER size_t GC_page_size = 0;
typedef void (*GC_fault_handler_t)(int);
# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
- || defined(HURD) || defined(FREEBSD) || defined(NETBSD)
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD)
static struct sigaction old_segv_act;
# if defined(_sigargs) /* !Irix6.x */ \
|| defined(HURD) || defined(NETBSD) || defined(FREEBSD)
@@ -885,7 +886,8 @@ GC_INNER size_t GC_page_size = 0;
GC_INNER void GC_set_and_save_fault_handler(GC_fault_handler_t h)
{
# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
- || defined(HURD) || defined(FREEBSD) || defined(NETBSD)
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD)
struct sigaction act;
act.sa_handler = h;
@@ -949,7 +951,8 @@ GC_INNER size_t GC_page_size = 0;
GC_INNER void GC_reset_fault_handler(void)
{
# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
- || defined(HURD) || defined(FREEBSD) || defined(NETBSD)
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD)
(void) sigaction(SIGSEGV, &old_segv_act, 0);
# if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
|| defined(HURD) || defined(NETBSD)
@@ -1190,7 +1193,7 @@ GC_INNER size_t GC_page_size = 0;
return (ptr_t)GC_get_main_symbian_stack_base();
}
# define GET_MAIN_STACKBASE_SPECIAL
-#elif !defined(BEOS) && !defined(AMIGA) && !defined(OS2) \
+#elif !defined(AMIGA) && !defined(HAIKU) && !defined(OS2) \
&& !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) \
&& !defined(GC_OPENBSD_THREADS) \
&& (!defined(GC_SOLARIS_THREADS) || defined(_STRICT_STDC))
@@ -1291,7 +1294,7 @@ GC_INNER size_t GC_page_size = 0;
return(result);
}
# define GET_MAIN_STACKBASE_SPECIAL
-#endif /* !AMIGA, !BEOS, !OPENBSD, !OS2, !Windows */
+#endif /* !AMIGA, !HAIKU, !OPENBSD, !OS2, !Windows */
#if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \
&& defined(THREADS) && !defined(HAVE_GET_STACK_BASE)
@@ -2425,6 +2428,19 @@ void * os2_alloc(size_t bytes)
# undef GC_AMIGA_AM
#endif
+#if defined(HAIKU)
+# include <stdlib.h>
+ ptr_t GC_haiku_get_mem(size_t bytes)
+ {
+ void* mem;
+
+ GC_ASSERT(GC_page_size != 0);
+ if (posix_memalign(&mem, GC_page_size, bytes) == 0)
+ return mem;
+ return NULL;
+ }
+#endif /* HAIKU */
+
#ifdef USE_MUNMAP
/* For now, this only works on Win32/WinCE and some Unix-like */
@@ -3032,7 +3048,9 @@ GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void)
# elif !defined(USE_WINALLOC)
# include <sys/mman.h>
# include <signal.h>
-# include <sys/syscall.h>
+# if !defined(HAIKU)
+# include <sys/syscall.h>
+# endif
# define PROTECT(addr, len) \
if (mprotect((caddr_t)(addr), (size_t)(len), \
@@ -3212,7 +3230,7 @@ GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void)
# define CODE_OK (si -> si_code == 2 /* experimentally determined */)
# elif defined(IRIX5)
# define CODE_OK (si -> si_code == EACCES)
-# elif defined(HURD)
+# elif defined(HAIKU) || defined(HURD)
# define CODE_OK TRUE
# elif defined(LINUX)
# define CODE_OK TRUE
diff --git a/pthread_support.c b/pthread_support.c
index 98135537..22d4a8d6 100644
--- a/pthread_support.c
+++ b/pthread_support.c
@@ -892,8 +892,8 @@ STATIC void GC_remove_all_threads_but_me(void)
# define GC_get_nprocs() pthread_num_processors_np()
#elif defined(GC_OSF1_THREADS) || defined(GC_AIX_THREADS) \
- || defined(GC_SOLARIS_THREADS) || defined(HURD) \
- || defined(HOST_ANDROID) || defined(NACL)
+ || defined(GC_HAIKU_THREADS) || defined(GC_SOLARIS_THREADS) \
+ || defined(HURD) || defined(HOST_ANDROID) || defined(NACL)
GC_INLINE int GC_get_nprocs(void)
{
int nprocs = (int)sysconf(_SC_NPROCESSORS_ONLN);