From 1f513847b28b34ddf42719faac8cae4b562e70ff Mon Sep 17 00:00:00 2001 From: Jo Shields Date: Thu, 31 Jul 2014 10:26:34 +0100 Subject: Support for GNU/kFreeBSD. GNU/kFreeBSD is an experimental OS provided by the Debian project, consisting of a FreeBSD kernel and GNU userland/libc. For a small number of cases, this offers advantages over a more common GNU/Linux combination, such as fast in-kernel support for ZFS storage. This patch changes various ifdefs, either using __FreeBSD_kernel__ where a trait from the kernel is what matters, or __GLIBC__ where a trait from the C library matters. This patch set has been carried downstream, in one form or another, since 1.2.3.1-1. https://bugzilla.novell.com/show_bug.cgi?id=321634 --- libgc/configure.ac | 11 +++++++++++ libgc/dyn_load.c | 4 ++-- libgc/include/gc.h | 2 +- libgc/include/private/gcconfig.h | 30 ++++++++++++++++++++++-------- 4 files changed, 36 insertions(+), 11 deletions(-) (limited to 'libgc') diff --git a/libgc/configure.ac b/libgc/configure.ac index 7dc04985a90..ac992abfaf9 100644 --- a/libgc/configure.ac +++ b/libgc/configure.ac @@ -114,6 +114,17 @@ case "$THREADS" in AC_DEFINE(THREAD_LOCAL_ALLOC) THREADDLLIBS="-lpthread -lrt" ;; + *-*-kfreebsd*-gnu) + AC_DEFINE(GC_FREEBSD_THREADS) + INCLUDES="$INCLUDES -pthread" + THREADDLLIBS=-pthread + AC_DEFINE(_REENTRANT) + if test "${enable_parallel_mark}" = yes; then + AC_DEFINE(PARALLEL_MARK) + fi + AC_DEFINE(THREAD_LOCAL_ALLOC) + AC_DEFINE(USE_COMPILER_TLS) + ;; *-*-freebsd*) AC_DEFINE(GC_FREEBSD_THREADS) if test "x$PTHREAD_CFLAGS" != "x"; then diff --git a/libgc/dyn_load.c b/libgc/dyn_load.c index ca7ce54f194..5db3503aacb 100644 --- a/libgc/dyn_load.c +++ b/libgc/dyn_load.c @@ -26,7 +26,7 @@ * None of this is safe with dlclose and incremental collection. * But then not much of anything is safe in the presence of dlclose. */ -#if (defined(__linux__) || defined(__native_client__)) && !defined(_GNU_SOURCE) +#if (defined(__linux__) || defined(__GLIBC__) || defined(__native_client__)) && !defined(_GNU_SOURCE) /* Can't test LINUX, since this must be define before other includes */ # define _GNU_SOURCE #endif @@ -394,7 +394,7 @@ GC_bool GC_register_main_static_data() /* For glibc 2.2.4+. Unfortunately, it doesn't work for older */ /* versions. Thanks to Jakub Jelinek for most of the code. */ -# if (defined(LINUX) || defined(NACL)) /* Are others OK here, too? */ \ +# if (defined(LINUX) || defined (__GLIBC__) || defined(NACL)) /* Are others OK here, too? */ \ && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \ || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG))) diff --git a/libgc/include/gc.h b/libgc/include/gc.h index 4693a3d9a54..2265fdbd34a 100644 --- a/libgc/include/gc.h +++ b/libgc/include/gc.h @@ -497,7 +497,7 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); # define GC_RETURN_ADDR (GC_word)__return_address #endif -#ifdef __linux__ +#if defined(__linux__) || defined(__GLIBC__) # include # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ && !defined(__ia64__) diff --git a/libgc/include/private/gcconfig.h b/libgc/include/private/gcconfig.h index 418e046ae12..3cbab919b94 100644 --- a/libgc/include/private/gcconfig.h +++ b/libgc/include/private/gcconfig.h @@ -55,7 +55,7 @@ # endif /* And one for FreeBSD: */ -# if defined(__FreeBSD__) && !defined(FREEBSD) +# if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !defined(FREEBSD) # define FREEBSD # endif @@ -1371,8 +1371,15 @@ # ifndef GC_FREEBSD_THREADS # define MPROTECT_VDB # endif -# define SIG_SUSPEND SIGTSTP -# define SIG_THR_RESTART SIGCONT +# ifdef __GLIBC__ +# define SIG_SUSPEND (32+6) +# define SIG_THR_RESTART (32+5) + extern int _end[]; +# define DATAEND (_end) +# else +# define SIG_SUSPEND SIGTSTP +# define SIG_THR_RESTART SIGCONT +# endif # define FREEBSD_STACKBOTTOM # ifdef __ELF__ # define DYNAMIC_LOADING @@ -2132,8 +2139,15 @@ # ifndef GC_FREEBSD_THREADS # define MPROTECT_VDB # endif -# define SIG_SUSPEND SIGTSTP -# define SIG_THR_RESTART SIGCONT +# ifdef __GLIBC__ +# define SIG_SUSPEND (32+6) +# define SIG_THR_RESTART (32+5) + extern int _end[]; +# define DATAEND (_end) +# else +# define SIG_SUSPEND SIGUSR1 +# define SIG_THR_RESTART SIGUSR2 +# endif # define NEED_FIND_LIMIT # define FREEBSD_STACKBOTTOM # ifdef __ELF__ @@ -2230,7 +2244,7 @@ # define SUNOS5SIGS # endif -# if defined(FREEBSD) && (__FreeBSD__ >= 4) +# if defined(FREEBSD) && ((__FreeBSD__ >= 4) || (__FreeBSD_kernel__ >= 4)) # define SUNOS5SIGS # endif @@ -2293,7 +2307,7 @@ # define CACHE_LINE_SIZE 32 /* Wild guess */ # endif -# ifdef LINUX +# if defined(LINUX) || defined(__GLIBC__) # define REGISTER_LIBRARIES_EARLY /* We sometimes use dl_iterate_phdr, which may acquire an internal */ /* lock. This isn't safe after the world has stopped. So we must */ @@ -2374,7 +2388,7 @@ #if defined(SPARC) # define CAN_SAVE_CALL_ARGS #endif -#if (defined(I386) || defined(X86_64)) && defined(LINUX) +#if (defined(I386) || defined(X86_64)) && (defined(LINUX) || defined(__GLIBC__)) /* SAVE_CALL_CHAIN is supported if the code is compiled to save */ /* frame pointers by default, i.e. no -fomit-frame-pointer flag. */ # define CAN_SAVE_CALL_ARGS -- cgit v1.2.3