# endif
/* Determine the machine type: */
+# if defined(__native_client__)
+# define NACL
+# define I386
+# define mach_type_known
+# endif
# if defined(__arm__) || defined(__thumb__)
# define ARM32
# if !defined(LINUX) && !defined(NETBSD) && !defined(DARWIN)
# define I386
# define mach_type_known
# endif
+# if defined(OPENBSD) && defined(__amd64__)
+# define X86_64
+# define mach_type_known
+# endif
# if defined(LINUX) && defined(__x86_64__)
# define X86_64
# define mach_type_known
# define mach_type_known
# endif
# ifdef DARWIN
+# include "TargetConditionals.h"
# if defined(__ppc__) || defined(__ppc64__)
# define POWERPC
# define mach_type_known
# define mach_type_known
# define DARWIN_DONT_PARSE_STACK
# define OS_TYPE "DARWIN"
-# define DYNAMIC_LOADING
+# if TARGET_IPHONE_SIMULATOR == 0
+# define DYNAMIC_LOADING
+# endif
/* XXX: see get_end(3), get_etext() and get_end() should not be used.
These aren't used when dyld support is enabled (it is by default) */
# define DATASTART ((ptr_t) get_etext())
# define DATAEND ((ptr_t) get_end())
-# define STACKBOTTOM ((ptr_t) 0xc0000000)
+# define STACKBOTTOM ((ptr_t) pthread_get_stackaddr_np(pthread_self()))
+#ifndef USE_MMAP
# define USE_MMAP
+#endif
# define USE_MMAP_ANON
# define USE_ASM_PUSH_REGS
/* This is potentially buggy. It needs more testing. See the comments in
# else
# if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \
|| defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
-# if defined(__LP64__) || defined(_WIN64)\r
-# define X86_64\r
-# else\r
-# define I386\r
-# endif\r
-# define MSWIN32 /* or Win64 */\r
-# define mach_type_known\r
-# endif\r
-# if defined(_MSC_VER) && defined(_M_IA64)\r
-# define IA64\r
-# define MSWIN32 /* Really win64, but we don't treat 64-bit */\r
- /* variants as a differnt platform. */\r
+# if defined(__LP64__) || defined(_WIN64)
+# define X86_64
+# else
+# define I386
+# endif
+# define MSWIN32 /* or Win64 */
+# define mach_type_known
+# endif
+# if defined(_MSC_VER) && defined(_M_IA64)
+# define IA64
+# define MSWIN32 /* Really win64, but we don't treat 64-bit */
+ /* variants as a differnt platform. */
# endif
# endif
# if defined(__DJGPP__)
# define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
# define DATAEND /* not needed */
# endif
-\r
+
# ifdef LINUX
# if defined(__powerpc64__)
# define ALIGNMENT 8
# endif
# ifdef I386
-# define MACH_TYPE "I386"
-# if defined(__LP64__) || defined(_WIN64)
-# define CPP_WORDSZ 64
-# define ALIGNMENT 8
-# else
+# if defined( NACL )
+# define MACH_TYPE "NACL"
# define CPP_WORDSZ 32
# define ALIGNMENT 4
+# else
+# define MACH_TYPE "I386"
+# if defined(__LP64__) || defined(_WIN64)
+# define CPP_WORDSZ 64
+# define ALIGNMENT 8
+# else
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# endif
/* Appears to hold for all "32 bit" compilers */
/* except Borland. The -a4 option fixes */
/* Borland. */
# define HEAP_START DATAEND
# endif /* USE_MMAP */
# endif /* DGUX */
-
+# ifdef NACL
+# define OS_TYPE "NACL"
+ extern int etext[];
+//# define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
+# define DATASTART ((ptr_t)0x10000000)
+ extern int _end[];
+# define DATAEND (_end)
+# ifdef STACK_GRAN
+# undef STACK_GRAN
+# endif /* STACK_GRAN */
+# define STACK_GRAN 0x10000
+# define HEURISTIC1
+# ifdef USE_MMAP
+# undef USE_MMAP
+# endif
+# ifdef USE_MUNMAP
+# undef USE_MUNMAP
+# endif
+# ifdef USE_MMAP_ANON
+# undef USE_MMAP_ANON
+# endif
+# ifdef USE_MMAP_FIXED
+# undef USE_MMAP_FIXED
+# endif
+# define GETPAGESIZE() 65536
+# define MAX_NACL_GC_THREADS 1024
+# endif
# ifdef LINUX
# ifndef __GNUC__
/* The Intel compiler doesn't like inline assembly */
# endif
# ifdef OPENBSD
# define OS_TYPE "OPENBSD"
+# ifdef GC_OPENBSD_THREADS
+# define UTHREAD_SP_OFFSET 192
+# else
+# include <sys/param.h>
+# include <uvm/uvm_extern.h>
+# define STACKBOTTOM USRSTACK
+# endif
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+ extern char _end[];
+# define DATAEND ((ptr_t)(&_end))
+# define DYNAMIC_LOADING
# endif
# ifdef FREEBSD
# define OS_TYPE "FREEBSD"
# define DYNAMIC_LOADING
extern int _end[];
# define DATAEND (_end)
+#pragma weak __data_start
extern int __data_start[];
# define DATASTART ((ptr_t)(__data_start))
# if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
extern char etext[];
# define SEARCH_FOR_DATA_START
# endif
+# ifdef OPENBSD
+# define OS_TYPE "OPENBSD"
+# define ELF_CLASS ELFCLASS64
+# ifdef GC_OPENBSD_THREADS
+# define UTHREAD_SP_OFFSET 400
+# else
+# include <sys/param.h>
+# include <uvm/uvm_extern.h>
+# define STACKBOTTOM USRSTACK
+# endif
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+ extern char _end[];
+# define DATAEND ((ptr_t)(&_end))
+# define DYNAMIC_LOADING
+# endif
# endif
#if defined(LINUX) && defined(USE_MMAP)
# if defined(GC_IRIX_THREADS) && !defined(IRIX5)
--> inconsistent configuration
# endif
-# if defined(GC_LINUX_THREADS) && !defined(LINUX)
+# if defined(GC_LINUX_THREADS) && !(defined(LINUX) || defined(NACL))
--> inconsistent configuration
# endif
# if defined(GC_SOLARIS_THREADS) && !defined(SUNOS5)
extern void *ps3_get_mem (size_t size);
# define GET_MEM(bytes) (struct hblk*) ps3_get_mem (bytes)
# else
- extern ptr_t GC_unix_get_mem();
+ extern ptr_t GC_unix_get_mem(word size);
# define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
#endif
# endif