[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.5 and 1.6

version 1.5, 2002/07/24 07:46:37 version 1.6, 2002/07/24 08:00:20
Line 33 
Line 33 
 #    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 61 
 #    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 90 
 #    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 112 
 #    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 186 
 #   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 174 
Line 204 
 #    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__))
 #    define POWERPC  #    define POWERPC
 #    define mach_type_known  #    define mach_type_known
 # endif  # endif
Line 196 
Line 230 
 # 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 247 
 #   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
Line 244 
Line 278 
 #   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 301 
 #   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 350 
Line 383 
 #    define S370  #    define S370
 #    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 419 
                     /*             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 390 
Line 431 
                     /*                  running Amdahl UTS4             */                      /*                  running Amdahl UTS4             */
                     /*                  or a 390 running LINUX          */                      /*                  or a 390 running LINUX          */
                     /*             ARM32      ==> Intel StrongARM       */                      /*             ARM32      ==> Intel StrongARM       */
                     /*             IA64       ==> Intel IA64            */                      /*             IA64       ==> Intel IPF             */
                     /*                            (e.g. Itanium)        */                      /*                            (e.g. Itanium)        */
                       /*                  (LINUX and HPUX)                */
                       /*             IA64_32    ==> IA64 w/32 bit ABI     */
                       /*                  (HPUX)                          */
                     /*             SH         ==> Hitachi SuperH        */                      /*             SH         ==> Hitachi SuperH        */
                     /*                  (LINUX & MSWINCE)               */                      /*                  (LINUX & MSWINCE)               */
   
Line 414 
Line 458 
  * 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 480 
  * 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 551 
  * 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 572 
 #   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>
Line 535 
Line 602 
                              /* 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 627 
 #   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 626 
Line 693 
 #     define STACK_GRAN 0x10000000  #     define STACK_GRAN 0x10000000
         /* Stack usually starts at 0x80000000 */          /* Stack usually starts at 0x80000000 */
 #     define LINUX_DATA_START  #     define LINUX_DATA_START
       extern int _end;        extern int _end[];
 #     define DATAEND (&_end)  #     define DATAEND (_end)
 #   endif  #   endif
 #   ifdef MACOSX  #   ifdef MACOSX
       /* There are reasons to suspect this may not be reliable.         */        /* There are reasons to suspect this may not be reliable.         */
Line 644 
Line 711 
 #     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 731 
 # 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 755 
 #   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 char * GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)  #       define DATASTART (ptr_t)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 792 
           /* 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 804 
 #       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 820 
 #       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 char * GC_SysVGetDataStart();
         extern int etext;          extern int etext[];
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)  #       define DATASTART (ptr_t)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 835 
 #     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
 #     ifdef __arch64__  #     ifdef __arch64__
   #       define DATASTART (ptr_t)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 (ptr_t)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 861 
 #       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 877 
 #     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 char * 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  #       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 927 
 #   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 char * 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 USE_MMAP  
 #       define LINUX_STACKBOTTOM  #       define LINUX_STACKBOTTOM
 #       if 0  #       if 0
 #         define HEURISTIC1  #         define HEURISTIC1
Line 875 
Line 979 
           /* 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
Line 903 
Line 1010 
                               /* 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 932 
Line 1039 
 #   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 946 
Line 1053 
         /* minumum/maximum of the two.                  */          /* minumum/maximum of the two.                  */
 #       define MAX(x,y) ((x) > (y) ? (x) : (y))  #       define MAX(x,y) ((x) > (y) ? (x) : (y))
 #       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__))  #       define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
 #       define DATAEND   ((ptr_t) MAX(&_data_end__, &_bss_end__))  #       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 976 
Line 1083 
 #   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 990 
Line 1097 
 #   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[];
   #       define DATASTART ((ptr_t)(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 1002 
Line 1121 
 #   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 1029 
Line 1148 
 #     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 1045 
Line 1175 
   
 # 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  #     define LINUX_STACKBOTTOM
         /* In many cases, this should probably use LINUX_STACKBOTTOM    */  
         /* instead. But some kernel versions seem to give the wrong     */  
         /* value from /proc.                                            */  
 #   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 1075 
Line 1227 
 #   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 1112 
Line 1264 
 #     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 1127 
Line 1279 
   
 # ifdef RS6000  # ifdef RS6000
 #   define MACH_TYPE "RS6000"  #   define MACH_TYPE "RS6000"
 #   define ALIGNMENT 4  #   ifdef __64BIT__
 #   define DATASTART ((ptr_t)0x20000000)  #     define ALIGNMENT 8
   #     define CPP_WORDSZ 64
   #     define STACKBOTTOM 0x1000000000000000
   #   else
   #     define ALIGNMENT 4
   #     define CPP_WORDSZ 32
   #     define STACKBOTTOM ((ptr_t)((ulong)&errno))
   #   endif
       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 1146 
Line 1307 
 #     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 1162 
Line 1322 
 #   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 1194 
Line 1355 
 #     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 1203 
Line 1364 
 # ifdef ALPHA  # ifdef ALPHA
 #   define MACH_TYPE "ALPHA"  #   define MACH_TYPE "ALPHA"
 #   define ALIGNMENT 8  #   define ALIGNMENT 8
 #   define USE_GENERIC_PUSH_REGS  #   ifndef LINUX
     /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */  #     define USE_GENERIC_PUSH_REGS
     /* fp registers in some cases when the target is a 21264.  The assembly */        /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */
     /* code doesn't handle that yet, and version dependencies make that a   */        /* fp registers in some cases when the target is a 21264.  The assembly */
     /* bit tricky.  Do the easy thing for now.                              */        /* 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 1218 
Line 1381 
 #       define CPP_WORDSZ 64  #       define CPP_WORDSZ 64
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
 #   endif  #   endif
   #   ifdef OPENBSD
   #       define OS_TYPE "OPENBSD"
   #       define HEURISTIC2
   #       define CPP_WORDSZ 64
   #       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))
   #       define CPP_WORDSZ 64
   #   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 1233 
Line 1429 
         /* 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  #       define CPP_WORDSZ 64
 #       define MPROTECT_VDB  #       define MPROTECT_VDB
 #       define DYNAMIC_LOADING  #       define DYNAMIC_LOADING
Line 1245 
Line 1441 
 #       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 1260 
Line 1455 
   
 # 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 1272 
Line 1464 
             /* 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 1290 
Line 1518 
         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 1311 
Line 1544 
 #   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 char * GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)  #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, etext)
 #   endif  #   endif
 #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */  #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
 # endif  # endif
Line 1330 
Line 1563 
 #   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 char * GC_SysVGetDataStart();
 #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)  #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext)
 #       define DATAEND (&_end)  #       define DATAEND (_end)
 #       define HEURISTIC2  #       define HEURISTIC2
 #   endif  #   endif
 #   ifdef LINUX  #   ifdef LINUX
 #       define OS_TYPE "LINUX"  #       define OS_TYPE "LINUX"
 #       define HEURISTIC1  #       define HEURISTIC1
 #       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))
 #   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 1361 
Line 1594 
 #   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 1388 
Line 1621 
                               /* 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 1414 
Line 1656 
 #     define USE_GENERIC_PUSH_REGS  #     define USE_GENERIC_PUSH_REGS
 #     define DYNAMIC_LOADING  #     define DYNAMIC_LOADING
 #     define LINUX_DATA_START  #     define LINUX_DATA_START
       extern int _end;        extern int _end[];
 #     define DATAEND (&_end)  #     define DATAEND (_end)
 #   endif  #   endif
 # endif  # endif
   
Line 1433 
Line 1675 
     /* case we lose.  Nonetheless, we try both, prefering __data_start. */      /* case we lose.  Nonetheless, we try both, prefering __data_start. */
     /* We assume gcc.   */      /* We assume gcc.   */
 #   pragma weak __data_start  #   pragma weak __data_start
     extern int __data_start;      extern int __data_start[];
 #   pragma weak data_start  #   pragma weak data_start
     extern int data_start;      extern int data_start[];
 #   define DATASTART ((ptr_t)(&__data_start != 0? &__data_start : &data_start))  #   define DATASTART ((ptr_t)(__data_start != 0? __data_start : data_start))
 #endif  #endif
   
 #if defined(LINUX) && defined(REDIRECT_MALLOC)  #if defined(LINUX) && defined(REDIRECT_MALLOC)
Line 1460 
Line 1702 
 # 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 1477 
Line 1719 
 # 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 1494 
Line 1736 
 # 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(DGUX) \
     || defined(BSD) || defined(AIX) || defined(MACOSX) || defined(OSF1)              || defined(BSD) || defined(AIX) || defined(MACOSX) || 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 1514 
Line 1756 
 # 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 1551 
Line 1793 
 #   define CACHE_LINE_SIZE 32   /* Wild guess   */  #   define CACHE_LINE_SIZE 32   /* Wild guess   */
 # endif  # endif
   
   # 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_WIN32_THREADS) && !defined(MSWIN32)
 --> inconsistent configuration              /* Ideally CYGWIN32 should work, in addition to MSWIN32.  I suspect */
               /* the necessary code is mostly there, but nobody has actually made */
               /* sure the right combination of pieces is compiled in, etc.        */
           --> inconsistent configuration
 # endif  # 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(MACOSX) \
      || 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     */  # if defined(SPARC)
     /* frame pointers by default, i.e. no -fomit-frame-pointer flag.    */  #   define ASM_CLEAR_CODE       /* Stack clearing is crucial, and we    */
 # ifdef SAVE_CALL_COUNT                                          /* include assembly code to do it well. */
   # 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.                                            */
   #ifdef LINUX
   # include <features.h>
   # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2
   #   define HAVE_BUILTIN_BACKTRACE
   # endif
   #endif
   
   #if defined(SPARC)
   # define CAN_SAVE_CALL_STACKS
   # define CAN_SAVE_CALL_ARGS
   #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.    */
   # define CAN_SAVE_CALL_STACKS
   # define CAN_SAVE_CALL_ARGS
   #endif
   #if defined(HAVE_BUILTIN_BACKTRACE) && !defined(CAN_SAVE_CALL_STACKS)
   # define CAN_SAVE_CALL_STACKS
   #endif
   
   # if defined(SAVE_CALL_COUNT) && !defined(GC_ADD_CALLER) \
                && defined(CAN_SAVE_CALL_STACKS)
 #   define SAVE_CALL_CHAIN  #   define SAVE_CALL_CHAIN
 # endif  # 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  # endif
 # if defined(SPARC)  # ifdef SAVE_CALL_CHAIN
 #   define SAVE_CALL_CHAIN  #   ifndef SAVE_CALL_COUNT
 #   define ASM_CLEAR_CODE       /* Stack clearing is crucial, and we    */  #     define NFRAMES 6  /* Number of frames to save. Even for           */
                                 /* include assembly code to do it well. */                                  /* 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  # endif
   
   # if defined(MAKE_BACK_GRAPH) && !defined(DBG_HDRS_ALL)
   #   define DBG_HDRS_ALL
   # 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(MACOSX) || 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.5  
changed lines
  Added in v.1.6

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