#undef GC_PTHREADS
#if (!defined(GC_WIN32_THREADS) || defined(GC_WIN32_PTHREADS) \
- || defined(__CYGWIN32__) || defined(__CYGWIN__)) && defined(GC_THREADS)
+ || defined(__CYGWIN32__) || defined(__CYGWIN__)) && defined(GC_THREADS) \
+ && !defined(NN_PLATFORM_CTR) && !defined(NN_BUILD_TARGET_PLATFORM_NX)
/* Posix threads. */
# define GC_PTHREADS
#endif
# define CLOCK_TYPE DWORD
# define GET_TIME(x) (void)(x = GetTickCount())
# define MS_TIME_DIFF(a,b) ((long)((a)-(b)))
-#else /* !MSWIN32, !MSWINCE, !BSD_TIME */
+#elif defined(NN_PLATFORM_CTR)
+# define CLOCK_TYPE long long
+ CLOCK_TYPE n3ds_get_system_tick(void);
+ CLOCK_TYPE n3ds_convert_tick_to_ms(CLOCK_TYPE tick);
+# define GET_TIME(x) (void)(x = n3ds_get_system_tick())
+# define MS_TIME_DIFF(a,b) ((long)n3ds_convert_tick_to_ms((a)-(b)))
+#else /* !BSD_TIME && !NN_PLATFORM_CTR && !MSWIN32 && !MSWINCE */
# include <time.h>
# if defined(FREEBSD) && !defined(CLOCKS_PER_SEC)
# include <machine/limits.h>
PCR_allSigsBlocked, \
PCR_waitForever)
# else
-# if defined(GC_WIN32_THREADS) || defined(GC_PTHREADS)
+# if defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
+ || defined(GC_WIN32_THREADS) || defined(GC_PTHREADS)
GC_INNER void GC_stop_world(void);
GC_INNER void GC_start_world(void);
# define STOP_WORLD() GC_stop_world()
# endif
# if defined(__aarch64__)
# define AARCH64
-# if !defined(LINUX) && !defined(DARWIN) && !defined(FREEBSD)
+# if !defined(LINUX) && !defined(DARWIN) && !defined(FREEBSD) \
+ && !defined(NN_BUILD_TARGET_PLATFORM_NX)
# define NOSYS
# define mach_type_known
# endif
# if defined(NACL)
# define mach_type_known
# elif !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) \
- && !defined(OPENBSD) && !defined(DARWIN) \
- && !defined(_WIN32) && !defined(__CEGCC__) && !defined(SYMBIAN)
+ && !defined(OPENBSD) && !defined(DARWIN) && !defined(_WIN32) \
+ && !defined(__CEGCC__) && !defined(NN_PLATFORM_CTR) \
+ && !defined(NN_BUILD_TARGET_PLATFORM_NX) && !defined(SYMBIAN)
# define NOSYS
# define mach_type_known
# endif
# define mach_type_known
# endif
+# if defined(NN_PLATFORM_CTR)
+# define ARM32
+# define mach_type_known
+# endif
+
+# if defined(NN_BUILD_TARGET_PLATFORM_NX)
+# define NINTENDO_SWITCH
+# define mach_type_known
+# endif
+
# if defined(SYMBIAN)
# define mach_type_known
# endif
# define DATAEND ((ptr_t)(&_end))
# define DYNAMIC_LOADING
# endif
+# ifdef NN_PLATFORM_CTR
+ extern unsigned char Image$$ZI$$ZI$$Base[];
+# define DATASTART (ptr_t)(Image$$ZI$$ZI$$Base)
+ extern unsigned char Image$$ZI$$ZI$$Limit[];
+# define DATAEND (ptr_t)(Image$$ZI$$ZI$$Limit)
+ void *n3ds_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)n3ds_get_stack_bottom())
+# endif
+# ifdef NINTENDO_SWITCH
+ extern int __bss_end[];
+# define NO_HANDLE_FORK
+# define DATASTART (ptr_t)ALIGNMENT /* cannot be null */
+# define DATAEND (ptr_t)(&__bss_end)
+ void *switch_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)switch_get_stack_bottom())
+# endif
# ifdef NOSYS
/* __data_start is usually defined in the target linker script. */
extern int __data_start[];
#endif /* !CPPCHECK */
#if defined(PCR) || defined(GC_WIN32_THREADS) || defined(GC_PTHREADS) \
+ || defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
|| defined(SN_TARGET_PS3)
# define THREADS
#endif
# elif defined(SN_TARGET_PS3)
void *ps3_get_mem(size_t bytes);
# define GET_MEM(bytes) (struct hblk*)ps3_get_mem(bytes)
+# elif defined(NINTENDO_SWITCH)
+ void *switch_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)switch_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)
#define GC_DEFAULT_STDERR_FD 2
#if !defined(OS2) && !defined(MACOS) && !defined(GC_ANDROID_LOG) \
+ && !defined(NN_PLATFORM_CTR) && !defined(NINTENDO_SWITCH) \
&& !defined(MSWIN32) && !defined(MSWINCE)
STATIC int GC_stdout = GC_DEFAULT_STDOUT_FD;
STATIC int GC_stderr = GC_DEFAULT_STDERR_FD;
GC_init_netbsd_elf();
# endif
# if !defined(THREADS) || defined(GC_PTHREADS) \
+ || defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
|| defined(GC_WIN32_THREADS) || defined(GC_SOLARIS_THREADS)
if (GC_stackbottom == 0) {
GC_stackbottom = GC_get_main_stack_base();
# define WRITE(level, buf, unused_len) \
__android_log_write(level, GC_ANDROID_LOG_TAG, buf)
+# elif defined(NN_PLATFORM_CTR)
+ int n3ds_log_write(const char* text, int length);
+# define WRITE(level, buf, len) n3ds_log_write(buf, len)
+# elif defined(NINTENDO_SWITCH)
+ int switch_log_write(const char* text, int length);
+# define WRITE(level, buf, len) switch_log_write(buf, len)
+
#else
# if !defined(AMIGA) && !defined(__CC_ARM)
# include <unistd.h>
# if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \
&& !defined(USE_WINALLOC) && !defined(MACOS) && !defined(DOS4GW) \
- && !defined(NONSTOP) && !defined(SN_TARGET_PS3) && !defined(RTEMS) \
- && !defined(__CC_ARM)
+ && !defined(NINTENDO_SWITCH) && !defined(NONSTOP) \
+ && !defined(SN_TARGET_PS3) && !defined(RTEMS) && !defined(__CC_ARM)
# define SBRK_ARG_T ptrdiff_t
/* systems. If you have something else, don't define */
/* USE_MUNMAP. */
-#if !defined(MSWIN32) && !defined(MSWINCE)
+#if !defined(NN_PLATFORM_CTR) && !defined(MSWIN32) && !defined(MSWINCE)
# include <unistd.h>
# ifdef SN_TARGET_PS3
# include <sys/memory.h>
# endif /* PCR */
-# if defined(GC_PTHREADS) || defined(GC_WIN32_THREADS)
+# if defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
+ || defined(GC_PTHREADS) || defined(GC_WIN32_THREADS)
STATIC void GC_CALLBACK GC_default_push_other_roots(void)
{
GC_push_all_stacks();
}
-# endif /* GC_WIN32_THREADS || GC_PTHREADS */
+# endif
# ifdef SN_TARGET_PS3
STATIC void GC_CALLBACK GC_default_push_other_roots(void)