# define I386
# define mach_type_known
# endif
+# if defined(LINUX) && defined(__x86_64__)
+# define X86_64
+# define mach_type_known
+# endif
# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
# define IA64
# define mach_type_known
/* (HPUX) */
/* SH ==> Hitachi SuperH */
/* (LINUX & MSWINCE) */
+ /* X86_64 ==> AMD x86-64 */
/*
# define GETPAGESIZE() sysconf(_SC_PAGESIZE)
/* getpagesize() appeared to be missing from at least one */
/* Solaris 5.4 installation. Weird. */
-# if CPP_WORDSZ == 32
-# define DYNAMIC_LOADING
-# endif
+# define DYNAMIC_LOADING
# endif
# ifdef SUNOS4
# define OS_TYPE "SUNOS4"
# define DATAEND (_end)
# define SVR4
# ifdef __arch64__
-# define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
+ /* libc_stack_end is not set reliably for sparc64 */
+# define STACKBOTTOM ((ptr_t) 0x80000000000)
# define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, _etext)
# else
-# define STACKBOTTOM ((ptr_t) 0xf0000000)
+# define LINUX_STACKBOTTOM
# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext)
# endif
# endif
/* This was developed for a linuxce style platform. Probably */
/* needs to be tweaked for workstation class machines. */
# define OS_TYPE "LINUX"
+# define DYNAMIC_LOADING
+ extern int _end[];
+# define DATAEND (_end)
extern int __data_start[];
# define DATASTART ((ptr_t)(__data_start))
# define ALIGNMENT 4
# define USE_GENERIC_PUSH_REGS
-# define STACKBOTTOM ((ptr_t)0x7fff8000)
- /* Older toolchains may need 0x80000000. */
- /* In many cases, this should probably use LINUX_STACKBOTTOM */
- /* instead. But some kernel versions seem to give the wrong */
- /* value from /proc. */
+# define LINUX_STACKBOTTOM
# endif /* Linux */
# ifdef EWS4800
# define HEURISTIC2
# define DATAEND /* not needed */
# endif
+# ifdef X86_64
+# define MACH_TYPE "X86_64"
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define CACHE_LINE_SIZE 64
+# define USE_GENERIC_PUSH_REGS
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define LINUX_STACKBOTTOM
+# if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# else
+ /* We seem to get random errors in incremental mode, */
+ /* possibly because Linux threads is itself a malloc client */
+ /* and can't deal with the signals. */
+# endif
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# ifdef UNDEFINED /* includes ro data */
+ extern int _etext[];
+# define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
+# endif
+# include <features.h>
+# define LINUX_DATA_START
+ extern int _end[];
+# define DATAEND (_end)
+# else
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
+# endif
+# define PREFETCH(x) \
+ __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x)))
+# define PREFETCH_FOR_WRITE(x) \
+ __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x)))
+# endif
+# endif
+
#ifdef LINUX_DATA_START
/* Some Linux distributions arrange to define __data_start. Some */
/* define data_start as a weak symbol. The latter is technically */
# define CAN_SAVE_CALL_STACKS
# define CAN_SAVE_CALL_ARGS
#endif
-#if defined(I386) && defined(LINUX)
+#if (defined(I386) || defined(X86_64)) && defined(LINUX)
/* 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_STACKS