From: Calvin Buckley Date: Tue, 23 Jan 2018 14:54:59 +0000 (+0300) Subject: Initial support of Haiku/amd64 X-Git-Tag: v8.0.0~400 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=847927f0e71ef1a8e3dcf2ee0879bf416311daae;p=platform%2Fupstream%2Flibgc.git 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. --- diff --git a/configure.ac b/configure.ac index 1ecc31d..fb485d6 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 e15c2cc..e136820 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 + + 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 d1dc5e6..ac13047 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 c1d4c0e..2bce234 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 # 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 +# 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 aff0899..3a54fa6 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 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 + 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 # include -# include +# if !defined(HAIKU) +# include +# 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 9813553..22d4a8d 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);