diff options
author | Calvin Buckley <calvin@openmailbox.org> | 2018-01-23 17:54:59 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2018-01-24 17:05:22 +0300 |
commit | 847927f0e71ef1a8e3dcf2ee0879bf416311daae (patch) | |
tree | 4109df0beef3cc829dda00faa1e95b603f2b0e66 | |
parent | e9f26e6de5a1a4b4ded6d55f1a09838da5056c07 (diff) | |
download | bdwgc-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.ac | 6 | ||||
-rw-r--r-- | dyn_load.c | 18 | ||||
-rw-r--r-- | include/gc_config_macros.h | 2 | ||||
-rw-r--r-- | include/private/gcconfig.h | 29 | ||||
-rw-r--r-- | os_dep.c | 36 | ||||
-rw-r--r-- | pthread_support.c | 4 |
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.]) @@ -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) @@ -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); |