From 4920ad41f0fa7049ac003018ae677dbb0d1d437c Mon Sep 17 00:00:00 2001 From: Gautham Venkatasubramanian Date: Sat, 11 Nov 2023 21:46:17 -0600 Subject: [PATCH] Initial support of Cosmo target (Cosmopolitan Libc) Issue #666 (bdwgc). * include/private/gcconfig.h [__COSMOPOLITAN__] (COSMO): New macro. * include/private/gcconfig.h [__aarch64__ && !ANY_BSD && !DARWIN && !LINUX && !KOS && !QNX] (NOSYS): Do not define if COSMO. * include/private/gcconfig.h [__aarch64__ && COSMO] (AARCH64, mach_type_known): Define macro. * include/private/gcconfig.h [(__x86_64 || __x86_64__ || __amd64__ || __X86_64__) && COSMO] (X86_64, mach_type_known): Likewise. * include/private/gcconfig.h [COSMO] (OS_TYPE, LINUX_STACKBOTTOM, DATASTART, DATAEND, USE_MMAP_ANON): Likewise. * include/private/gcconfig.h [COSMO] (UNIX_LIKE): Likewise. * include/private/gcconfig.h [COSMO] (__data_start, _end): Declare global variable. * tests/gctest.c [!BIG && COSMO && THREADS] (BIG): Define to 500. Co-authored-by: Ivan Maidanski --- include/private/gcconfig.h | 42 ++++++++++++++++++++++++++++---------- tests/gctest.c | 3 ++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h index 489c0d0ae..12a175cb4 100644 --- a/include/private/gcconfig.h +++ b/include/private/gcconfig.h @@ -124,6 +124,10 @@ EXTERN_C_BEGIN # define ANY_BSD #endif +#if defined(__COSMOPOLITAN__) +# define COSMO +#endif + #if defined(__EMBOX__) # define EMBOX #endif @@ -154,8 +158,8 @@ EXTERN_C_BEGIN /* Here we will rely upon arch-specific defines. */ # endif #endif -#if defined(__aarch64__) && !defined(ANY_BSD) && !defined(DARWIN) \ - && !defined(LINUX) && !defined(KOS) && !defined(QNX) \ +#if defined(__aarch64__) && !defined(ANY_BSD) && !defined(COSMO) \ + && !defined(DARWIN) && !defined(LINUX) && !defined(KOS) && !defined(QNX) \ && !defined(NN_BUILD_TARGET_PLATFORM_NX) && !defined(_WIN32) # define AARCH64 # define NOSYS @@ -480,9 +484,9 @@ EXTERN_C_BEGIN # define mach_type_known #endif -#if defined(__aarch64__) \ - && (defined(ANY_BSD) || defined(DARWIN) || defined(LINUX) || defined(KOS) \ - || defined(QNX)) +#if defined(__aarch64__) \ + && (defined(ANY_BSD) || defined(COSMO) || defined(DARWIN) \ + || defined(LINUX) || defined(KOS) || defined(QNX)) # define AARCH64 # define mach_type_known #elif defined(__arc__) && defined(LINUX) @@ -562,8 +566,8 @@ EXTERN_C_BEGIN # define mach_type_known #elif (defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) \ || defined(__X86_64__)) \ - && (defined(ANY_BSD) || defined(DARWIN) || defined(LINUX) \ - || defined(QNX)) + && (defined(ANY_BSD) || defined(COSMO) || defined(DARWIN) \ + || defined(LINUX) || defined(QNX)) # define X86_64 # define mach_type_known #endif @@ -800,6 +804,16 @@ EXTERN_C_BEGIN # endif #endif /* CYGWIN32 */ +#ifdef COSMO +# define OS_TYPE "COSMO" +# define LINUX_STACKBOTTOM +extern int __data_start[] __attribute__((__weak__)); +# define DATASTART ((ptr_t)__data_start) +extern int _end[]; +# define DATAEND ((ptr_t)_end) +# define USE_MMAP_ANON +#endif /* COSMO */ + #ifdef DARWIN # define OS_TYPE "DARWIN" # define DYNAMIC_LOADING @@ -1982,6 +1996,9 @@ extern int __data_start[] __attribute__((__weak__)); # define DATASTART ((ptr_t)__data_start) # endif # endif +# ifdef COSMO +/* Empty. */ +# endif # ifdef DARWIN /* OS X, iOS, visionOS */ # define DARWIN_DONT_PARSE_STACK 1 @@ -2216,6 +2233,9 @@ EXTERN_C_BEGIN # define SOFT_VDB # endif # endif +# ifdef COSMO +/* Empty. */ +# endif # ifdef DARWIN # define DARWIN_DONT_PARSE_STACK 1 # define STACKBOTTOM ((ptr_t)0x7fff5fc00000) @@ -2604,10 +2624,10 @@ EXTERN_C_END EXTERN_C_BEGIN #endif /* GC_OPENBSD_THREADS */ -#if defined(AIX) || defined(ANY_BSD) || defined(BSD) || defined(DARWIN) \ - || defined(DGUX) || defined(HAIKU) || defined(HPUX) || defined(HURD) \ - || defined(IRIX5) || defined(LINUX) || defined(OSF1) || defined(QNX) \ - || defined(SVR4) +#if defined(AIX) || defined(ANY_BSD) || defined(BSD) || defined(COSMO) \ + || defined(DARWIN) || defined(DGUX) || defined(HAIKU) || defined(HPUX) \ + || defined(HURD) || defined(IRIX5) || defined(LINUX) || defined(OSF1) \ + || defined(QNX) || defined(SVR4) # define UNIX_LIKE /* Basic Unix-like system calls work. */ #endif diff --git a/tests/gctest.c b/tests/gctest.c index f15cd09df..4adaf6d32 100644 --- a/tests/gctest.c +++ b/tests/gctest.c @@ -882,7 +882,8 @@ reverse_test_inner(void *data) # else # define BIG 1000 # endif -# elif defined(MSWINCE) || defined(EMBOX) || defined(RTEMS) +# elif defined(MSWINCE) || defined(EMBOX) || defined(RTEMS) \ + || (defined(COSMO) && defined(THREADS)) /* WinCE only allows 64 KB stacks. */ # define BIG 500 # elif defined(EMSCRIPTEN) || defined(OSF1)