[BACK]Return to gcconfig.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc / include / private

Diff for /OpenXM_contrib2/asir2000/gc/include/private/gcconfig.h between version 1.3 and 1.11

version 1.3, 2001/04/20 07:39:26 version 1.11, 2003/06/26 08:31:49
Line 13 
Line 13 
  * provided the above notices are retained, and a notice that the code was   * provided the above notices are retained, and a notice that the code was
  * modified is included with the above copyright notice.   * modified is included with the above copyright notice.
  */   */
   
   /*
    * This header is private to the gc.  It is almost always included from
    * gc_priv.h.  However it is possible to include it by itself if just the
    * configuration macros are needed.  In that
    * case, a few declarations relying on types declared in gc_priv.h will be
    * omitted.
    */
   
 #ifndef GCCONFIG_H  #ifndef GCCONFIG_H
   
 # define GCCONFIG_H  # define GCCONFIG_H
   
   # ifndef GC_PRIVATE_H
       /* Fake ptr_t declaration, just to avoid compilation errors.        */
       /* This avoids many instances if "ifndef GC_PRIVATE_H" below.       */
       typedef struct GC_undefined_struct * ptr_t;
   # endif
   
 /* Machine dependent parameters.  Some tuning parameters can be found   */  /* Machine dependent parameters.  Some tuning parameters can be found   */
 /* near the top of gc_private.h.                                        */  /* near the top of gc_private.h.                                        */
   
Line 25 
Line 39 
   
 /* First a unified test for Linux: */  /* First a unified test for Linux: */
 # if defined(linux) || defined(__linux__)  # if defined(linux) || defined(__linux__)
   #  ifndef LINUX
 #    define LINUX  #    define LINUX
   #  endif
 # endif  # endif
   
 /* And one for NetBSD: */  /* And one for NetBSD: */
Line 33 
Line 49 
 #    define NETBSD  #    define NETBSD
 # endif  # endif
   
   /* And one for OpenBSD: */
   # if defined(__OpenBSD__)
   #    define OPENBSD
   # endif
   
   /* And one for FreeBSD: */
   # if defined(__FreeBSD__)
   #    define FREEBSD
   # endif
   
 /* Determine the machine type: */  /* Determine the machine type: */
   # if defined(__XSCALE__)
   #    define ARM32
   #    if !defined(LINUX)
   #      define NOSYS
   #      define mach_type_known
   #    endif
   # endif
 # if defined(sun) && defined(mc68000)  # if defined(sun) && defined(mc68000)
 #    define M68K  #    define M68K
 #    define SUNOS4  #    define SUNOS4
Line 44 
Line 77 
 #    define HP  #    define HP
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__OpenBSD__) && defined(m68k)  # if defined(OPENBSD) && defined(m68k)
 #    define M68K  #    define M68K
 #    define OPENBSD  
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__OpenBSD__) && defined(__sparc__)  # if defined(OPENBSD) && defined(__sparc__)
 #    define SPARC  #    define SPARC
 #    define OPENBSD  
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__NetBSD__) && defined(m68k)  # if defined(NETBSD) && defined(m68k)
 #    define M68K  #    define M68K
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__NetBSD__) && defined(__powerpc__)  # if defined(NETBSD) && defined(__powerpc__)
 #    define POWERPC  #    define POWERPC
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__NetBSD__) && defined(__arm32__)  # if defined(NETBSD) && defined(__arm32__)
 #    define ARM32  #    define ARM32
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
Line 75 
Line 106 
 #    endif  #    endif
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(mips) || defined(__mips)  # if defined(mips) || defined(__mips) || defined(_mips)
 #    define MIPS  #    define MIPS
 #    if !defined(LINUX)  #    if defined(nec_ews) || defined(_nec_ews)
   #      define EWS4800
   #    endif
   #    if !defined(LINUX) && !defined(EWS4800)
 #      if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)  #      if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
 #        define ULTRIX  #        define ULTRIX
 #      else  #      else
Line 94 
Line 128 
 #    endif  #    endif
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
   # if defined(DGUX) && (defined(i386) || defined(__i386__))
   #    define I386
   #    ifndef _USING_DGUX
   #    define _USING_DGUX
   #    endif
   #    define mach_type_known
   # endif
 # if defined(sequent) && (defined(i386) || defined(__i386__))  # if defined(sequent) && (defined(i386) || defined(__i386__))
 #    define I386  #    define I386
 #    define SEQUENT  #    define SEQUENT
Line 161 
Line 202 
 #   endif  #   endif
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
   # if defined(__ia64) && defined(_HPUX_SOURCE)
   #   define IA64
   #   define HPUX
   #   define mach_type_known
   # endif
 # if defined(__BEOS__) && defined(_X86_)  # if defined(__BEOS__) && defined(_X86_)
 #    define I386  #    define I386
 #    define BEOS  #    define BEOS
Line 170 
Line 216 
 #    define I386  #    define I386
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
   # if defined(LINUX) && defined(__x86_64__)
   #    define X86_64
   #    define mach_type_known
   # endif
 # if defined(LINUX) && (defined(__ia64__) || defined(__ia64))  # if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
 #    define IA64  #    define IA64
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(LINUX) && defined(powerpc)  # if defined(LINUX) && defined(__arm__)
   #    define ARM32
   #    define mach_type_known
   # endif
   # if defined(LINUX) && (defined(powerpc) || defined(__powerpc__) || defined(powerpc64) || defined(__powerpc64__))
 #    define POWERPC  #    define POWERPC
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
Line 196 
Line 250 
 # endif  # endif
 # if defined(__alpha) || defined(__alpha__)  # if defined(__alpha) || defined(__alpha__)
 #   define ALPHA  #   define ALPHA
 #   if !defined(LINUX) && !defined(NETBSD)  #   if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) && !defined(FREEBSD)
 #     define OSF1       /* a.k.a Digital Unix */  #     define OSF1       /* a.k.a Digital Unix */
 #   endif  #   endif
 #   define mach_type_known  #   define mach_type_known
Line 213 
Line 267 
 #   define MACOS  #   define MACOS
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(__MWERKS__) && defined(__powerc)  # if defined(__MWERKS__) && defined(__powerc) && !defined(__MACH__)
 #   define POWERPC  #   define POWERPC
 #   define MACOS  #   define MACOS
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(macosx) || \  # if defined(macosx) || \
      defined(__APPLE__) && defined(__MACH__) && defined(__ppc__)       defined(__APPLE__) && defined(__MACH__) && defined(__ppc__)
 #    define MACOSX  #    define DARWIN
 #    define POWERPC  #    define POWERPC
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
 # if defined(__APPLE__) && defined(__MACH__) && defined(__i386__)  # if defined(__APPLE__) && defined(__MACH__) && defined(__i386__)
 #    define MACOSX  #    define DARWIN
 #    define I386  #    define I386
      --> Not really supported, but at least we recognize it.       --> Not really supported, but at least we recognize it.
 # endif  # endif
Line 244 
Line 298 
 #   define OPENBSD  #   define OPENBSD
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(__FreeBSD__) && (defined(i386) || defined(__i386__))  # if defined(FREEBSD) && (defined(i386) || defined(__i386__))
 #   define I386  #   define I386
 #   define FREEBSD  
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(__NetBSD__) && (defined(i386) || defined(__i386__))  # if defined(__NetBSD__) && (defined(i386) || defined(__i386__))
Line 268 
Line 321 
 #   define CX_UX  #   define CX_UX
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(DGUX)  # if defined(DGUX) && defined(m88k)
 #   define M88K  #   define M88K
     /* DGUX defined */      /* DGUX defined */
 #   define mach_type_known  #   define mach_type_known
Line 347 
Line 400 
 #   define mach_type_known  #   define mach_type_known
 # endif  # endif
 # if defined(__s390__) && defined(LINUX)  # if defined(__s390__) && defined(LINUX)
 #    define S370  #    define S390
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
   # if defined(__GNU__)
   #   if defined(__i386__)
   /* The Debian Hurd running on generic PC */
   #     define  HURD
   #     define  I386
   #     define  mach_type_known
   #    endif
   # endif
   
 /* Feel free to add more clauses here */  /* Feel free to add more clauses here */
   
Line 378 
Line 439 
                     /*             RS6000     ==> IBM RS/6000 AIX3.X    */                      /*             RS6000     ==> IBM RS/6000 AIX3.X    */
                     /*             RT         ==> IBM PC/RT             */                      /*             RT         ==> IBM PC/RT             */
                     /*             HP_PA      ==> HP9000/700 & /800     */                      /*             HP_PA      ==> HP9000/700 & /800     */
                     /*                            HP/UX, LINUX                  */                      /*                            HP/UX, LINUX          */
                     /*             SPARC      ==> SPARC v7/v8/v9        */                      /*             SPARC      ==> SPARC v7/v8/v9        */
                     /*                  (SUNOS4, SUNOS5, LINUX,         */                      /*                  (SUNOS4, SUNOS5, LINUX,         */
                     /*                   DRSNX variants)                */                      /*                   DRSNX variants)                */
Line 388 
Line 449 
                     /*                  (CX_UX and DGUX)                */                      /*                  (CX_UX and DGUX)                */
                     /*             S370       ==> 370-like machine      */                      /*             S370       ==> 370-like machine      */
                     /*                  running Amdahl UTS4             */                      /*                  running Amdahl UTS4             */
                     /*                  or a 390 running LINUX          */                      /*             S390       ==> 390-like machine      */
                       /*                  running LINUX                   */
                     /*             ARM32      ==> Intel StrongARM       */                      /*             ARM32      ==> Intel StrongARM       */
                     /*             IA64       ==> Intel IA64            */                      /*             IA64       ==> Intel IPF             */
                     /*                            (e.g. Itanium)        */                      /*                            (e.g. Itanium)        */
                       /*                  (LINUX and HPUX)                */
                     /*             SH         ==> Hitachi SuperH        */                      /*             SH         ==> Hitachi SuperH        */
                     /*                  (LINUX & MSWINCE)               */                      /*                  (LINUX & MSWINCE)               */
                       /*             X86_64     ==> AMD x86-64            */
                       /*             POWERPC    ==> IBM/Apple PowerPC     */
                       /*                  (MACOS(<=9),DARWIN(incl.MACOSX),*/
                       /*                   LINUX, NETBSD, NOSYS variants) */
   
   
 /*  /*
Line 414 
Line 481 
  * defining it to be 1 will always work, but perform poorly.   * defining it to be 1 will always work, but perform poorly.
  *   *
  * DATASTART is the beginning of the data segment.   * DATASTART is the beginning of the data segment.
  * On UNIX systems, the collector will scan the area between DATASTART   * On some platforms SEARCH_FOR_DATA_START is defined.
    * SEARCH_FOR_DATASTART will cause GC_data_start to
    * be set to an address determined by accessing data backwards from _end
    * until an unmapped page is found.  DATASTART will be defined to be
    * GC_data_start.
    * On UNIX-like systems, the collector will scan the area between DATASTART
  * and DATAEND for root pointers.   * and DATAEND for root pointers.
  *   *
  * DATAEND, if not &end.   * DATAEND, if not `end' where `end' is defined as ``extern int end[];''.
    * RTH suggests gaining access to linker script synth'd values with
    * this idiom instead of `&end' where `end' is defined as ``extern int end;'' .
  *   *
  * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice   * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
  * the pointer size.   * the pointer size.
Line 429 
Line 503 
  * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and   * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
  * 2) define exactly one of   * 2) define exactly one of
  *      STACKBOTTOM (should be defined to be an expression)   *      STACKBOTTOM (should be defined to be an expression)
    *      LINUX_STACKBOTTOM
  *      HEURISTIC1   *      HEURISTIC1
  *      HEURISTIC2   *      HEURISTIC2
    * If STACKBOTTOM is defined, then it's value will be used directly as the
    * stack base.  If LINUX_STACKBOTTOM is defined, then it will be determined
    * with a method appropriate for most Linux systems.  Currently we look
    * first for __libc_stack_end, and if that fails read it from /proc.
  * If either of the last two macros are defined, then STACKBOTTOM is computed   * If either of the last two macros are defined, then STACKBOTTOM is computed
  * during collector startup using one of the following two heuristics:   * during collector startup using one of the following two heuristics:
  * HEURISTIC1:  Take an address inside GC_init's frame, and round it up to   * HEURISTIC1:  Take an address inside GC_init's frame, and round it up to
Line 495 
Line 574 
  * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to   * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to
  * clear the two words at GC_malloc-aligned address x.  By default,   * clear the two words at GC_malloc-aligned address x.  By default,
  * word stores of 0 are used instead.   * word stores of 0 are used instead.
    *
    * HEAP_START may be defined as the initial address hint for mmap-based
    * allocation.
  */   */
   
   /* If we are using a recent version of gcc, we can use __builtin_unwind_init()
    * to push the relevant registers onto the stack.  This generally makes
    * USE_GENERIC_PUSH_REGS the preferred approach for marking from registers.
    */
   # if defined(__GNUC__) && ((__GNUC__ >= 3) || \
                              (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
   #   define HAVE_BUILTIN_UNWIND_INIT
   # endif
   
 # define STACK_GRAN 0x1000000  # define STACK_GRAN 0x1000000
 # ifdef M68K  # ifdef M68K
Line 505 
Line 595 
 #   ifdef OPENBSD  #   ifdef OPENBSD
 #       define OS_TYPE "OPENBSD"  #       define OS_TYPE "OPENBSD"
 #       define HEURISTIC2  #       define HEURISTIC2
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #   endif  #   endif
 #   ifdef NETBSD  #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"  #       define OS_TYPE "NETBSD"
 #       define HEURISTIC2  #       define HEURISTIC2
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define STACKBOTTOM ((ptr_t)0xf0000000)  #       define STACKBOTTOM ((ptr_t)0xf0000000)
 #       define MPROTECT_VDB  /* #       define MPROTECT_VDB - Reported to not work  9/17/01 */
 #       ifdef __ELF__  #       ifdef __ELF__
 #            define DYNAMIC_LOADING  #            define DYNAMIC_LOADING
 #            include <features.h>  #            include <features.h>
 #            if defined(__GLIBC__)&& __GLIBC__>=2  #            if defined(__GLIBC__)&& __GLIBC__>=2
 #              define LINUX_DATA_START  #              define SEARCH_FOR_DATA_START
 #            else /* !GLIBC2 */  #            else /* !GLIBC2 */
                extern char **__environ;                 extern char **__environ;
 #              define DATASTART ((ptr_t)(&__environ))  #              define DATASTART ((ptr_t)(&__environ))
Line 535 
Line 625 
                              /* contain large read-only data tables    */                               /* contain large read-only data tables    */
                              /* that we'd rather not scan.             */                               /* that we'd rather not scan.             */
 #            endif /* !GLIBC2 */  #            endif /* !GLIBC2 */
              extern int _end;               extern int _end[];
 #            define DATAEND (&_end)  #            define DATAEND (_end)
 #       else  #       else
              extern int etext;               extern int etext[];
 #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #       endif  #       endif
 #   endif  #   endif
 #   ifdef SUNOS4  #   ifdef SUNOS4
 #       define OS_TYPE "SUNOS4"  #       define OS_TYPE "SUNOS4"
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff))  #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ffff) & ~0x1ffff))
 #       define HEURISTIC1       /* differs      */  #       define HEURISTIC1       /* differs      */
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #   endif  #   endif
 #   ifdef HP  #   ifdef HP
 #       define OS_TYPE "HP"  #       define OS_TYPE "HP"
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #       define STACKBOTTOM ((ptr_t) 0xffeffffc)  #       define STACKBOTTOM ((ptr_t) 0xffeffffc)
                               /* empirically determined.  seems to work. */                                /* empirically determined.  seems to work. */
 #       include <unistd.h>  #       include <unistd.h>
Line 560 
Line 650 
 #   endif  #   endif
 #   ifdef SYSV  #   ifdef SYSV
 #       define OS_TYPE "SYSV"  #       define OS_TYPE "SYSV"
         extern etext;          extern etext[];
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \  #       define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
                                    & ~0x3fffff) \                                     & ~0x3fffff) \
                                   +((word)&etext & 0x1fff))                                    +((word)etext & 0x1fff))
         /* This only works for shared-text binaries with magic number 0413.          /* This only works for shared-text binaries with magic number 0413.
            The other sorts of SysV binaries put the data at the end of the text,             The other sorts of SysV binaries put the data at the end of the text,
            in which case the default of &etext would work.  Unfortunately,             in which case the default of etext would work.  Unfortunately,
            handling both would require having the magic-number available.             handling both would require having the magic-number available.
                                 -- Parag                                  -- Parag
            */             */
Line 617 
Line 707 
 #     define DATAEND  /* not needed */  #     define DATAEND  /* not needed */
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
 #     define ALIGNMENT 4        /* Guess.  Can someone verify?  */  #     if (defined (powerpc64) || defined(__powerpc64__))
   #       define ALIGNMENT 8
   #       define CPP_WORDSZ 64
   #     else
   #       define ALIGNMENT 4      /* Guess.  Can someone verify?  */
                                 /* This was 2, but that didn't sound right. */                                  /* This was 2, but that didn't sound right. */
   #     endif
 #     define OS_TYPE "LINUX"  #     define OS_TYPE "LINUX"
 #     define HEURISTIC1        /* HEURISTIC1 has been reliably reported to fail for a 32-bit     */
         /* executable on a 64 bit kernel.                                 */
   #     define LINUX_STACKBOTTOM
 #     define DYNAMIC_LOADING  #     define DYNAMIC_LOADING
 #     undef STACK_GRAN  #     define SEARCH_FOR_DATA_START
 #     define STACK_GRAN 0x10000000        extern int _end[];
         /* Stack usually starts at 0x80000000 */  #     define DATAEND (_end)
 #     define LINUX_DATA_START  
       extern int _end;  
 #     define DATAEND (&_end)  
 #   endif  #   endif
 #   ifdef MACOSX  #   ifdef DARWIN
       /* There are reasons to suspect this may not be reliable.         */  
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define OS_TYPE "MACOSX"  #     define OS_TYPE "DARWIN"
   #     define DYNAMIC_LOADING
         /* 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 DATASTART ((ptr_t) get_etext())
   #     define DATAEND    ((ptr_t) get_end())
 #     define STACKBOTTOM ((ptr_t) 0xc0000000)  #     define STACKBOTTOM ((ptr_t) 0xc0000000)
 #     define DATAEND    /* not needed */  #     define USE_MMAP
   #     define USE_MMAP_ANON
   #     define USE_ASM_PUSH_REGS
         /* This is potentially buggy. It needs more testing. See the comments in
            os_dep.c */
 #     define MPROTECT_VDB  #     define MPROTECT_VDB
 #     include <unistd.h>  #     include <unistd.h>
 #     define GETPAGESIZE() getpagesize()  #     define GETPAGESIZE() getpagesize()
   #     if defined(USE_PPC_PREFETCH) && defined(__GNUC__)
           /* The performance impact of prefetches is untested */
   #       define PREFETCH(x) \
             __asm__ __volatile__ ("dcbt 0,%0" : : "r" ((const void *) (x)))
   #       define PREFETCH_FOR_WRITE(x) \
             __asm__ __volatile__ ("dcbtst 0,%0" : : "r" ((const void *) (x)))
   #     endif
         /* There seems to be some issues with trylock hanging on darwin. This
            should be looked into some more */
   #     define NO_PTHREAD_TRYLOCK
 #   endif  #   endif
 #   ifdef NETBSD  #   ifdef NETBSD
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define OS_TYPE "NETBSD"  #     define OS_TYPE "NETBSD"
 #     define HEURISTIC2  #     define HEURISTIC2
       extern char etext;        extern char etext[];
 #     define DATASTART GC_data_start  #     define DATASTART GC_data_start
 #     define DYNAMIC_LOADING  #     define DYNAMIC_LOADING
 #   endif  #   endif
 #   ifdef NOSYS  #   ifdef NOSYS
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define OS_TYPE "NOSYS"  #     define OS_TYPE "NOSYS"
       extern void __end, __dso_handle;        extern void __end[], __dso_handle[];
 #     define DATASTART (&__dso_handle)  /* OK, that's ugly.  */  #     define DATASTART (__dso_handle)  /* OK, that's ugly.  */
 #     define DATAEND (&__end)  #     define DATAEND (__end)
         /* Stack starts at 0xE0000000 for the simulator.  */          /* Stack starts at 0xE0000000 for the simulator.  */
 #     undef STACK_GRAN  #     undef STACK_GRAN
 #     define STACK_GRAN 0x10000000  #     define STACK_GRAN 0x10000000
Line 664 
Line 775 
 # ifdef VAX  # ifdef VAX
 #   define MACH_TYPE "VAX"  #   define MACH_TYPE "VAX"
 #   define ALIGNMENT 4  /* Pointers are longword aligned by 4.2 C compiler */  #   define ALIGNMENT 4  /* Pointers are longword aligned by 4.2 C compiler */
     extern char etext;      extern char etext[];
 #   define DATASTART ((ptr_t)(&etext))  #   define DATASTART ((ptr_t)(etext))
 #   ifdef BSD  #   ifdef BSD
 #       define OS_TYPE "BSD"  #       define OS_TYPE "BSD"
 #       define HEURISTIC1  #       define HEURISTIC1
Line 688 
Line 799 
 #   define MACH_TYPE "SPARC"  #   define MACH_TYPE "SPARC"
 #   if defined(__arch64__) || defined(__sparcv9)  #   if defined(__arch64__) || defined(__sparcv9)
 #     define ALIGNMENT 8  #     define ALIGNMENT 8
   #     define CPP_WORDSZ 64
   #     define ELF_CLASS ELFCLASS64
 #   else  #   else
 #     define ALIGNMENT 4        /* Required by hardware */  #     define ALIGNMENT 4        /* Required by hardware */
   #     define CPP_WORDSZ 32
 #   endif  #   endif
 #   define ALIGN_DOUBLE  #   define ALIGN_DOUBLE
 #   ifdef SUNOS5  #   ifdef SUNOS5
 #       define OS_TYPE "SUNOS5"  #       define OS_TYPE "SUNOS5"
         extern int _etext;          extern int _etext[];
         extern int _end;          extern int _end[];
         extern char * GC_SysVGetDataStart();          extern ptr_t GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)  #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
 #       define DATAEND (&_end)  #       define DATAEND (_end)
 #       ifndef USE_MMAP  #       if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
 #           define USE_MMAP  #           define USE_MMAP
               /* Otherwise we now use calloc.  Mmap may result in the     */
               /* heap interleaved with thread stacks, which can result in */
               /* excessive blacklisting.  Sbrk is unusable since it       */
               /* doesn't interact correctly with the system malloc.       */
 #       endif  #       endif
 #       ifdef USE_MMAP  #       ifdef USE_MMAP
 #         define HEAP_START (ptr_t)0x40000000  #         define HEAP_START (ptr_t)0x40000000
Line 718 
Line 836 
           /* This should work everywhere, but doesn't.  */            /* This should work everywhere, but doesn't.  */
 #         define STACKBOTTOM USRSTACK  #         define STACKBOTTOM USRSTACK
 #       else  #       else
 #         if MPI  
             extern int *StackBottom;  
 #           define STACKBOTTOM (ptr_t)(StackBottom)  
 #         else  
 #         define HEURISTIC2  #         define HEURISTIC2
 #         endif  
 #       endif  #       endif
 #       include <unistd.h>  #       include <unistd.h>
 #       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)  #       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
Line 735 
Line 848 
 #       define OS_TYPE "SUNOS4"  #       define OS_TYPE "SUNOS4"
         /* [If you have a weak stomach, don't read this.]               */          /* [If you have a weak stomach, don't read this.]               */
         /* We would like to use:                                        */          /* We would like to use:                                        */
 /* #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */  /* #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1fff) & ~0x1fff)) */
         /* This fails occasionally, due to an ancient, but very         */          /* This fails occasionally, due to an ancient, but very         */
         /* persistent ld bug.  &etext is set 32 bytes too high.         */          /* persistent ld bug.  etext is set 32 bytes too high.          */
         /* We instead read the text segment size from the a.out         */          /* We instead read the text segment size from the a.out         */
         /* header, which happens to be mapped into our address space    */          /* header, which happens to be mapped into our address space    */
         /* at the start of the text segment.  The detective work here   */          /* at the start of the text segment.  The detective work here   */
Line 751 
Line 864 
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #   endif  #   endif
 #   ifdef DRSNX  #   ifdef DRSNX
 #       define CPP_WORDSZ 32  
 #       define OS_TYPE "DRSNX"  #       define OS_TYPE "DRSNX"
         extern char * GC_SysVGetDataStart();          extern ptr_t GC_SysVGetDataStart();
         extern int etext;          extern int etext[];
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)  #       define DATASTART GC_SysVGetDataStart(0x10000, etext)
 #       define MPROTECT_VDB  #       define MPROTECT_VDB
 #       define STACKBOTTOM ((ptr_t) 0xdfff0000)  #       define STACKBOTTOM ((ptr_t) 0xdfff0000)
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
Line 767 
Line 879 
 #     else  #     else
           Linux Sparc/a.out not supported            Linux Sparc/a.out not supported
 #     endif  #     endif
       extern int _end;        extern int _end[];
       extern int _etext;        extern int _etext[];
 #     define DATAEND (&_end)  #     define DATAEND (_end)
 #     define SVR4  #     define SVR4
         extern ptr_t GC_SysVGetDataStart();
 #     ifdef __arch64__  #     ifdef __arch64__
   #       define DATASTART GC_SysVGetDataStart(0x100000, _etext)
           /* libc_stack_end is not set reliably for sparc64 */
 #       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)  #       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, &_etext)  
 #       define CPP_WORDSZ 64  
 #     else  #     else
 #       define STACKBOTTOM ((ptr_t) 0xf0000000)  #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)  #       define LINUX_STACKBOTTOM
 #     endif  #     endif
 #   endif  #   endif
 #   ifdef OPENBSD  #   ifdef OPENBSD
 #     define OS_TYPE "OPENBSD"  #     define OS_TYPE "OPENBSD"
 #     define STACKBOTTOM ((ptr_t) 0xf8000000)  #     define STACKBOTTOM ((ptr_t) 0xf8000000)
       extern int etext;        extern int etext[];
 #     define DATASTART ((ptr_t)(&etext))  #     define DATASTART ((ptr_t)(etext))
 #   endif  #   endif
 #   ifdef NETBSD  #   ifdef NETBSD
 #     define OS_TYPE "NETBSD"  #     define OS_TYPE "NETBSD"
Line 793 
Line 906 
 #       define DATASTART GC_data_start  #       define DATASTART GC_data_start
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #     else  #     else
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #     endif  #     endif
 #   endif  #   endif
 # endif  # endif
Line 809 
Line 922 
 #     define ALIGN_DOUBLE /* Not strictly necessary, but may give speed   */  #     define ALIGN_DOUBLE /* Not strictly necessary, but may give speed   */
                           /* improvement on Pentiums.                     */                            /* improvement on Pentiums.                     */
 #   endif  #   endif
   #   ifdef HAVE_BUILTIN_UNWIND_INIT
   #       define USE_GENERIC_PUSH_REGS
   #   endif
 #   ifdef SEQUENT  #   ifdef SEQUENT
 #       define OS_TYPE "SEQUENT"  #       define OS_TYPE "SEQUENT"
         extern int etext;          extern int etext[];
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #       define STACKBOTTOM ((ptr_t) 0x3ffff000)  #       define STACKBOTTOM ((ptr_t) 0x3ffff000)
 #   endif  #   endif
 #   ifdef BEOS  #   ifdef BEOS
 #     define OS_TYPE "BEOS"  #     define OS_TYPE "BEOS"
 #     include <OS.h>  #     include <OS.h>
 #     define GETPAGESIZE() B_PAGE_SIZE  #     define GETPAGESIZE() B_PAGE_SIZE
       extern int etext;        extern int etext[];
 #     define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #     define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #   endif  #   endif
 #   ifdef SUNOS5  #   ifdef SUNOS5
 #       define OS_TYPE "SUNOS5"  #       define OS_TYPE "SUNOS5"
         extern int etext, _start;          extern int _etext[], _end[];
         extern char * GC_SysVGetDataStart();          extern ptr_t GC_SysVGetDataStart();
 #       define DATASTART GC_SysVGetDataStart(0x1000, &etext)  #       define DATASTART GC_SysVGetDataStart(0x1000, _etext)
 /*      # define STACKBOTTOM ((ptr_t)(&_start)) worked through 2.7,     */  #       define DATAEND (_end)
   /*      # define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7,      */
 /*      but reportedly breaks under 2.8.  It appears that the stack     */  /*      but reportedly breaks under 2.8.  It appears that the stack     */
 /*      base is a property of the executable, so this should not break  */  /*      base is a property of the executable, so this should not break  */
 /*      old executables.                                                */  /*      old executables.                                                */
 /*      HEURISTIC2 probably works, but this appears to be preferable.   */  /*      HEURISTIC2 probably works, but this appears to be preferable.   */
 #       include <sys/vmparam.h>  #       include <sys/vm.h>
 #       define STACKBOTTOM USRSTACK  #       define STACKBOTTOM USRSTACK
 /** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */  /* At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
 /*#     define PROC_VDB*/  /* It appears to be fixed in 2.8 and 2.9.                               */
   #       ifdef SOLARIS25_PROC_VDB_BUG_FIXED
   #         define PROC_VDB
   #       endif
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #       ifndef USE_MMAP  /* added by noro */
   #   define USE_MMAP
   #       if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
 #           define USE_MMAP  #           define USE_MMAP
               /* Otherwise we now use calloc.  Mmap may result in the     */
               /* heap interleaved with thread stacks, which can result in */
               /* excessive blacklisting.  Sbrk is unusable since it       */
               /* doesn't interact correctly with the system malloc.       */
 #       endif  #       endif
 #       ifdef USE_MMAP  #       ifdef USE_MMAP
 #         define HEAP_START (ptr_t)0x40000000  #         define HEAP_START (ptr_t)0x40000000
Line 848 
Line 974 
 #   endif  #   endif
 #   ifdef SCO  #   ifdef SCO
 #       define OS_TYPE "SCO"  #       define OS_TYPE "SCO"
         extern int etext;          extern int etext[];
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \  #       define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
                                   & ~0x3fffff) \                                    & ~0x3fffff) \
                                  +((word)&etext & 0xfff))                                   +((word)etext & 0xfff))
 #       define STACKBOTTOM ((ptr_t) 0x7ffffffc)  #       define STACKBOTTOM ((ptr_t) 0x7ffffffc)
 #   endif  #   endif
 #   ifdef SCO_ELF  #   ifdef SCO_ELF
 #       define OS_TYPE "SCO_ELF"  #       define OS_TYPE "SCO_ELF"
         extern int etext;          extern int etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #       define STACKBOTTOM ((ptr_t) 0x08048000)  #       define STACKBOTTOM ((ptr_t) 0x08048000)
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #       define ELF_CLASS ELFCLASS32  #       define ELF_CLASS ELFCLASS32
 #   endif  #   endif
   #   ifdef DGUX
   #       define OS_TYPE "DGUX"
           extern int _etext, _end;
           extern ptr_t GC_SysVGetDataStart();
   #       define DATASTART GC_SysVGetDataStart(0x1000, &_etext)
   #       define DATAEND (&_end)
   #       define STACK_GROWS_DOWN
   #       define HEURISTIC2
   #       include <unistd.h>
   #       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
   #       define DYNAMIC_LOADING
   #       ifndef USE_MMAP
   #         define USE_MMAP
   #       endif /* USE_MMAP */
   #       define MAP_FAILED (void *) -1
   #       ifdef USE_MMAP
   #         define HEAP_START (ptr_t)0x40000000
   #       else /* USE_MMAP */
   #         define HEAP_START DATAEND
   #       endif /* USE_MMAP */
   #   endif /* DGUX */
   
 #   ifdef LINUX  #   ifdef LINUX
   #       ifndef __GNUC__
             /* The Intel compiler doesn't like inline assembly */
   #         define USE_GENERIC_PUSH_REGS
   #       endif
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define LINUX_STACKBOTTOM  #       define LINUX_STACKBOTTOM
   /* #       define USE_MMAP */
 #       if 0  #       if 0
 #         define HEURISTIC1  #         define HEURISTIC1
 #         undef STACK_GRAN  #         undef STACK_GRAN
Line 874 
Line 1027 
           /* with 2GB physical memory will usually move the user        */            /* with 2GB physical memory will usually move the user        */
           /* address space limit, and hence initial SP to 0x80000000.   */            /* address space limit, and hence initial SP to 0x80000000.   */
 #       endif  #       endif
 #       if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC)  #       if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
 #           define MPROTECT_VDB  #           define MPROTECT_VDB
 #       else  #       else
             /* We seem to get random errors in incremental mode,        */              /* We seem to get random errors in incremental mode,        */
             /* possibly because Linux threads is itself a malloc client */              /* possibly because Linux threads is itself a malloc client */
             /* and can't deal with the signals.                         */              /* and can't deal with the signals.                         */
 #       endif  #       endif
   #       define HEAP_START 0x1000
                   /* This encourages mmap to give us low addresses,       */
                   /* thus allowing the heap to grow to ~3GB               */
 #       ifdef __ELF__  #       ifdef __ELF__
 #            define DYNAMIC_LOADING  #            define DYNAMIC_LOADING
 #            ifdef UNDEFINED    /* includes ro data */  #            ifdef UNDEFINED    /* includes ro data */
                extern int _etext;                 extern int _etext[];
 #              define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff))  #              define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
 #            endif  #            endif
 #            include <features.h>  #            include <features.h>
 #            if defined(__GLIBC__) && __GLIBC__ >= 2  #            if defined(__GLIBC__) && __GLIBC__ >= 2
 #                define LINUX_DATA_START  #                define SEARCH_FOR_DATA_START
 #            else  #            else
                  extern char **__environ;                   extern char **__environ;
 #                define DATASTART ((ptr_t)(&__environ))  #                define DATASTART ((ptr_t)(&__environ))
Line 902 
Line 1058 
                               /* contain large read-only data tables    */                                /* contain large read-only data tables    */
                               /* that we'd rather not scan.             */                                /* that we'd rather not scan.             */
 #            endif  #            endif
              extern int _end;               extern int _end[];
 #            define DATAEND (&_end)  #            define DATAEND (_end)
 #       else  #       else
              extern int etext;               extern int etext[];
 #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #       endif  #       endif
 #       ifdef USE_I686_PREFETCH  #       ifdef USE_I686_PREFETCH
 #         define PREFETCH(x) \  #         define PREFETCH(x) \
Line 931 
Line 1087 
 #   endif  #   endif
 #   ifdef CYGWIN32  #   ifdef CYGWIN32
 #       define OS_TYPE "CYGWIN32"  #       define OS_TYPE "CYGWIN32"
           extern int _data_start__;            extern int _data_start__[];
           extern int _data_end__;            extern int _data_end__[];
           extern int _bss_start__;            extern int _bss_start__[];
           extern int _bss_end__;            extern int _bss_end__[];
         /* For binutils 2.9.1, we have                  */          /* For binutils 2.9.1, we have                  */
         /*      DATASTART   = _data_start__             */          /*      DATASTART   = _data_start__             */
         /*      DATAEND     = _bss_end__                */          /*      DATAEND     = _bss_end__                */
Line 943 
Line 1099 
         /*      DATAEND     = _data_end__               */          /*      DATAEND     = _data_end__               */
         /* To get it right for both, we take the        */          /* To get it right for both, we take the        */
         /* minumum/maximum of the two.                  */          /* minumum/maximum of the two.                  */
   #     ifndef MAX
 #       define MAX(x,y) ((x) > (y) ? (x) : (y))  #       define MAX(x,y) ((x) > (y) ? (x) : (y))
   #     endif
   #     ifndef MIN
 #       define MIN(x,y) ((x) < (y) ? (x) : (y))  #       define MIN(x,y) ((x) < (y) ? (x) : (y))
 #       define DATASTART ((ptr_t) MIN(&_data_start__, &_bss_start__))  #     endif
 #       define DATAEND   ((ptr_t) MAX(&_data_end__, &_bss_end__))  #       define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
   #       define DATAEND   ((ptr_t) MAX(_data_end__, _bss_end__))
 #       undef STACK_GRAN  #       undef STACK_GRAN
 #       define STACK_GRAN 0x10000  #       define STACK_GRAN 0x10000
 #       define HEURISTIC1  #       define HEURISTIC1
Line 975 
Line 1135 
 #   ifdef DJGPP  #   ifdef DJGPP
 #       define OS_TYPE "DJGPP"  #       define OS_TYPE "DJGPP"
 #       include "stubinfo.h"  #       include "stubinfo.h"
         extern int etext;          extern int etext[];
         extern int _stklen;          extern int _stklen;
         extern int __djgpp_stack_limit;          extern int __djgpp_stack_limit;
 #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff))  #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ff) & ~0x1ff))
 /* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \  /* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
                                                      + _stklen)) */                                                       + _stklen)) */
 #       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))  #       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
Line 989 
Line 1149 
 #   endif  #   endif
 #   ifdef FREEBSD  #   ifdef FREEBSD
 #       define OS_TYPE "FREEBSD"  #       define OS_TYPE "FREEBSD"
 #       define MPROTECT_VDB  #       ifndef GC_FREEBSD_THREADS
   #           define MPROTECT_VDB
   #       endif
   #       define SIG_SUSPEND SIGUSR1
   #       define SIG_THR_RESTART SIGUSR2
 #       define FREEBSD_STACKBOTTOM  #       define FREEBSD_STACKBOTTOM
   #       ifdef __ELF__
   #           define DYNAMIC_LOADING
   #       endif
           extern char etext[];
           extern char * GC_FreeBSDGetDataStart();
   #       define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
 #   endif  #   endif
 #   ifdef NETBSD  #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"  #       define OS_TYPE "NETBSD"
   #       ifdef __ELF__
   #           define DYNAMIC_LOADING
   #       endif
 #   endif  #   endif
 #   ifdef THREE86BSD  #   ifdef THREE86BSD
 #       define OS_TYPE "THREE86BSD"  #       define OS_TYPE "THREE86BSD"
Line 1001 
Line 1174 
 #   ifdef BSDI  #   ifdef BSDI
 #       define OS_TYPE "BSDI"  #       define OS_TYPE "BSDI"
 #   endif  #   endif
 #   if defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \  #   if defined(OPENBSD) || defined(NETBSD) \
         || defined(THREE86BSD) || defined(BSDI)          || defined(THREE86BSD) || defined(BSDI)
 #       define HEURISTIC2  #       define HEURISTIC2
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #   endif  #   endif
 #   ifdef NEXT  #   ifdef NEXT
 #       define OS_TYPE "NEXT"  #       define OS_TYPE "NEXT"
Line 1028 
Line 1201 
 #     define DATASTART ((ptr_t) &__nullarea)  #     define DATASTART ((ptr_t) &__nullarea)
 #     define DATAEND ((ptr_t) &_end)  #     define DATAEND ((ptr_t) &_end)
 #   endif  #   endif
   #   ifdef HURD
   #     define OS_TYPE "HURD"
   #     define STACK_GROWS_DOWN
   #     define HEURISTIC2
         extern int  __data_start[];
   #     define DATASTART ( (ptr_t) (__data_start))
         extern int   _end[];
   #     define DATAEND ( (ptr_t) (_end))
   /* #     define MPROTECT_VDB  Not quite working yet? */
   #     define DYNAMIC_LOADING
   #   endif
 # endif  # endif
   
 # ifdef NS32K  # ifdef NS32K
Line 1044 
Line 1228 
   
 # ifdef MIPS  # ifdef MIPS
 #   define MACH_TYPE "MIPS"  #   define MACH_TYPE "MIPS"
 /* #   define STACKBOTTOM ((ptr_t)0x7fff8000)  sometimes also works.  */  
 #   ifdef LINUX  #   ifdef LINUX
       /* This was developed for a linuxce style platform.  Probably     */        /* This was developed for a linuxce style platform.  Probably     */
       /* needs to be tweaked for workstation class machines.            */        /* needs to be tweaked for workstation class machines.            */
 #     define OS_TYPE "LINUX"  #     define OS_TYPE "LINUX"
       extern int __data_start;  #     define DYNAMIC_LOADING
 #     define DATASTART ((ptr_t)(&__data_start))        extern int _end[];
   #     define DATAEND (_end)
         extern int __data_start[];
   #     define DATASTART ((ptr_t)(__data_start))
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define USE_GENERIC_PUSH_REGS 1  #     define USE_GENERIC_PUSH_REGS
 #     define STACKBOTTOM 0x80000000  #     if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
         /* In many cases, this should probably use LINUX_STACKBOTTOM    */  #        define LINUX_STACKBOTTOM
         /* instead. But some kernel versions seem to give the wrong     */  #     else
         /* value from /proc.                                            */  #        define STACKBOTTOM 0x80000000
   #     endif
 #   endif /* Linux */  #   endif /* Linux */
   #   ifdef EWS4800
   #      define HEURISTIC2
   #      if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
            extern int _fdata[], _end[];
   #        define DATASTART ((ptr_t)_fdata)
   #        define DATAEND ((ptr_t)_end)
   #        define CPP_WORDSZ _MIPS_SZPTR
   #        define ALIGNMENT (_MIPS_SZPTR/8)
   #      else
            extern int etext[], edata[], end[];
            extern int _DYNAMIC_LINKING[], _gp[];
   #        define DATASTART ((ptr_t)((((word)etext + 0x3ffff) & ~0x3ffff) \
                  + ((word)etext & 0xffff)))
   #        define DATAEND (edata)
   #        define DATASTART2 (_DYNAMIC_LINKING \
                  ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
                  : (ptr_t)edata)
   #        define DATAEND2 (end)
   #        define ALIGNMENT 4
   #      endif
   #      define OS_TYPE "EWS4800"
   #      define USE_GENERIC_PUSH_REGS 1
   #   endif
 #   ifdef ULTRIX  #   ifdef ULTRIX
 #       define HEURISTIC2  #       define HEURISTIC2
 #       define DATASTART (ptr_t)0x10000000  #       define DATASTART (ptr_t)0x10000000
Line 1074 
Line 1284 
 #   endif  #   endif
 #   ifdef IRIX5  #   ifdef IRIX5
 #       define HEURISTIC2  #       define HEURISTIC2
         extern int _fdata;          extern int _fdata[];
 #       define DATASTART ((ptr_t)(&_fdata))  #       define DATASTART ((ptr_t)(_fdata))
 #       ifdef USE_MMAP  #       ifdef USE_MMAP
 #         define HEAP_START (ptr_t)0x30000000  #         define HEAP_START (ptr_t)0x30000000
 #       else  #       else
Line 1087 
Line 1297 
                               /* heap sections so they're not           */                                /* heap sections so they're not           */
                               /* considered as roots.                   */                                /* considered as roots.                   */
 #       define OS_TYPE "IRIX5"  #       define OS_TYPE "IRIX5"
 #       define MPROTECT_VDB  /*#       define MPROTECT_VDB DOB: this should work, but there is evidence */
   /*              of recent breakage.                                        */
 #       ifdef _MIPS_SZPTR  #       ifdef _MIPS_SZPTR
 #         define CPP_WORDSZ _MIPS_SZPTR  #         define CPP_WORDSZ _MIPS_SZPTR
 #         define ALIGNMENT (_MIPS_SZPTR/8)  #         define ALIGNMENT (_MIPS_SZPTR/8)
Line 1111 
Line 1322 
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define OS_TYPE "NETBSD"  #     define OS_TYPE "NETBSD"
 #     define HEURISTIC2  #     define HEURISTIC2
 #     define USE_GENERIC_PUSH_REGS 1  #     define USE_GENERIC_PUSH_REGS
 #     ifdef __ELF__  #     ifdef __ELF__
         extern int etext;          extern int etext[];
 #       define DATASTART GC_data_start  #       define DATASTART GC_data_start
 #       define NEED_FIND_LIMIT  #       define NEED_FIND_LIMIT
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
Line 1126 
Line 1337 
   
 # ifdef RS6000  # ifdef RS6000
 #   define MACH_TYPE "RS6000"  #   define MACH_TYPE "RS6000"
 #   define ALIGNMENT 4  #   ifdef ALIGNMENT
 #   define DATASTART ((ptr_t)0x20000000)  #     undef ALIGNMENT
   #   endif
   #   ifdef IA64
   #     undef IA64 /* DOB: some AIX installs stupidly define IA64 in /usr/include/sys/systemcfg.h */
   #   endif
   #   ifdef __64BIT__
   #     define ALIGNMENT 8
   #     define CPP_WORDSZ 64
   #     define STACKBOTTOM ((ptr_t)0x1000000000000000)
   #   else
   #     define ALIGNMENT 4
   #     define CPP_WORDSZ 32
   #     define STACKBOTTOM ((ptr_t)((ulong)&errno))
   #   endif
    /* From AIX linker man page:
    _text Specifies the first location of the program.
    _etext Specifies the first location after the program.
    _data Specifies the first location of the data.
    _edata Specifies the first location after the initialized data
    _end or end Specifies the first location after all data.
    */
       extern int _data[], _end[];
   #   define DATASTART ((ptr_t)((ulong)_data))
   #   define DATAEND ((ptr_t)((ulong)_end))
     extern int errno;      extern int errno;
 #   define STACKBOTTOM ((ptr_t)((ulong)&errno))  #   define USE_GENERIC_PUSH_REGS
 #   define DYNAMIC_LOADING  #   define DYNAMIC_LOADING
         /* For really old versions of AIX, this may have to be removed. */          /* For really old versions of AIX, this may have to be removed. */
 # endif  # endif
   
 # ifdef HP_PA  # ifdef HP_PA
 #   define MACH_TYPE "HP_PA"  #   define MACH_TYPE "HP_PA"
 #   define OS_TYPE "HPUX"  
 #   ifdef __LP64__  #   ifdef __LP64__
 #     define CPP_WORDSZ 64  #     define CPP_WORDSZ 64
 #     define ALIGNMENT 8  #     define ALIGNMENT 8
Line 1145 
Line 1378 
 #     define ALIGNMENT 4  #     define ALIGNMENT 4
 #     define ALIGN_DOUBLE  #     define ALIGN_DOUBLE
 #   endif  #   endif
 #   if !defined(GC_HPUX_THREADS) && !defined(HPUX_THREADS) \  #   if !defined(GC_HPUX_THREADS) && !defined(GC_LINUX_THREADS)
        && !defined(GC_LINUX_THREADS) && !defined(LINUX_THREADS)  
 #     ifndef LINUX /* For now. */  #     ifndef LINUX /* For now. */
 #       define MPROTECT_VDB  #       define MPROTECT_VDB
 #     endif  #     endif
Line 1161 
Line 1393 
 #   endif  #   endif
 #   define STACK_GROWS_UP  #   define STACK_GROWS_UP
 #   ifdef HPUX  #   ifdef HPUX
       extern int __data_start;  #     define OS_TYPE "HPUX"
 #     define DATASTART ((ptr_t)(&__data_start))        extern int __data_start[];
   #     define DATASTART ((ptr_t)(__data_start))
 #     if 0  #     if 0
         /* The following appears to work for 7xx systems running HP/UX  */          /* The following appears to work for 7xx systems running HP/UX  */
         /* 9.xx Furthermore, it might result in much faster             */          /* 9.xx Furthermore, it might result in much faster             */
Line 1193 
Line 1426 
 #     define OS_TYPE "LINUX"  #     define OS_TYPE "LINUX"
 #     define LINUX_STACKBOTTOM  #     define LINUX_STACKBOTTOM
 #     define DYNAMIC_LOADING  #     define DYNAMIC_LOADING
 #     define LINUX_DATA_START  #     define SEARCH_FOR_DATA_START
       extern int _end;        extern int _end[];
 #     define DATAEND (&_end)  #     define DATAEND (&_end)
 #   endif /* LINUX */  #   endif /* LINUX */
 # endif /* HP_PA */  # endif /* HP_PA */
Line 1202 
Line 1435 
 # ifdef ALPHA  # ifdef ALPHA
 #   define MACH_TYPE "ALPHA"  #   define MACH_TYPE "ALPHA"
 #   define ALIGNMENT 8  #   define ALIGNMENT 8
 #   define USE_GENERIC_PUSH_REGS  #   define CPP_WORDSZ 64
     /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */  #   ifndef LINUX
     /* fp registers in some cases when the target is a 21264.  The assembly */  #     define USE_GENERIC_PUSH_REGS
     /* code doesn't handle that yet, and version dependencies make that a   */        /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */
     /* bit tricky.  Do the easy thing for now.                              */        /* fp registers in some cases when the target is a 21264.  The assembly */
         /* code doesn't handle that yet, and version dependencies make that a   */
         /* bit tricky.  Do the easy thing for now.                                    */
   #   endif
 #   ifdef NETBSD  #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"  #       define OS_TYPE "NETBSD"
 #       define HEURISTIC2  #       define HEURISTIC2
Line 1214 
Line 1450 
 #       define ELFCLASS32 32  #       define ELFCLASS32 32
 #       define ELFCLASS64 64  #       define ELFCLASS64 64
 #       define ELF_CLASS ELFCLASS64  #       define ELF_CLASS ELFCLASS64
 #       define CPP_WORDSZ 64  
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #   endif  #   endif
   #   ifdef OPENBSD
   #       define OS_TYPE "OPENBSD"
   #       define HEURISTIC2
   #       ifdef __ELF__   /* since OpenBSD/Alpha 2.9 */
   #          define DATASTART GC_data_start
   #          define ELFCLASS32 32
   #          define ELFCLASS64 64
   #          define ELF_CLASS ELFCLASS64
   #       else            /* ECOFF, until OpenBSD/Alpha 2.7 */
   #          define DATASTART ((ptr_t) 0x140000000)
   #       endif
   #   endif
   #   ifdef FREEBSD
   #       define OS_TYPE "FREEBSD"
   /* MPROTECT_VDB is not yet supported at all on FreeBSD/alpha. */
   #       define SIG_SUSPEND SIGUSR1
   #       define SIG_THR_RESTART SIGUSR2
   #       define FREEBSD_STACKBOTTOM
   #       ifdef __ELF__
   #           define DYNAMIC_LOADING
   #       endif
   /* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
           extern char etext[];
           extern char edata[];
           extern char end[];
   #       define NEED_FIND_LIMIT
   #       define DATASTART ((ptr_t)(&etext))
   #       define DATAEND (GC_find_limit (DATASTART, TRUE))
   #       define DATASTART2 ((ptr_t)(&edata))
   #       define DATAEND2 ((ptr_t)(&end))
   #   endif
 #   ifdef OSF1  #   ifdef OSF1
 #       define OS_TYPE "OSF1"  #       define OS_TYPE "OSF1"
 #       define DATASTART ((ptr_t) 0x140000000)  #       define DATASTART ((ptr_t) 0x140000000)
         extern int _end;          extern int _end[];
 #       define DATAEND ((ptr_t) &_end)  #       define DATAEND ((ptr_t) &_end)
         extern char ** environ;          extern char ** environ;
         /* round up from the value of environ to the nearest page boundary */          /* round up from the value of environ to the nearest page boundary */
Line 1232 
Line 1498 
         /* the text segment immediately follows the stack.              */          /* the text segment immediately follows the stack.              */
         /* Hence we give an upper pound.                                */          /* Hence we give an upper pound.                                */
         /* This is currently unused, since we disabled HEURISTIC2       */          /* This is currently unused, since we disabled HEURISTIC2       */
         extern int __start;          extern int __start[];
 #       define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1)))  #       define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1)))
 #       define CPP_WORDSZ 64  #       ifndef GC_OSF1_THREADS
 #       define MPROTECT_VDB            /* Unresolved signal issues with threads.     */
   #         define MPROTECT_VDB
   #       endif
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define CPP_WORDSZ 64  
 #       define STACKBOTTOM ((ptr_t) 0x120000000)  #       define STACKBOTTOM ((ptr_t) 0x120000000)
 #       ifdef __ELF__  #       ifdef __ELF__
 #         define SEARCH_FOR_DATA_START  #         define SEARCH_FOR_DATA_START
 #         define DATASTART GC_data_start  
 #         define DYNAMIC_LOADING  #         define DYNAMIC_LOADING
 #       else  #       else
 #           define DATASTART ((ptr_t) 0x140000000)  #           define DATASTART ((ptr_t) 0x140000000)
 #       endif  #       endif
         extern int _end;          extern int _end[];
 #       define DATAEND (&_end)  #       define DATAEND (_end)
 #       define MPROTECT_VDB  #       define MPROTECT_VDB
                 /* Has only been superficially tested.  May not */                  /* Has only been superficially tested.  May not */
                 /* work on all versions.                        */                  /* work on all versions.                        */
Line 1259 
Line 1525 
   
 # ifdef IA64  # ifdef IA64
 #   define MACH_TYPE "IA64"  #   define MACH_TYPE "IA64"
 #   define ALIGN_DOUBLE  
         /* Requires 16 byte alignment for malloc */  
 #   define ALIGNMENT 8  
 #   define USE_GENERIC_PUSH_REGS  #   define USE_GENERIC_PUSH_REGS
         /* We need to get preserved registers in addition to register   */          /* We need to get preserved registers in addition to register   */
         /* windows.   That's easiest to do with setjmp.                 */          /* windows.   That's easiest to do with setjmp.                 */
Line 1271 
Line 1534 
             /* setting mark bits.                                       */              /* setting mark bits.                                       */
 #   endif  #   endif
 #   ifdef HPUX  #   ifdef HPUX
         --> needs work  #       ifdef _ILP32
   #         define CPP_WORDSZ 32
   #         define ALIGN_DOUBLE
               /* Requires 8 byte alignment for malloc */
   #         define ALIGNMENT 4
   #       else
   #         ifndef _LP64
                   ---> unknown ABI
   #         endif
   #         define CPP_WORDSZ 64
   #         define ALIGN_DOUBLE
               /* Requires 16 byte alignment for malloc */
   #         define ALIGNMENT 8
   #       endif
   #       define OS_TYPE "HPUX"
           extern int __data_start[];
   #       define DATASTART ((ptr_t)(__data_start))
           /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2       */
           /* to this.  Note that the GC must be initialized before the    */
           /* first putenv call.                                           */
           extern char ** environ;
   #       define STACKBOTTOM ((ptr_t)environ)
   #       define DYNAMIC_LOADING
   #       include <unistd.h>
   #       define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
           /* The following was empirically determined, and is probably    */
           /* not very robust.                                             */
           /* Note that the backing store base seems to be at a nice       */
           /* address minus one page.                                      */
   #       define BACKING_STORE_DISPLACEMENT 0x1000000
   #       define BACKING_STORE_ALIGNMENT 0x1000
   #       define BACKING_STORE_BASE \
             (ptr_t)(((word)GC_stackbottom - BACKING_STORE_DISPLACEMENT - 1) \
                           & ~(BACKING_STORE_ALIGNMENT - 1))
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
   #       define CPP_WORDSZ 64
   #       define ALIGN_DOUBLE
             /* Requires 16 byte alignment for malloc */
   #       define ALIGNMENT 8
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define CPP_WORDSZ 64  
         /* The following works on NUE and older kernels:        */          /* The following works on NUE and older kernels:        */
 /* #       define STACKBOTTOM ((ptr_t) 0xa000000000000000l)     */  /* #       define STACKBOTTOM ((ptr_t) 0xa000000000000000l)     */
         /* This does not work on NUE:                           */          /* This does not work on NUE:                           */
Line 1289 
Line 1588 
         extern char * GC_register_stackbottom;          extern char * GC_register_stackbottom;
 #       define BACKING_STORE_BASE ((ptr_t)GC_register_stackbottom)  #       define BACKING_STORE_BASE ((ptr_t)GC_register_stackbottom)
 #       define SEARCH_FOR_DATA_START  #       define SEARCH_FOR_DATA_START
 #       define DATASTART GC_data_start  #       ifdef __GNUC__
 #       define DYNAMIC_LOADING  #         define DYNAMIC_LOADING
   #       else
             /* In the Intel compiler environment, we seem to end up with  */
             /* statically linked executables and an undefined reference   */
             /* to _DYNAMIC                                                */
   #       endif
 #       define MPROTECT_VDB  #       define MPROTECT_VDB
                 /* Requires Linux 2.3.47 or later.      */                  /* Requires Linux 2.3.47 or later.      */
         extern int _end;          extern int _end[];
 #       define DATAEND (&_end)  #       define DATAEND (_end)
 #       ifdef __GNUC__  #       ifdef __GNUC__
 #         define PREFETCH(x) \  #         define PREFETCH(x) \
             __asm__ ("  lfetch  [%0]": : "r"((void *)(x)))              __asm__ ("  lfetch  [%0]": : "r"((void *)(x)))
Line 1310 
Line 1614 
 #   define MACH_TYPE "M88K"  #   define MACH_TYPE "M88K"
 #   define ALIGNMENT 4  #   define ALIGNMENT 4
 #   define ALIGN_DOUBLE  #   define ALIGN_DOUBLE
     extern int etext;      extern int etext[];
 #   ifdef CX_UX  #   ifdef CX_UX
 #       define OS_TYPE "CX_UX"  #       define OS_TYPE "CX_UX"
 #       define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000)  #       define DATASTART ((((word)etext + 0x3fffff) & ~0x3fffff) + 0x10000)
 #   endif  #   endif
 #   ifdef  DGUX  #   ifdef  DGUX
 #       define OS_TYPE "DGUX"  #       define OS_TYPE "DGUX"
         extern char * GC_SysVGetDataStart();          extern ptr_t GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)  #       define DATASTART GC_SysVGetDataStart(0x10000, etext)
 #   endif  #   endif
 #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */  #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
 # endif  # endif
   
 # ifdef S370  # ifdef S370
       /* If this still works, and if anyone cares, this should probably   */
       /* be moved to the S390 category.                                   */
 #   define MACH_TYPE "S370"  #   define MACH_TYPE "S370"
 #   define ALIGNMENT 4  /* Required by hardware */  #   define ALIGNMENT 4  /* Required by hardware */
 #   define USE_GENERIC_PUSH_REGS  #   define USE_GENERIC_PUSH_REGS
 #   ifdef UTS4  #   ifdef UTS4
 #       define OS_TYPE "UTS4"  #       define OS_TYPE "UTS4"
         extern int etext;          extern int etext[];
         extern int _etext;          extern int _etext[];
         extern int _end;          extern int _end[];
         extern char * GC_SysVGetDataStart();          extern ptr_t GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)  #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
 #       define DATAEND (&_end)  #       define DATAEND (_end)
 #       define HEURISTIC2  #       define HEURISTIC2
 #   endif  #   endif
   # endif
   
   # ifdef S390
   #   define MACH_TYPE "S390"
   #   define USE_GENERIC_PUSH_REGS
   #   ifndef __s390x__
   #   define ALIGNMENT 4
   #   define CPP_WORDSZ 32
   #   else
   #   define ALIGNMENT 8
   #   define CPP_WORDSZ 64
   #   define HBLKSIZE 4096
   #   endif
 #   ifdef LINUX  #   ifdef LINUX
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define HEURISTIC1  #       define LINUX_STACKBOTTOM
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
         extern int __data_start;          extern int __data_start[];
 #       define DATASTART ((ptr_t)(&__data_start))  #       define DATASTART ((ptr_t)(__data_start))
       extern int _end[];
   #   define DATAEND (_end)
   #   define CACHE_LINE_SIZE 256
   #   define GETPAGESIZE() 4096
 #   endif  #   endif
 # endif  # endif
   
 # if defined(PJ)  # if defined(PJ)
 #   define ALIGNMENT 4  #   define ALIGNMENT 4
     extern int _etext;      extern int _etext[];
 #   define DATASTART ((ptr_t)(&_etext))  #   define DATASTART ((ptr_t)(_etext))
 #   define HEURISTIC1  #   define HEURISTIC1
 # endif  # endif
   
Line 1360 
Line 1683 
 #   ifdef NETBSD  #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"  #       define OS_TYPE "NETBSD"
 #       define HEURISTIC2  #       define HEURISTIC2
         extern char etext;          extern char etext[];
 #       define DATASTART ((ptr_t)(&etext))  #       define DATASTART ((ptr_t)(etext))
 #       define USE_GENERIC_PUSH_REGS  #       define USE_GENERIC_PUSH_REGS
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
Line 1374 
Line 1697 
 #            define DYNAMIC_LOADING  #            define DYNAMIC_LOADING
 #            include <features.h>  #            include <features.h>
 #            if defined(__GLIBC__) && __GLIBC__ >= 2  #            if defined(__GLIBC__) && __GLIBC__ >= 2
 #                define LINUX_DATA_START  #                define SEARCH_FOR_DATA_START
 #            else  #            else
                  extern char **__environ;                   extern char **__environ;
 #                define DATASTART ((ptr_t)(&__environ))  #                define DATASTART ((ptr_t)(&__environ))
Line 1387 
Line 1710 
                               /* contain large read-only data tables    */                                /* contain large read-only data tables    */
                               /* that we'd rather not scan.             */                                /* that we'd rather not scan.             */
 #            endif  #            endif
              extern int _end;               extern int _end[];
 #            define DATAEND (&_end)  #            define DATAEND (_end)
 #       else  #       else
              extern int etext;               extern int etext[];
 #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))  #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 #       endif  #       endif
 #   endif  #   endif
 #   ifdef MSWINCE  #   ifdef MSWINCE
 #     define OS_TYPE "MSWINCE"  #     define OS_TYPE "MSWINCE"
 #     define DATAEND /* not needed */  #     define DATAEND /* not needed */
 #   endif  #   endif
   #   ifdef NOSYS
         /* __data_start is usually defined in the target linker script.  */
         extern int __data_start[];
   #     define DATASTART (ptr_t)(__data_start)
   #     define USE_GENERIC_PUSH_REGS
         /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S  */
         extern void *__stack_base__;
   #     define STACKBOTTOM ((ptr_t) (__stack_base__))
   #   endif
 #endif  #endif
   
 # ifdef SH  # ifdef SH
Line 1412 
Line 1744 
 #     define STACKBOTTOM ((ptr_t) 0x7c000000)  #     define STACKBOTTOM ((ptr_t) 0x7c000000)
 #     define USE_GENERIC_PUSH_REGS  #     define USE_GENERIC_PUSH_REGS
 #     define DYNAMIC_LOADING  #     define DYNAMIC_LOADING
 #     define LINUX_DATA_START  #     define SEARCH_FOR_DATA_START
       extern int _end;        extern int _end[];
 #     define DATAEND (&_end)  #     define DATAEND (_end)
 #   endif  #   endif
 # endif  # endif
   
Line 1425 
Line 1757 
 #   define DATAEND /* not needed */  #   define DATAEND /* not needed */
 # endif  # endif
   
 #ifdef LINUX_DATA_START  # ifdef X86_64
     /* Some Linux distributions arrange to define __data_start.  Some   */  #   define MACH_TYPE "X86_64"
     /* define data_start as a weak symbol.  The latter is technically   */  #   define ALIGNMENT 8
     /* broken, since the user program may define data_start, in which   */  #   define CPP_WORDSZ 64
     /* case we lose.  Nonetheless, we try both, prefering __data_start. */  #   ifndef HBLKSIZE
     /* We assume gcc.   */  #     define HBLKSIZE 4096
 #   pragma weak __data_start  #   endif
     extern int __data_start;  #   define CACHE_LINE_SIZE 64
 #   pragma weak data_start  #   define USE_GENERIC_PUSH_REGS
     extern int data_start;  #   ifdef LINUX
 #   define DATASTART ((ptr_t)(&__data_start != 0? &__data_start : &data_start))  #       define OS_TYPE "LINUX"
 #endif  #       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 SEARCH_FOR_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
   
 #if defined(LINUX) && defined(REDIRECT_MALLOC)  #if defined(LINUX) && defined(REDIRECT_MALLOC)
     /* Rld appears to allocate some memory with its own allocator, and  */      /* Rld appears to allocate some memory with its own allocator, and  */
Line 1459 
Line 1818 
 # endif  # endif
   
 # ifndef DATAEND  # ifndef DATAEND
     extern int end;      extern int end[];
 #   define DATAEND (&end)  #   define DATAEND (end)
 # endif  # endif
   
 # if defined(SVR4) && !defined(GETPAGESIZE)  # if defined(SVR4) && !defined(GETPAGESIZE)
Line 1476 
Line 1835 
 # endif  # endif
   
 # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)  # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)
     /* OS has SVR4 generic features.  Probably others also qualify.     */              /* OS has SVR4 generic features.  Probably others also qualify.     */
 #   define SVR4  #   define SVR4
 # endif  # endif
   
 # if defined(SUNOS5) || defined(DRSNX)  # if defined(SUNOS5) || defined(DRSNX)
     /* OS has SUNOS5 style semi-undocumented interface to dynamic       */              /* OS has SUNOS5 style semi-undocumented interface to dynamic       */
     /* loader.                                                          */              /* loader.                                                          */
 #   define SUNOS5DL  #   define SUNOS5DL
     /* OS has SUNOS5 style signal handlers.                             */              /* OS has SUNOS5 style signal handlers.                             */
 #   define SUNOS5SIGS  #   define SUNOS5SIGS
 # endif  # endif
   
Line 1493 
Line 1852 
 # endif  # endif
   
 # if defined(SVR4) || defined(LINUX) || defined(IRIX) || defined(HPUX) \  # if defined(SVR4) || defined(LINUX) || defined(IRIX) || defined(HPUX) \
     || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \              || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \
     || defined(BSD) || defined(AIX) || defined(MACOSX) || defined(OSF1)              || defined(DGUX) || defined(BSD) \
               || defined(_AIX) || defined(DARWIN) || defined(OSF1)
 #   define UNIX_LIKE   /* Basic Unix-like system calls work.    */  #   define UNIX_LIKE   /* Basic Unix-like system calls work.    */
 # endif  # endif
   
 # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64  # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
    -> bad word size             -> bad word size
 # endif  # endif
   
 # ifdef PCR  # ifdef PCR
Line 1513 
Line 1873 
 # endif  # endif
   
 # ifdef SRC_M3  # ifdef SRC_M3
 /* Postponed for now. */          /* Postponed for now. */
 #   undef PROC_VDB  #   undef PROC_VDB
 #   undef MPROTECT_VDB  #   undef MPROTECT_VDB
 # endif  # endif
   
 # ifdef SMALL_CONFIG  # ifdef SMALL_CONFIG
 /* Presumably not worth the space it takes. */          /* Presumably not worth the space it takes. */
 #   undef PROC_VDB  #   undef PROC_VDB
 #   undef MPROTECT_VDB  #   undef MPROTECT_VDB
 # endif  # endif
Line 1550 
Line 1910 
 #   define CACHE_LINE_SIZE 32   /* Wild guess   */  #   define CACHE_LINE_SIZE 32   /* Wild guess   */
 # endif  # endif
   
   # ifdef LINUX
   #   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  */
       /* call GC_register_dynamic_libraries before stopping the world.    */
       /* For performance reasons, this may be beneficial on other         */
       /* platforms as well, though it should be avoided in win32.         */
   # endif /* LINUX */
   
   # if defined(SEARCH_FOR_DATA_START)
       extern ptr_t GC_data_start;
   #   define DATASTART GC_data_start
   # endif
   
 # ifndef CLEAR_DOUBLE  # ifndef CLEAR_DOUBLE
 #   define CLEAR_DOUBLE(x) \  #   define CLEAR_DOUBLE(x) \
         ((word*)x)[0] = 0; \                  ((word*)x)[0] = 0; \
         ((word*)x)[1] = 0;                  ((word*)x)[1] = 0;
 # endif /* CLEAR_DOUBLE */  # endif /* CLEAR_DOUBLE */
   
 /* Internally to the collector we test only the XXX_THREADS macros      */          /* Internally we use GC_SOLARIS_THREADS to test for either old or pthreads. */
 /* not the GC_XXX_THREADS versions.  Here we make sure the latter       */  # if defined(GC_SOLARIS_PTHREADS) && !defined(GC_SOLARIS_THREADS)
 /* are treated as equivalent.                                           */  #   define GC_SOLARIS_THREADS
 #if defined(GC_SOLARIS_THREADS) && !defined(_SOLARIS_THREADS)  # endif
 #   define _SOLARIS_THREADS  
 #endif  
 #if defined(GC_SOLARIS_THREADS) && !defined(_SOLARIS_PTHREADS)  
 #   define _SOLARIS_PTHREADS  
 #endif  
 #if defined(GC_IRIX_THREADS) && !defined(IRIX_THREADS)  
 #   define IRIX_THREADS  
 #endif  
 #if defined(GC_LINUX_THREADS) && !defined(LINUX_THREADS)  
 #   define LINUX_THREADS  
 #endif  
 #if defined(GC_WIN32_THREADS) && !defined(WIN32_THREADS)  
 #   define WIN32_THREADS  
 #endif  
 #if defined(GC_HPUX_THREADS) && !defined(HPUX_THREADS)  
 #   define HPUX_THREADS  
 #endif  
 #if defined(GC_OSF1_THREADS) && !defined(OSF1_THREADS)  
 #   define OSF1_THREADS  
 #endif  
   
 /* Internally we use SOLARIS_THREADS to test for either old or pthreads. */  # if defined(GC_IRIX_THREADS) && !defined(IRIX5)
 # if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS)          --> inconsistent configuration
 #   define SOLARIS_THREADS  
 # endif  # endif
 # if defined(IRIX_THREADS) && !defined(IRIX5)  # if defined(GC_LINUX_THREADS) && !defined(LINUX)
 --> inconsistent configuration          --> inconsistent configuration
 # endif  # endif
 # if defined(LINUX_THREADS) && !defined(LINUX)  # if defined(GC_SOLARIS_THREADS) && !defined(SUNOS5)
 --> inconsistent configuration          --> inconsistent configuration
 # endif  # endif
 # if defined(SOLARIS_THREADS) && !defined(SUNOS5)  # if defined(GC_HPUX_THREADS) && !defined(HPUX)
 --> inconsistent configuration          --> inconsistent configuration
 # endif  # endif
 # if defined(HPUX_THREADS) && !defined(HPUX)  # if defined(GC_AIX_THREADS) && !defined(_AIX)
 --> inconsistent configuration          --> inconsistent configuration
 # endif  # endif
   # if defined(GC_WIN32_THREADS) && !defined(MSWIN32) && !defined(CYGWIN32)
           --> inconsistent configuration
   # endif
   
 # if defined(PCR) || defined(SRC_M3) || \  # if defined(PCR) || defined(SRC_M3) || \
         defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \                  defined(GC_SOLARIS_THREADS) || defined(GC_WIN32_THREADS) || \
         defined(IRIX_THREADS) || defined(LINUX_THREADS) || \                  defined(GC_PTHREADS)
         defined(HPUX_THREADS) || defined(OSF1_THREADS)  
 #   define THREADS  #   define THREADS
 # endif  # endif
   
 # if defined(HP_PA) || defined(M88K) || defined(POWERPC) && !defined(MACOSX) \  # if defined(HP_PA) || defined(M88K) || defined(POWERPC) && !defined(DARWIN) \
      || defined(LINT) || defined(MSWINCE) \               || defined(LINT) || defined(MSWINCE) || defined(ARM32) \
      || (defined(I386) && defined(__LCC__))               || (defined(I386) && defined(__LCC__))
         /* Use setjmp based hack to mark from callee-save registers.    */          /* Use setjmp based hack to mark from callee-save registers.    */
         /* The define should move to the individual platform            */          /* The define should move to the individual platform            */
         /* descriptions.                                                */          /* descriptions.                                                */
 #       define USE_GENERIC_PUSH_REGS  #       define USE_GENERIC_PUSH_REGS
 # endif  # endif
 # if defined(I386) && 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.    */  
 # ifdef SAVE_CALL_COUNT  
 #   define SAVE_CALL_CHAIN  
 # endif  
 # endif  
 # if defined(SPARC)  # if defined(SPARC)
 #   define SAVE_CALL_CHAIN  
 #   define ASM_CLEAR_CODE       /* Stack clearing is crucial, and we    */  #   define ASM_CLEAR_CODE       /* Stack clearing is crucial, and we    */
                                 /* include assembly code to do it well. */                                  /* include assembly code to do it well. */
 # endif  # endif
   
     /* Can we save call chain in objects for debugging?                   */
     /* SET NFRAMES (# of saved frames) and NARGS (#of args for each       */
     /* frame) to reasonable values for the platform.                      */
     /* Set SAVE_CALL_CHAIN if we can.  SAVE_CALL_COUNT can be specified   */
     /* at build time, though we feel free to adjust it slightly.          */
     /* Define NEED_CALLINFO if we either save the call stack or           */
     /* GC_ADD_CALLER is defined.                                          */
     /* GC_CAN_SAVE_CALL_STACKS is set in gc.h.                            */
   
   #if defined(SPARC)
   # define CAN_SAVE_CALL_ARGS
   #endif
   #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_ARGS
   #endif
   
   # if defined(SAVE_CALL_COUNT) && !defined(GC_ADD_CALLER) \
                && defined(GC_CAN_SAVE_CALL_STACKS)
   #   define SAVE_CALL_CHAIN
   # endif
   # ifdef SAVE_CALL_CHAIN
   #   if defined(SAVE_CALL_NARGS) && defined(CAN_SAVE_CALL_ARGS)
   #     define NARGS SAVE_CALL_NARGS
   #   else
   #     define NARGS 0    /* Number of arguments to save for each call.   */
   #   endif
   # endif
   # ifdef SAVE_CALL_CHAIN
   #   ifndef SAVE_CALL_COUNT
   #     define NFRAMES 6  /* Number of frames to save. Even for           */
                                   /* alignment reasons.                           */
   #   else
   #     define NFRAMES ((SAVE_CALL_COUNT + 1) & ~1)
   #   endif
   #   define NEED_CALLINFO
   # endif /* SAVE_CALL_CHAIN */
   # ifdef GC_ADD_CALLER
   #   define NFRAMES 1
   #   define NARGS 0
   #   define NEED_CALLINFO
   # endif
   
   # if defined(MAKE_BACK_GRAPH) && !defined(DBG_HDRS_ALL)
   #   define DBG_HDRS_ALL
   # endif
   
   # if defined(POINTER_MASK) && !defined(POINTER_SHIFT)
   #   define POINTER_SHIFT 0
   # endif
   
   # if defined(POINTER_SHIFT) && !defined(POINTER_MASK)
   #   define POINTER_MASK ((GC_word)(-1))
   # endif
   
   # if !defined(FIXUP_POINTER) && defined(POINTER_MASK)
   #   define FIXUP_POINTER(p) (p) = ((p) & (POINTER_MASK) << POINTER_SHIFT)
   # endif
   
   # if defined(FIXUP_POINTER)
   #   define NEED_FIXUP_POINTER 1
   # else
   #   define NEED_FIXUP_POINTER 0
   #   define FIXUP_POINTER(p)
   # endif
   
   #ifdef GC_PRIVATE_H
           /* This relies on some type definitions from gc_priv.h, from    */
           /* where it's normally included.                                */
           /*                                                              */
           /* How to get heap memory from the OS:                          */
           /* Note that sbrk()-like allocation is preferred, since it      */
           /* usually makes it possible to merge consecutively allocated   */
           /* chunks.  It also avoids unintented recursion with            */
           /* -DREDIRECT_MALLOC.                                           */
           /* GET_MEM() returns a HLKSIZE aligned chunk.                   */
           /* 0 is taken to mean failure.                                  */
           /* In the case os USE_MMAP, the argument must also be a         */
           /* physical page size.                                          */
           /* GET_MEM is currently not assumed to retrieve 0 filled space, */
           /* though we should perhaps take advantage of the case in which */
           /* does.                                                        */
           struct hblk;    /* See gc_priv.h.       */
   # ifdef PCR
               char * real_malloc();
   #   define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \
                                             + GC_page_size-1)
   # else
   #   ifdef OS2
                 void * os2_alloc(size_t bytes);
   #     define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc((size_t)bytes \
                                               + GC_page_size) \
                                               + GC_page_size-1)
   #   else
   #     if defined(NEXT) || defined(DOS4GW) || \
                    (defined(AMIGA) && !defined(GC_AMIGA_FASTALLOC)) || \
                    (defined(SUNOS5) && !defined(USE_MMAP))
   #       define GET_MEM(bytes) HBLKPTR((size_t) \
                                                 calloc(1, (size_t)bytes + GC_page_size) \
                                                 + GC_page_size-1)
   #     else
   #       ifdef MSWIN32
             extern ptr_t GC_win32_get_mem();
   #         define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
   #       else
   #         ifdef MACOS
   #           if defined(USE_TEMPORARY_MEMORY)
                           extern Ptr GC_MacTemporaryNewPtr(size_t size,
                                                            Boolean clearMemory);
   #               define GET_MEM(bytes) HBLKPTR( \
                               GC_MacTemporaryNewPtr(bytes + GC_page_size, true) \
                               + GC_page_size-1)
   #           else
   #                   define GET_MEM(bytes) HBLKPTR( \
                                   NewPtrClear(bytes + GC_page_size) + GC_page_size-1)
   #           endif
   #         else
   #           ifdef MSWINCE
                 extern ptr_t GC_wince_get_mem();
   #             define GET_MEM(bytes) (struct hblk *)GC_wince_get_mem(bytes)
   #           else
   #             if defined(AMIGA) && defined(GC_AMIGA_FASTALLOC)
                           extern void *GC_amiga_get_mem(size_t size);
                           define GET_MEM(bytes) HBLKPTR((size_t) \
                             GC_amiga_get_mem((size_t)bytes + GC_page_size) \
                             + GC_page_size-1)
   #             else
                   extern ptr_t GC_unix_get_mem();
   #               define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
   #             endif
   #           endif
   #         endif
   #       endif
   #     endif
   #   endif
   # endif
   
   #endif /* GC_PRIVATE_H */
   
 # endif /* GCCONFIG_H */  # endif /* GCCONFIG_H */

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.11

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>