PageRenderTime 64ms CodeModel.GetById 12ms app.highlight 34ms RepoModel.GetById 1ms app.codeStats 1ms

/libs/headers/gc/private/gcconfig.h

http://github.com/nddrylliog/ooc
C++ Header | 2059 lines | 1564 code | 47 blank | 448 comment | 275 complexity | 2a6a61c616fd00185f50c6008a551596 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

   1/* 
   2 * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
   3 * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
   4 * Copyright (c) 1996 by Silicon Graphics.  All rights reserved.
   5 * Copyright (c) 2000-2004 Hewlett-Packard Development Company, L.P.
   6 *
   7 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
   8 * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
   9 *
  10 * Permission is hereby granted to use or copy this program
  11 * for any purpose,  provided the above notices are retained on all copies.
  12 * Permission to modify the code and to distribute modified code is granted,
  13 * provided the above notices are retained, and a notice that the code was
  14 * modified is included with the above copyright notice.
  15 */
  16
  17/*
  18 * This header is private to the gc.  It is almost always included from
  19 * gc_priv.h.  However it is possible to include it by itself if just the
  20 * configuration macros are needed.  In that
  21 * case, a few declarations relying on types declared in gc_priv.h will be
  22 * omitted.
  23 */
  24 
  25#ifndef GCCONFIG_H
  26
  27# define GCCONFIG_H
  28
  29# ifndef GC_PRIVATE_H
  30    /* Fake ptr_t declaration, just to avoid compilation errors.	*/
  31    /* This avoids many instances if "ifndef GC_PRIVATE_H" below.	*/
  32    typedef struct GC_undefined_struct * ptr_t;
  33#   include <stddef.h>	/* For size_t etc. */
  34# endif
  35
  36/* Machine dependent parameters.  Some tuning parameters can be found	*/
  37/* near the top of gc_private.h.					*/
  38
  39/* Machine specific parts contributed by various people.  See README file. */
  40
  41/* First a unified test for Linux: */
  42# if defined(linux) || defined(__linux__)
  43#  ifndef LINUX
  44#    define LINUX
  45#  endif
  46# endif
  47
  48/* And one for NetBSD: */
  49# if defined(__NetBSD__)
  50#    define NETBSD
  51# endif
  52
  53/* And one for OpenBSD: */
  54# if defined(__OpenBSD__)
  55#    define OPENBSD
  56# endif
  57
  58/* And one for FreeBSD: */
  59# if (defined(__FreeBSD__) || defined(__DragonFly__) || \
  60      defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
  61#    define FREEBSD
  62# endif
  63
  64/* Determine the machine type: */
  65# if defined(__arm__) || defined(__thumb__)
  66#    define ARM32
  67#    if !defined(LINUX) && !defined(NETBSD)
  68#      define NOSYS
  69#      define mach_type_known
  70#    endif
  71# endif
  72# if defined(sun) && defined(mc68000)
  73#    error SUNOS4 no longer supported
  74# endif
  75# if defined(hp9000s300)
  76#    error M68K based HP machines no longer supported.
  77# endif
  78# if defined(OPENBSD) && defined(m68k)
  79#    define M68K
  80#    define mach_type_known
  81# endif
  82# if defined(OPENBSD) && defined(__sparc__)
  83#    define SPARC
  84#    define mach_type_known
  85# endif
  86# if defined(NETBSD) && (defined(m68k) || defined(__m68k__))
  87#    define M68K
  88#    define mach_type_known
  89# endif
  90# if defined(NETBSD) && defined(__powerpc__)
  91#    define POWERPC
  92#    define mach_type_known
  93# endif
  94# if defined(NETBSD) && (defined(__arm32__) || defined(__arm__))
  95#    define ARM32
  96#    define mach_type_known
  97# endif
  98# if defined(NETBSD) && defined(__sh__)
  99#    define SH
 100#    define mach_type_known
 101# endif
 102# if defined(vax)
 103#    define VAX
 104#    ifdef ultrix
 105#	define ULTRIX
 106#    else
 107#	define BSD
 108#    endif
 109#    define mach_type_known
 110# endif
 111# if defined(__NetBSD__) && defined(__vax__)
 112#    define VAX
 113#    define mach_type_known
 114# endif
 115# if defined(mips) || defined(__mips) || defined(_mips)
 116#    define MIPS
 117#    if defined(nec_ews) || defined(_nec_ews)
 118#      define EWS4800
 119#    endif
 120#    if !defined(LINUX) && !defined(EWS4800) && !defined(NETBSD)
 121#      if defined(ultrix) || defined(__ultrix)
 122#	 define ULTRIX
 123#      else
 124#	 define IRIX5   /* or IRIX 6.X */
 125#      endif
 126#    endif /* !LINUX */
 127#    if defined(__NetBSD__) && defined(__MIPSEL__)
 128#      undef ULTRIX
 129#    endif
 130#    define mach_type_known
 131# endif
 132# if defined(DGUX) && (defined(i386) || defined(__i386__))
 133#    define I386
 134#    ifndef _USING_DGUX
 135#    define _USING_DGUX
 136#    endif
 137#    define mach_type_known
 138# endif
 139# if defined(sequent) && (defined(i386) || defined(__i386__))
 140#    define I386
 141#    define SEQUENT
 142#    define mach_type_known
 143# endif
 144# if defined(sun) && (defined(i386) || defined(__i386__))
 145#    define I386
 146#    define SOLARIS
 147#    define mach_type_known
 148# endif
 149# if defined(sun) && defined(__amd64)
 150#    define X86_64
 151#    define SOLARIS
 152#    define mach_type_known
 153# endif
 154# if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
 155#    define I386
 156#    define OS2
 157#    define mach_type_known
 158# endif
 159# if defined(ibm032)
 160#   error IBM PC/RT no longer supported.
 161# endif
 162# if defined(sun) && (defined(sparc) || defined(__sparc))
 163#   define SPARC
 164    /* Test for SunOS 5.x */
 165#     include <errno.h>
 166#     define SOLARIS
 167#   define mach_type_known
 168# endif
 169# if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
 170     && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__) \
 171     && !defined(__DragonFly__)
 172#   define SPARC
 173#   define DRSNX
 174#   define mach_type_known
 175# endif
 176# if defined(_IBMR2)
 177#   define POWERPC
 178#   define AIX
 179#   define mach_type_known
 180# endif
 181# if defined(__NetBSD__) && defined(__sparc__)
 182#   define SPARC
 183#   define mach_type_known
 184# endif
 185# if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
 186	/* The above test may need refinement	*/
 187#   define I386
 188#   if defined(_SCO_ELF)
 189#     define SCO_ELF
 190#   else
 191#     define SCO
 192#   endif
 193#   define mach_type_known
 194# endif
 195# if defined(_AUX_SOURCE)
 196#   error A/UX no longer supported
 197# endif
 198# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
 199     || defined(hppa) || defined(__hppa__)
 200#   define HP_PA
 201#   if !defined(LINUX) && !defined(HPUX)
 202#     define HPUX
 203#   endif
 204#   define mach_type_known
 205# endif
 206# if defined(__ia64) && (defined(_HPUX_SOURCE) || defined(__HP_aCC))
 207#   define IA64
 208#   ifndef HPUX
 209#     define HPUX
 210#   endif
 211#   define mach_type_known
 212# endif
 213# if defined(__BEOS__) && defined(_X86_)
 214#    define I386
 215#    define BEOS
 216#    define mach_type_known
 217# endif
 218# if defined(LINUX) && (defined(i386) || defined(__i386__))
 219#    define I386
 220#    define mach_type_known
 221# endif
 222# if defined(LINUX) && defined(__x86_64__)
 223#    define X86_64
 224#    define mach_type_known
 225# endif
 226# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
 227#    define IA64
 228#    define mach_type_known
 229# endif
 230# if defined(LINUX) && defined(__arm__)
 231#    define ARM32
 232#    define mach_type_known
 233# endif
 234# if defined(LINUX) && defined(__cris__)
 235#    ifndef CRIS
 236#	define CRIS
 237#    endif
 238#    define mach_type_known
 239# endif
 240# if defined(LINUX) && (defined(powerpc) || defined(__powerpc__) || \
 241		        defined(powerpc64) || defined(__powerpc64__))
 242#    define POWERPC
 243#    define mach_type_known
 244# endif
 245# if defined(FREEBSD) && (defined(powerpc) || defined(__powerpc__))
 246#    define POWERPC
 247#    define mach_type_known
 248# endif
 249# if defined(LINUX) && defined(__mc68000__)
 250#    define M68K
 251#    define mach_type_known
 252# endif
 253# if defined(LINUX) && (defined(sparc) || defined(__sparc__))
 254#    define SPARC
 255#    define mach_type_known
 256# endif
 257# if defined(LINUX) && defined(__arm__)
 258#    define ARM32
 259#    define mach_type_known
 260# endif
 261# if defined(LINUX) && defined(__sh__)
 262#    define SH
 263#    define mach_type_known
 264# endif
 265# if defined(LINUX) && defined(__m32r__)
 266#    define M32R
 267#    define mach_type_known
 268# endif
 269# if defined(__alpha) || defined(__alpha__)
 270#   define ALPHA
 271#   if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) && !defined(FREEBSD)
 272#     define OSF1	/* a.k.a Digital Unix */
 273#   endif
 274#   define mach_type_known
 275# endif
 276# if defined(_AMIGA) && !defined(AMIGA)
 277#   define AMIGA
 278# endif
 279# ifdef AMIGA 
 280#   define M68K
 281#   define mach_type_known
 282# endif
 283# if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
 284#   define M68K
 285#   define MACOS
 286#   define mach_type_known
 287# endif
 288# if defined(__MWERKS__) && defined(__powerc) && !defined(__MACH__)
 289#   define POWERPC
 290#   define MACOS
 291#   define mach_type_known
 292# endif
 293# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__))
 294#   define DARWIN
 295#   if defined(__ppc__)  || defined(__ppc64__)
 296#    define POWERPC
 297#    define mach_type_known
 298#   elif defined(__x86_64__)
 299#    define X86_64
 300#    define mach_type_known
 301#   elif defined(__i386__)
 302#    define I386
 303#    define mach_type_known
 304#   endif
 305# endif
 306# if defined(NeXT) && defined(mc68000)
 307#   define M68K
 308#   define NEXT
 309#   define mach_type_known
 310# endif
 311# if defined(NeXT) && (defined(i386) || defined(__i386__))
 312#   define I386
 313#   define NEXT
 314#   define mach_type_known
 315# endif
 316# if defined(__OpenBSD__) && (defined(i386) || defined(__i386__))
 317#   define I386
 318#   define OPENBSD
 319#   define mach_type_known
 320# endif
 321# if defined(FREEBSD) && (defined(i386) || defined(__i386__))
 322#   define I386
 323#   define mach_type_known
 324# endif
 325# if defined(FREEBSD) && defined(__x86_64__)
 326#   define X86_64
 327#   define mach_type_known
 328# endif
 329# if defined(__NetBSD__) && (defined(i386) || defined(__i386__))
 330#   define I386
 331#   define mach_type_known
 332# endif
 333# if defined(__NetBSD__) && defined(__x86_64__)
 334#    define X86_64
 335#    define mach_type_known
 336# endif
 337# if defined(FREEBSD) && defined(__sparc__)
 338#    define SPARC
 339#    define mach_type_known
 340# endif
 341# if defined(bsdi) && (defined(i386) || defined(__i386__))
 342#    define I386
 343#    define BSDI
 344#    define mach_type_known
 345# endif
 346# if !defined(mach_type_known) && defined(__386BSD__)
 347#   define I386
 348#   define THREE86BSD
 349#   define mach_type_known
 350# endif
 351# if defined(_CX_UX) && defined(_M88K)
 352#   define M88K
 353#   define CX_UX
 354#   define mach_type_known
 355# endif
 356# if defined(DGUX) && defined(m88k)
 357#   define M88K
 358    /* DGUX defined */
 359#   define mach_type_known
 360# endif
 361# if defined(_WIN32_WCE)
 362    /* SH3, SH4, MIPS already defined for corresponding architectures */
 363#   if defined(SH3) || defined(SH4)
 364#     define SH
 365#   endif
 366#   if defined(x86)
 367#     define I386
 368#   endif
 369#   if defined(ARM)
 370#     define ARM32
 371#   endif
 372#   define MSWINCE
 373#   define mach_type_known
 374# else
 375#   if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \
 376        || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
 377#     if defined(__LP64__) || defined(_WIN64)
 378#	define X86_64
 379#     else
 380#       define I386
 381#     endif
 382#     define MSWIN32	/* or Win64 */
 383#     define mach_type_known
 384#   endif
 385#   if defined(_MSC_VER) && defined(_M_IA64)
 386#     define IA64
 387#     define MSWIN32	/* Really win64, but we don't treat 64-bit 	*/
 388			/* variants as a differnt platform.		*/
 389#   endif
 390# endif
 391# if defined(__DJGPP__)
 392#   define I386
 393#   ifndef DJGPP
 394#     define DJGPP  /* MSDOS running the DJGPP port of GCC */
 395#   endif
 396#   define mach_type_known
 397# endif
 398# if defined(__CYGWIN32__) || defined(__CYGWIN__)
 399#   define I386
 400#   define CYGWIN32
 401#   define mach_type_known
 402# endif
 403# if defined(__MINGW32__)
 404#   define I386
 405#   define MSWIN32
 406#   define mach_type_known
 407# endif
 408# if defined(__BORLANDC__)
 409#   define I386
 410#   define MSWIN32
 411#   define mach_type_known
 412# endif
 413# if defined(_UTS) && !defined(mach_type_known)
 414#   define S370
 415#   define UTS4
 416#   define mach_type_known
 417# endif
 418# if defined(__pj__)
 419#   error PicoJava no longer supported
 420    /* The implementation had problems, and I haven't heard of users	*/
 421    /* in ages.  If you want it resurrected, let me know.		*/
 422# endif
 423# if defined(__embedded__) && defined(PPC)
 424#   define POWERPC
 425#   define NOSYS
 426#   define mach_type_known
 427# endif
 428/* Ivan Demakov */
 429# if defined(__WATCOMC__) && defined(__386__)
 430#   define I386
 431#   if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
 432#     if defined(__OS2__)
 433#       define OS2
 434#     else
 435#       if defined(__WINDOWS_386__) || defined(__NT__)
 436#         define MSWIN32
 437#       else
 438#         define DOS4GW
 439#       endif
 440#     endif
 441#   endif
 442#   define mach_type_known
 443# endif
 444# if defined(__s390__) && defined(LINUX)
 445#    define S390
 446#    define mach_type_known
 447# endif
 448# if defined(__GNU__)
 449#   if defined(__i386__)
 450/* The Debian Hurd running on generic PC */  
 451#     define  HURD
 452#     define  I386
 453#     define  mach_type_known
 454#    endif 
 455# endif
 456# if defined(__TANDEM)
 457    /* Nonstop S-series */
 458    /* FIXME: Should recognize Integrity series? */
 459#   define MIPS
 460#   define NONSTOP
 461#   define mach_type_known
 462# endif
 463
 464/* Feel free to add more clauses here */
 465
 466/* Or manually define the machine type here.  A machine type is 	*/
 467/* characterized by the architecture.  Some				*/
 468/* machine types are further subdivided by OS.				*/
 469/* Macros such as LINUX, FREEBSD, etc. distinguish them.		*/
 470/* SYSV on an M68K actually means A/UX.					*/
 471/* The distinction in these cases is usually the stack starting address */
 472# ifndef mach_type_known
 473#   error "The collector has not been ported to this machine/OS combination."
 474# endif
 475		    /* Mapping is: M68K       ==> Motorola 680X0	*/
 476		    /*		   (NEXT, and SYSV (A/UX),		*/
 477		    /*		   MACOS and AMIGA variants)		*/
 478		    /*             I386       ==> Intel 386	 	*/
 479		    /*		    (SEQUENT, OS2, SCO, LINUX, NETBSD,	*/
 480		    /*		     FREEBSD, THREE86BSD, MSWIN32,	*/
 481		    /* 		     BSDI,SOLARIS, NEXT, other variants)	*/
 482                    /*             NS32K      ==> Encore Multimax 	*/
 483                    /*             MIPS       ==> R2000 through R14K	*/
 484                    /*			(many variants)			*/
 485                    /*		   VAX	      ==> DEC VAX		*/
 486                    /*			(BSD, ULTRIX variants)		*/
 487                    /*		   HP_PA      ==> HP9000/700 & /800	*/
 488                    /*				  HP/UX, LINUX		*/
 489		    /*		   SPARC      ==> SPARC	v7/v8/v9	*/
 490		    /*			(SOLARIS, LINUX, DRSNX variants)	*/
 491		    /* 		   ALPHA      ==> DEC Alpha 		*/
 492		    /*			(OSF1 and LINUX variants)	*/
 493		    /* 		   M88K       ==> Motorola 88XX0        */
 494		    /* 		        (CX_UX and DGUX)		*/
 495		    /* 		   S370	      ==> 370-like machine	*/
 496		    /* 			running Amdahl UTS4		*/
 497                    /*             S390       ==> 390-like machine      */
 498		    /*                  running LINUX                   */
 499		    /* 		   ARM32      ==> Intel StrongARM	*/
 500		    /* 		   IA64	      ==> Intel IPF		*/
 501		    /*				  (e.g. Itanium)	*/
 502		    /*			(LINUX and HPUX)	        */
 503		    /*		   SH	      ==> Hitachi SuperH	*/
 504		    /* 			(LINUX & MSWINCE)		*/
 505		    /* 		   X86_64     ==> AMD x86-64		*/
 506		    /*		   POWERPC    ==> IBM/Apple PowerPC	*/
 507		    /*			(MACOS(<=9),DARWIN(incl.MACOSX),*/
 508		    /*			 LINUX, NETBSD, AIX, NOSYS	*/
 509		    /*			 variants)			*/
 510		    /*			Handles 32 and 64-bit variants.	*/
 511		    /*		   CRIS       ==> Axis Etrax		*/
 512		    /*		   M32R	      ==> Renesas M32R		*/
 513
 514
 515/*
 516 * For each architecture and OS, the following need to be defined:
 517 *
 518 * CPP_WORDSZ is a simple integer constant representing the word size.
 519 * in bits.  We assume byte addressibility, where a byte has 8 bits.
 520 * We also assume CPP_WORDSZ is either 32 or 64.
 521 * (We care about the length of pointers, not hardware
 522 * bus widths.  Thus a 64 bit processor with a C compiler that uses
 523 * 32 bit pointers should use CPP_WORDSZ of 32, not 64. Default is 32.)
 524 *
 525 * MACH_TYPE is a string representation of the machine type.
 526 * OS_TYPE is analogous for the OS.
 527 *
 528 * ALIGNMENT is the largest N, such that
 529 * all pointer are guaranteed to be aligned on N byte boundaries.
 530 * defining it to be 1 will always work, but perform poorly.
 531 *
 532 * DATASTART is the beginning of the data segment.
 533 * On some platforms SEARCH_FOR_DATA_START is defined.
 534 * SEARCH_FOR_DATASTART will cause GC_data_start to
 535 * be set to an address determined by accessing data backwards from _end
 536 * until an unmapped page is found.  DATASTART will be defined to be
 537 * GC_data_start.
 538 * On UNIX-like systems, the collector will scan the area between DATASTART
 539 * and DATAEND for root pointers.
 540 *
 541 * DATAEND, if not `end' where `end' is defined as ``extern int end[];''.
 542 * RTH suggests gaining access to linker script synth'd values with
 543 * this idiom instead of `&end' where `end' is defined as ``extern int end;'' .
 544 * Otherwise, ``GCC will assume these are in .sdata/.sbss'' and it will, e.g.,
 545 * cause failures on alpha*-*-* with ``-msmall-data or -fpic'' or mips-*-*
 546 * without any special options.
 547 *
 548 * STACKBOTTOM is the cool end of the stack, which is usually the
 549 * highest address in the stack.
 550 * Under PCR or OS/2, we have other ways of finding thread stacks.
 551 * For each machine, the following should:
 552 * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
 553 * 2) define exactly one of
 554 *	STACKBOTTOM (should be defined to be an expression)
 555 *	LINUX_STACKBOTTOM
 556 *	HEURISTIC1
 557 *	HEURISTIC2
 558 * If STACKBOTTOM is defined, then it's value will be used directly as the
 559 * stack base.  If LINUX_STACKBOTTOM is defined, then it will be determined
 560 * with a method appropriate for most Linux systems.  Currently we look
 561 * first for __libc_stack_end (currently only id USE_LIBC_PRIVATES is
 562 * defined), and if that fails read it from /proc.  (If USE_LIBC_PRIVATES
 563 * is not defined and NO_PROC_STAT is defined, we revert to HEURISTIC2.)
 564 * If either of the last two macros are defined, then STACKBOTTOM is computed
 565 * during collector startup using one of the following two heuristics:
 566 * HEURISTIC1:  Take an address inside GC_init's frame, and round it up to
 567 *		the next multiple of STACK_GRAN.
 568 * HEURISTIC2:  Take an address inside GC_init's frame, increment it repeatedly
 569 *		in small steps (decrement if STACK_GROWS_UP), and read the value
 570 *		at each location.  Remember the value when the first
 571 *		Segmentation violation or Bus error is signalled.  Round that
 572 *		to the nearest plausible page boundary, and use that instead
 573 *		of STACKBOTTOM.
 574 *
 575 * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines,
 576 * the value of environ is a pointer that can serve as STACKBOTTOM.
 577 * I expect that HEURISTIC2 can be replaced by this approach, which
 578 * interferes far less with debugging.  However it has the disadvantage
 579 * that it's confused by a putenv call before the collector is initialized.
 580 * This could be dealt with by intercepting putenv ...
 581 *
 582 * If no expression for STACKBOTTOM can be found, and neither of the above
 583 * heuristics are usable, the collector can still be used with all of the above
 584 * undefined, provided one of the following is done:
 585 * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
 586 *    without reference to STACKBOTTOM.  This is appropriate for use in
 587 *    conjunction with thread packages, since there will be multiple stacks.
 588 *    (Allocating thread stacks in the heap, and treating them as ordinary
 589 *    heap data objects is also possible as a last resort.  However, this is
 590 *    likely to introduce significant amounts of excess storage retention
 591 *    unless the dead parts of the thread stacks are periodically cleared.)
 592 * 2) Client code may set GC_stackbottom before calling any GC_ routines.
 593 *    If the author of the client code controls the main program, this is
 594 *    easily accomplished by introducing a new main program, setting
 595 *    GC_stackbottom to the address of a local variable, and then calling
 596 *    the original main program.  The new main program would read something
 597 *    like:
 598 *
 599 *		# include "gc_private.h"
 600 *
 601 *		main(argc, argv, envp)
 602 *		int argc;
 603 *		char **argv, **envp;
 604 *		{
 605 *		    int dummy;
 606 *
 607 *		    GC_stackbottom = (ptr_t)(&dummy);
 608 *		    return(real_main(argc, argv, envp));
 609 *		}
 610 *
 611 *
 612 * Each architecture may also define the style of virtual dirty bit
 613 * implementation to be used:
 614 *   MPROTECT_VDB: Write protect the heap and catch faults.
 615 *   GWW_VDB: Use win32 GetWriteWatch primitive.
 616 *   PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
 617 *
 618 * The first and second one may be combined, in which case a runtime
 619 * selection will be made, based on GetWriteWatch availability.
 620 *
 621 * An architecture may define DYNAMIC_LOADING if dynamic_load.c
 622 * defined GC_register_dynamic_libraries() for the architecture.
 623 *
 624 * An architecture may define PREFETCH(x) to preload the cache with *x.
 625 * This defaults to a no-op.
 626 *
 627 * PREFETCH_FOR_WRITE(x) is used if *x is about to be written.
 628 *
 629 * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to
 630 * clear the two words at GC_malloc-aligned address x.  By default,
 631 * word stores of 0 are used instead.
 632 *
 633 * HEAP_START may be defined as the initial address hint for mmap-based
 634 * allocation.
 635 */
 636
 637/* If we are using a recent version of gcc, we can use __builtin_unwind_init()
 638 * to push the relevant registers onto the stack.
 639 */
 640# if defined(__GNUC__) && ((__GNUC__ >= 3) || \
 641			   (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) \
 642		       && !defined(__INTEL_COMPILER) && !defined(__PATHCC__)
 643#   define HAVE_BUILTIN_UNWIND_INIT
 644# endif
 645
 646# define STACK_GRAN 0x1000000
 647# ifdef M68K
 648#   define MACH_TYPE "M68K"
 649#   define ALIGNMENT 2
 650#   ifdef OPENBSD
 651#	define OS_TYPE "OPENBSD"
 652#	define HEURISTIC2
 653#	ifdef __ELF__
 654#	  define DATASTART GC_data_start
 655#	  define DYNAMIC_LOADING
 656#	else
 657	  extern char etext[];
 658#	  define DATASTART ((ptr_t)(etext))
 659#       endif
 660#   endif
 661#   ifdef NETBSD
 662#	define OS_TYPE "NETBSD"
 663#	define HEURISTIC2
 664#	ifdef __ELF__
 665#	  define DATASTART GC_data_start
 666#	  define DYNAMIC_LOADING
 667#	else
 668	  extern char etext[];
 669#	  define DATASTART ((ptr_t)(etext))
 670#       endif
 671#   endif
 672#   ifdef LINUX
 673#       define OS_TYPE "LINUX"
 674#       define LINUX_STACKBOTTOM
 675#       define MPROTECT_VDB
 676#       ifdef __ELF__
 677#            define DYNAMIC_LOADING
 678#	     include <features.h>
 679#	     if defined(__GLIBC__)&& __GLIBC__>=2
 680#              define SEARCH_FOR_DATA_START
 681#	     else /* !GLIBC2 */
 682               extern char **__environ;
 683#              define DATASTART ((ptr_t)(&__environ))
 684                             /* hideous kludge: __environ is the first */
 685                             /* word in crt0.o, and delimits the start */
 686                             /* of the data segment, no matter which   */
 687                             /* ld options were passed through.        */
 688                             /* We could use _etext instead, but that  */
 689                             /* would include .rodata, which may       */
 690                             /* contain large read-only data tables    */
 691                             /* that we'd rather not scan.             */
 692#	     endif /* !GLIBC2 */
 693             extern int _end[];
 694#            define DATAEND (_end)
 695#       else
 696             extern int etext[];
 697#            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
 698#       endif
 699#   endif
 700#   ifdef AMIGA
 701#	define OS_TYPE "AMIGA"
 702 	    	/* STACKBOTTOM and DATASTART handled specially	*/
 703 	    	/* in os_dep.c					*/
 704# 	define DATAEND	/* not needed */
 705#	define GETPAGESIZE() 4096
 706#   endif
 707#   ifdef MACOS
 708#     ifndef __LOWMEM__
 709#     include <LowMem.h>
 710#     endif
 711#     define OS_TYPE "MACOS"
 712			/* see os_dep.c for details of global data segments. */
 713#     define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
 714#     define DATAEND	/* not needed */
 715#     define GETPAGESIZE() 4096
 716#   endif
 717#   ifdef NEXT
 718#	define OS_TYPE "NEXT"
 719#	define DATASTART ((ptr_t) get_etext())
 720#	define STACKBOTTOM ((ptr_t) 0x4000000)
 721#	define DATAEND	/* not needed */
 722#   endif
 723# endif
 724
 725# if defined(POWERPC)
 726#   define MACH_TYPE "POWERPC"
 727#   ifdef MACOS
 728#     define ALIGNMENT 2  /* Still necessary?  Could it be 4?	*/
 729#     ifndef __LOWMEM__
 730#     include <LowMem.h>
 731#     endif
 732#     define OS_TYPE "MACOS"
 733			/* see os_dep.c for details of global data segments. */
 734#     define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
 735#     define DATAEND  /* not needed */
 736#   endif
 737#   ifdef LINUX
 738#     if defined(__powerpc64__)
 739#       define ALIGNMENT 8
 740#       define CPP_WORDSZ 64
 741#       ifndef HBLKSIZE
 742#         define HBLKSIZE 4096
 743#       endif
 744#     else
 745#       define ALIGNMENT 4
 746#     endif
 747#     define OS_TYPE "LINUX"
 748      /* HEURISTIC1 has been reliably reported to fail for a 32-bit	*/
 749      /* executable on a 64 bit kernel.					*/
 750#     define LINUX_STACKBOTTOM
 751#     define DYNAMIC_LOADING
 752#     define SEARCH_FOR_DATA_START
 753      extern int _end[];
 754#     define DATAEND (_end)
 755#   endif
 756#   ifdef DARWIN
 757#     define OS_TYPE "DARWIN"
 758#     define DYNAMIC_LOADING
 759#     if defined(__ppc64__)
 760#       define ALIGNMENT 8
 761#       define CPP_WORDSZ 64
 762#       define STACKBOTTOM ((ptr_t) 0x7fff5fc00000)
 763#       define CACHE_LINE_SIZE 64
 764#       ifndef HBLKSIZE
 765#         define HBLKSIZE 4096
 766#       endif
 767#     else
 768#       define ALIGNMENT 4
 769#       define STACKBOTTOM ((ptr_t) 0xc0000000)
 770#     endif
 771      /* XXX: see get_end(3), get_etext() and get_end() should not be used.
 772	 These aren't used when dyld support is enabled (it is by default) */
 773#     define DATASTART ((ptr_t) get_etext())
 774#     define DATAEND	((ptr_t) get_end())
 775#     define USE_MMAP
 776#     define USE_MMAP_ANON
 777#     ifdef GC_DARWIN_THREADS
 778#       define MPROTECT_VDB
 779#     endif
 780#     include <unistd.h>
 781#     define GETPAGESIZE() getpagesize()
 782#     if defined(USE_PPC_PREFETCH) && defined(__GNUC__)
 783	/* The performance impact of prefetches is untested */
 784#	define PREFETCH(x) \
 785	  __asm__ __volatile__ ("dcbt 0,%0" : : "r" ((const void *) (x)))
 786#	define PREFETCH_FOR_WRITE(x) \
 787	  __asm__ __volatile__ ("dcbtst 0,%0" : : "r" ((const void *) (x)))
 788#     endif
 789      /* There seems to be some issues with trylock hanging on darwin. This
 790	 should be looked into some more */
 791#     define NO_PTHREAD_TRYLOCK
 792#   endif
 793#   ifdef FREEBSD
 794#       define ALIGNMENT 4
 795#       define OS_TYPE "FREEBSD"
 796#       ifndef GC_FREEBSD_THREADS
 797#           define MPROTECT_VDB
 798#       endif
 799#       define SIG_SUSPEND SIGUSR1
 800#       define SIG_THR_RESTART SIGUSR2
 801#       define FREEBSD_STACKBOTTOM
 802#       ifdef __ELF__
 803#           define DYNAMIC_LOADING
 804#       endif
 805        extern char etext[];
 806        extern char * GC_FreeBSDGetDataStart();
 807#       define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
 808#   endif
 809#   ifdef NETBSD
 810#     define ALIGNMENT 4
 811#     define OS_TYPE "NETBSD"
 812#     define HEURISTIC2
 813      extern char etext[];
 814#     define DATASTART GC_data_start
 815#     define DYNAMIC_LOADING
 816#   endif
 817#   ifdef AIX
 818#     define OS_TYPE "AIX"
 819#     undef ALIGNMENT /* in case it's defined	*/
 820#     ifdef IA64
 821#       undef IA64
 822          /* DOB: some AIX installs stupidly define IA64 in */
 823          /* /usr/include/sys/systemcfg.h   		    */
 824#     endif
 825#     ifdef __64BIT__
 826#       define ALIGNMENT 8
 827#       define CPP_WORDSZ 64
 828#       define STACKBOTTOM ((ptr_t)0x1000000000000000)
 829#     else
 830#       define ALIGNMENT 4
 831#       define CPP_WORDSZ 32
 832#       define STACKBOTTOM ((ptr_t)((ulong)&errno))
 833#     endif
 834#     define USE_MMAP
 835#     define USE_MMAP_ANON
 836	/* From AIX linker man page:
 837	_text Specifies the first location of the program.
 838	_etext Specifies the first location after the program.
 839	_data Specifies the first location of the data.
 840	_edata Specifies the first location after the initialized data
 841	_end or end Specifies the first location after all data.
 842	*/
 843      extern int _data[], _end[];
 844#     define DATASTART ((ptr_t)((ulong)_data))
 845#     define DATAEND ((ptr_t)((ulong)_end))
 846      extern int errno;
 847#     define DYNAMIC_LOADING
 848	/* For really old versions of AIX, this may have to be removed. */
 849#   endif
 850
 851#   ifdef NOSYS
 852#     define ALIGNMENT 4
 853#     define OS_TYPE "NOSYS"
 854      extern void __end[], __dso_handle[];
 855#     define DATASTART (__dso_handle)  /* OK, that's ugly.  */
 856#     define DATAEND (__end)
 857	/* Stack starts at 0xE0000000 for the simulator.  */
 858#     undef STACK_GRAN
 859#     define STACK_GRAN 0x10000000
 860#     define HEURISTIC1
 861#   endif
 862# endif
 863
 864# ifdef VAX
 865#   define MACH_TYPE "VAX"
 866#   define ALIGNMENT 4	/* Pointers are longword aligned by 4.2 C compiler */
 867    extern char etext[];
 868#   define DATASTART ((ptr_t)(etext))
 869#   ifdef BSD
 870#	define OS_TYPE "BSD"
 871#	define HEURISTIC1
 872			/* HEURISTIC2 may be OK, but it's hard to test. */
 873#   endif
 874#   ifdef ULTRIX
 875#	define OS_TYPE "ULTRIX"
 876#	define STACKBOTTOM ((ptr_t) 0x7fffc800)
 877#   endif
 878# endif
 879
 880# ifdef SPARC
 881#   define MACH_TYPE "SPARC"
 882#   if defined(__arch64__) || defined(__sparcv9)
 883#     define ALIGNMENT 8
 884#     define CPP_WORDSZ 64
 885#     define ELF_CLASS ELFCLASS64
 886#   else
 887#     define ALIGNMENT 4	/* Required by hardware	*/
 888#     define CPP_WORDSZ 32
 889#   endif
 890    /* Don't define USE_ASM_PUSH_REGS.  We do use an asm helper, but	*/
 891    /* not to push the registers on the mark stack.			*/
 892#   ifdef SOLARIS
 893#	define OS_TYPE "SOLARIS"
 894	extern int _etext[];
 895	extern int _end[];
 896	extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
 897#       define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)_etext)
 898#	define DATAEND (_end)
 899#	if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
 900#	    define USE_MMAP
 901	    /* Otherwise we now use calloc.  Mmap may result in the	*/
 902	    /* heap interleaved with thread stacks, which can result in	*/
 903	    /* excessive blacklisting.  Sbrk is unusable since it	*/
 904	    /* doesn't interact correctly with the system malloc.	*/
 905#	endif
 906#       ifdef USE_MMAP
 907#         define HEAP_START (ptr_t)0x40000000
 908#       else
 909#	  define HEAP_START DATAEND
 910#       endif
 911#	define PROC_VDB
 912/*	HEURISTIC1 reportedly no longer works under 2.7.  		*/
 913/*  	HEURISTIC2 probably works, but this appears to be preferable.	*/
 914/*	Apparently USRSTACK is defined to be USERLIMIT, but in some	*/
 915/* 	installations that's undefined.  We work around this with a	*/
 916/*	gross hack:							*/
 917#       include <sys/vmparam.h>
 918#	ifdef USERLIMIT
 919	  /* This should work everywhere, but doesn't.	*/
 920#	  define STACKBOTTOM USRSTACK
 921#       else
 922#	  define HEURISTIC2
 923#       endif
 924#	include <unistd.h>
 925#       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
 926		/* getpagesize() appeared to be missing from at least one */
 927		/* Solaris 5.4 installation.  Weird.			  */
 928#	define DYNAMIC_LOADING
 929#   endif
 930#   ifdef DRSNX
 931#	define OS_TYPE "DRSNX"
 932	extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
 933	extern int etext[];
 934#       define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)etext)
 935#	define MPROTECT_VDB
 936#       define STACKBOTTOM ((ptr_t) 0xdfff0000)
 937#	define DYNAMIC_LOADING
 938#   endif
 939#   ifdef LINUX
 940#     define OS_TYPE "LINUX"
 941#     ifdef __ELF__
 942#       define DYNAMIC_LOADING
 943#     else
 944          Linux Sparc/a.out not supported
 945#     endif
 946      extern int _end[];
 947      extern int _etext[];
 948#     define DATAEND (_end)
 949#     define SVR4
 950      extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
 951#     ifdef __arch64__
 952#	define DATASTART GC_SysVGetDataStart(0x100000, (ptr_t)_etext)
 953#     else
 954#       define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)_etext)
 955#     endif
 956#     define LINUX_STACKBOTTOM
 957#   endif
 958#   ifdef OPENBSD
 959#     define OS_TYPE "OPENBSD"
 960#     define STACKBOTTOM ((ptr_t) 0xf8000000)
 961      extern int etext[];
 962#     define DATASTART ((ptr_t)(etext))
 963#   endif
 964#   ifdef NETBSD
 965#     define OS_TYPE "NETBSD"
 966#     define HEURISTIC2
 967#     ifdef __ELF__
 968#	define DATASTART GC_data_start
 969#	define DYNAMIC_LOADING
 970#     else
 971	extern char etext[];
 972#	define DATASTART ((ptr_t)(etext))
 973#     endif
 974#   endif
 975#   ifdef FREEBSD
 976#	define OS_TYPE "FREEBSD"
 977#	define SIG_SUSPEND SIGUSR1
 978#	define SIG_THR_RESTART SIGUSR2
 979#	define FREEBSD_STACKBOTTOM
 980#	ifdef __ELF__
 981#	    define DYNAMIC_LOADING
 982#	endif
 983	extern char etext[];
 984	extern char edata[];
 985	extern char end[];
 986#	define NEED_FIND_LIMIT
 987#	define DATASTART ((ptr_t)(&etext))
 988#	define DATAEND (GC_find_limit (DATASTART, TRUE))
 989#	define DATASTART2 ((ptr_t)(&edata))
 990#	define DATAEND2 ((ptr_t)(&end))
 991#   endif
 992# endif
 993
 994# ifdef I386
 995#   define MACH_TYPE "I386"
 996#   if defined(__LP64__) || defined(_WIN64)
 997#     error This should be handled as X86_64
 998#   else
 999#     define CPP_WORDSZ 32
1000#     define ALIGNMENT 4
1001			/* Appears to hold for all "32 bit" compilers	*/
1002			/* except Borland.  The -a4 option fixes 	*/
1003			/* Borland.					*/
1004                        /* Ivan Demakov: For Watcom the option is -zp4. */
1005#   endif
1006#   ifdef SEQUENT
1007#	define OS_TYPE "SEQUENT"
1008	extern int etext[];
1009#       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1010#       define STACKBOTTOM ((ptr_t) 0x3ffff000) 
1011#   endif
1012#   ifdef BEOS
1013#     define OS_TYPE "BEOS"
1014#     include <OS.h>
1015#     define GETPAGESIZE() B_PAGE_SIZE
1016      extern int etext[];
1017#     define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1018#   endif
1019#   ifdef SOLARIS
1020#	define OS_TYPE "SOLARIS"
1021        extern int _etext[], _end[];
1022  	extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
1023#       define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)_etext)
1024#	define DATAEND (_end)
1025/*	# define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7,  	*/
1026/*      but reportedly breaks under 2.8.  It appears that the stack	*/
1027/* 	base is a property of the executable, so this should not break	*/
1028/* 	old executables.						*/
1029/*  	HEURISTIC2 probably works, but this appears to be preferable.	*/
1030#       include <sys/vm.h>
1031#	define STACKBOTTOM USRSTACK
1032/* At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
1033/* It appears to be fixed in 2.8 and 2.9.				*/
1034#	ifdef SOLARIS25_PROC_VDB_BUG_FIXED
1035#	  define PROC_VDB
1036#	endif
1037#	define DYNAMIC_LOADING
1038#	if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
1039#	    define USE_MMAP
1040	    /* Otherwise we now use calloc.  Mmap may result in the	*/
1041	    /* heap interleaved with thread stacks, which can result in	*/
1042	    /* excessive blacklisting.  Sbrk is unusable since it	*/
1043	    /* doesn't interact correctly with the system malloc.	*/
1044#	endif
1045#       ifdef USE_MMAP
1046#         define HEAP_START (ptr_t)0x40000000
1047#       else
1048#	  define HEAP_START DATAEND
1049#       endif
1050#   endif
1051#   ifdef SCO
1052#	define OS_TYPE "SCO"
1053	extern int etext[];
1054#   	define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
1055				  & ~0x3fffff) \
1056				 +((word)etext & 0xfff))
1057#	define STACKBOTTOM ((ptr_t) 0x7ffffffc)
1058#   endif
1059#   ifdef SCO_ELF
1060#       define OS_TYPE "SCO_ELF"
1061        extern int etext[];
1062#       define DATASTART ((ptr_t)(etext))
1063#       define STACKBOTTOM ((ptr_t) 0x08048000)
1064#       define DYNAMIC_LOADING
1065#	define ELF_CLASS ELFCLASS32
1066#   endif
1067#   ifdef DGUX
1068#	define OS_TYPE "DGUX"
1069	extern int _etext, _end;
1070	extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
1071#	define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)(&_etext))
1072#	define DATAEND (&_end)
1073#	define STACK_GROWS_DOWN
1074#	define HEURISTIC2
1075#	include <unistd.h>
1076#	define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
1077#	define DYNAMIC_LOADING
1078#	ifndef USE_MMAP
1079#	  define USE_MMAP
1080#	endif /* USE_MMAP */
1081#	define MAP_FAILED (void *) -1
1082#	ifdef USE_MMAP
1083#	  define HEAP_START (ptr_t)0x40000000
1084#	else /* USE_MMAP */
1085#	  define HEAP_START DATAEND
1086#	endif /* USE_MMAP */
1087#   endif /* DGUX */
1088
1089#   ifdef LINUX
1090#	define OS_TYPE "LINUX"
1091#       define LINUX_STACKBOTTOM
1092	/* On I386 Linux, enable HEURISTIC2 as a backup to /proc data	*/
1093	/* for the case where /proc is missing or nobbled (grsec)	*/
1094#	define HEURISTIC2
1095#	if 0
1096#	  define HEURISTIC1
1097#         undef STACK_GRAN
1098#         define STACK_GRAN 0x10000000
1099	  /* STACKBOTTOM is usually 0xc0000000, but this changes with	*/
1100	  /* different kernel configurations.  In particular, systems	*/
1101	  /* with 2GB physical memory will usually move the user	*/
1102	  /* address space limit, and hence initial SP to 0x80000000.	*/
1103#       endif
1104#       if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
1105#	    define MPROTECT_VDB
1106#	else
1107	    /* We seem to get random errors in incremental mode,	*/
1108	    /* possibly because Linux threads is itself a malloc client */
1109	    /* and can't deal with the signals.				*/
1110#	endif
1111#	define HEAP_START (ptr_t)0x1000
1112		/* This encourages mmap to give us low addresses,	*/
1113		/* thus allowing the heap to grow to ~3GB		*/
1114#       ifdef __ELF__
1115#            define DYNAMIC_LOADING
1116#	     ifdef UNDEFINED	/* includes ro data */
1117	       extern int _etext[];
1118#              define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
1119#	     endif
1120#	     include <features.h>
1121#	     if defined(__GLIBC__) && __GLIBC__ >= 2
1122#		 define SEARCH_FOR_DATA_START
1123#	     else
1124     	         extern char **__environ;
1125#                define DATASTART ((ptr_t)(&__environ))
1126			      /* hideous kludge: __environ is the first */
1127			      /* word in crt0.o, and delimits the start */
1128			      /* of the data segment, no matter which   */
1129			      /* ld options were passed through.        */
1130			      /* We could use _etext instead, but that  */
1131			      /* would include .rodata, which may       */
1132			      /* contain large read-only data tables    */
1133			      /* that we'd rather not scan.		*/
1134#	     endif
1135	     extern int _end[];
1136#	     define DATAEND (_end)
1137#	else
1138	     extern int etext[];
1139#            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1140#       endif
1141#	ifdef USE_I686_PREFETCH
1142	  /* FIXME: Thus should use __builtin_prefetch, but we'll leave that	*/
1143	  /* for the next rtelease.						*/
1144#	  define PREFETCH(x) \
1145	    __asm__ __volatile__ ("	prefetchnta	%0": : "m"(*(char *)(x)))
1146	    /* Empirically prefetcht0 is much more effective at reducing	*/
1147	    /* cache miss stalls for the targetted load instructions.  But it	*/
1148	    /* seems to interfere enough with other cache traffic that the net	*/
1149	    /* result is worse than prefetchnta.				*/
1150#         if 0 
1151	    /* Using prefetches for write seems to have a slight negative	*/
1152	    /* impact on performance, at least for a PIII/500.			*/
1153#	    define PREFETCH_FOR_WRITE(x) \
1154	      __asm__ __volatile__ ("	prefetcht0	%0": : "m"(*(char *)(x)))
1155#	  endif
1156#	endif
1157#	ifdef USE_3DNOW_PREFETCH
1158#	  define PREFETCH(x) \
1159	    __asm__ __volatile__ ("	prefetch	%0": : "m"(*(char *)(x)))
1160#	  define PREFETCH_FOR_WRITE(x) \
1161	    __asm__ __volatile__ ("	prefetchw	%0": : "m"(*(char *)(x)))
1162#	endif
1163#   endif
1164#   ifdef CYGWIN32
1165#       define OS_TYPE "CYGWIN32"
1166#       define DATASTART ((ptr_t)GC_DATASTART)  /* From gc.h */
1167#       define DATAEND	 ((ptr_t)GC_DATAEND)
1168#	undef STACK_GRAN
1169#       define STACK_GRAN 0x10000
1170#       define HEURISTIC1
1171#   endif
1172#   ifdef OS2
1173#	define OS_TYPE "OS2"
1174 	    	/* STACKBOTTOM and DATASTART are handled specially in 	*/
1175		/* os_dep.c. OS2 actually has the right			*/
1176		/* system call!						*/
1177#	define DATAEND	/* not needed */
1178#   endif
1179#   ifdef MSWIN32
1180#	define OS_TYPE "MSWIN32"
1181		/* STACKBOTTOM and DATASTART are handled specially in 	*/
1182		/* os_dep.c.						*/
1183#       if !defined(__WATCOMC__)
1184#	  define MPROTECT_VDB
1185	  /* We also avoided doing this in the past with GC_WIN32_THREADS */
1186	  /* Hopefully that's fixed.					  */
1187#	endif
1188#	if _MSC_VER >= 1300  /* .NET, i.e. > VisualStudio 6	*/
1189#         define GWW_VDB
1190#	endif
1191#       define DATAEND  /* not needed */
1192#   endif
1193#   ifdef MSWINCE
1194#	define OS_TYPE "MSWINCE"
1195#       define DATAEND  /* not needed */
1196#   endif
1197#   ifdef DJGPP
1198#       define OS_TYPE "DJGPP"
1199#       include "stubinfo.h"
1200        extern int etext[];
1201        extern int _stklen;
1202        extern int __djgpp_stack_limit;
1203#       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ff) & ~0x1ff))
1204/* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
1205                                                     + _stklen)) */
1206#       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
1207		/* This may not be right.  */
1208#   endif
1209#   ifdef OPENBSD
1210#	define OS_TYPE "OPENBSD"
1211#   endif
1212#   ifdef FREEBSD
1213#	define OS_TYPE "FREEBSD"
1214#	ifndef GC_FREEBSD_THREADS
1215#	    define MPROTECT_VDB
1216#	endif
1217#	ifdef __GLIBC__
1218#	    define SIG_SUSPEND		(32+6)
1219#	    define SIG_THR_RESTART	(32+5)
1220	    extern int _end[];
1221#	    define DATAEND (_end)
1222#	else
1223#	    define SIG_SUSPEND SIGUSR1
1224#	    define SIG_THR_RESTART SIGUSR2
1225#	endif
1226#	define FREEBSD_STACKBOTTOM
1227#	ifdef __ELF__
1228#	    define DYNAMIC_LOADING
1229#	endif
1230	extern char etext[];
1231	extern char * GC_FreeBSDGetDataStart(size_t, ptr_t);
1232#	define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
1233#   endif
1234#   ifdef NETBSD
1235#	define OS_TYPE "NETBSD"
1236#	ifdef __ELF__
1237#	    define DYNAMIC_LOADING
1238#	endif
1239#   endif
1240#   ifdef THREE86BSD
1241#	define OS_TYPE "THREE86BSD"
1242#   endif
1243#   ifdef BSDI
1244#	define OS_TYPE "BSDI"
1245#   endif
1246#   if defined(OPENBSD) || defined(NETBSD) \
1247        || defined(THREE86BSD) || defined(BSDI)
1248#	define HEURISTIC2
1249	extern char etext[];
1250#	define DATASTART ((ptr_t)(etext))
1251#   endif
1252#   ifdef NEXT
1253#	define OS_TYPE "NEXT"
1254#	define DATASTART ((ptr_t) get_etext())
1255#	define STACKBOTTOM ((ptr_t)0xc0000000)
1256#	define DATAEND	/* not needed */
1257#   endif
1258#   ifdef DOS4GW
1259#     define OS_TYPE "DOS4GW"
1260      extern long __nullarea;
1261      extern char _end;
1262      extern char *_STACKTOP;
1263      /* Depending on calling conventions Watcom C either precedes
1264         or does not precedes with undescore names of C-variables.
1265         Make sure startup code variables always have the same names.  */
1266      #pragma aux __nullarea "*";
1267      #pragma aux _end "*";
1268#     define STACKBOTTOM ((ptr_t) _STACKTOP)
1269                         /* confused? me too. */
1270#     define DATASTART ((ptr_t) &__nullarea)
1271#     define DATAEND ((ptr_t) &_end)
1272#   endif
1273#   ifdef HURD
1274#     define OS_TYPE "HURD"
1275#     define STACK_GROWS_DOWN
1276#     define HEURISTIC2
1277#     define SIG_SUSPEND SIGUSR1
1278#     define SIG_THR_RESTART SIGUSR2
1279#     define SEARCH_FOR_DATA_START
1280      extern int _end[];
1281#     define DATAEND ((ptr_t) (_end))
1282/* #     define MPROTECT_VDB  Not quite working yet? */
1283#     define DYNAMIC_LOADING
1284#   endif
1285#   ifdef DARWIN
1286#     define OS_TYPE "DARWIN"
1287#     define DARWIN_DONT_PARSE_STACK
1288#     define DYNAMIC_LOADING
1289      /* XXX: see get_end(3), get_etext() and get_end() should not be used.
1290	 These aren't used when dyld support is enabled (it is by default) */
1291#     define DATASTART ((ptr_t) get_etext())
1292#     define DATAEND	((ptr_t) get_end())
1293#     define STACKBOTTOM ((ptr_t) 0xc0000000)
1294#     define USE_MMAP
1295#     define USE_MMAP_ANON
1296#     ifdef GC_DARWIN_THREADS
1297#       define MPROTECT_VDB
1298#     endif
1299#     include <unistd.h>
1300#     define GETPAGESIZE() getpagesize()
1301      /* There seems to be some issues with trylock hanging on darwin. This
1302	 should be looked into some more */
1303#      define NO_PTHREAD_TRYLOCK
1304#   endif /* DARWIN */
1305# endif
1306
1307# ifdef NS32K
1308#   define MACH_TYPE "NS32K"
1309#   define ALIGNMENT 4
1310    extern char **environ;
1311#   define DATASTART ((ptr_t)(&environ))
1312			      /* hideous kludge: environ is the first   */
1313			      /* word in crt0.o, and delimits the start */
1314			      /* of the data segment, no matter which   */
1315			      /* ld options were passed through.        */
1316#   define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */
1317# endif
1318
1319# ifdef MIPS
1320#   define MACH_TYPE "MIPS"
1321#   ifdef LINUX
1322      /* This was developed for a linuxce style platform.  Probably	*/
1323      /* needs to be tweaked for workstation class machines.		*/
1324#     define OS_TYPE "LINUX"
1325#     define DYNAMIC_LOADING
1326      extern int _end[];
1327#     define DATAEND (_end)
1328      extern int __data_start[];
1329#     define DATASTART ((ptr_t)(__data_start))
1330#     ifdef _MIPS_SZPTR
1331#	define CPP_WORDSZ _MIPS_SZPTR
1332#	define ALIGNMENT (_MIPS_SZPTR/8)
1333#     else
1334#	define ALIGNMENT 4
1335#     endif
1336#     if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
1337#        define LINUX_STACKBOTTOM
1338#     else
1339#        define STACKBOTTOM 0x80000000
1340#     endif
1341#   endif /* Linux */
1342#   ifdef EWS4800
1343#      define HEURISTIC2
1344#      if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
1345         extern int _fdata[], _end[];
1346#        define DATASTART ((ptr_t)_fdata)
1347#        define DATAEND ((ptr_t)_end)
1348#        define CPP_WORDSZ _MIPS_SZPTR
1349#        define ALIGNMENT (_MIPS_SZPTR/8)
1350#      else
1351         extern int etext[], edata[], end[];
1352         extern int _DYNAMIC_LINKING[], _gp[];
1353#        define DATASTART ((ptr_t)((((word)etext + 0x3ffff) & ~0x3ffff) \
1354               + ((word)etext & 0xffff)))
1355#        define DATAEND (edata)
1356#        define DATASTART2 (_DYNAMIC_LINKING \
1357               ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
1358               : (ptr_t)edata)
1359#        define DATAEND2 (end)
1360#        define ALIGNMENT 4
1361#      endif
1362#      define OS_TYPE "EWS4800"
1363#   endif
1364#   ifdef ULTRIX
1365#	define HEURISTIC2
1366#       define DATASTART (ptr_t)0x10000000
1367			      /* Could probably be slightly higher since */
1368			      /* startup code allocates lots of stuff.   */
1369#	define OS_TYPE "ULTRIX"
1370#       define ALIGNMENT 4
1371#   endif
1372#   ifdef IRIX5
1373#	define HEURISTIC2
1374        extern int _fdata[];
1375#       define DATASTART ((ptr_t)(_fdata))
1376#       ifdef USE_MMAP
1377#         define HEAP_START (ptr_t)0x30000000
1378#       else
1379#	  define HEAP_START DATASTART
1380#       endif
1381			      /* Lowest plausible heap address.		*/
1382			      /* In the MMAP case, we map there.	*/
1383			      /* In either case it is used to identify	*/
1384			      /* heap sections so they're not 		*/
1385			      /* considered as roots.			*/
1386#	define OS_TYPE "IRIX5"
1387/*#       define MPROTECT_VDB DOB: this should work, but there is evidence */
1388/* 	  	of recent breakage.					   */
1389#       ifdef _MIPS_SZPTR
1390#	  define CPP_WORDSZ _MIPS_SZPTR
1391#	  define ALIGNMENT (_MIPS_SZPTR/8)
1392#	else
1393#         define ALIGNMENT 4
1394#	endif
1395#	define DYNAMIC_LOADING
1396#   endif
1397#   ifdef MSWINCE
1398#       define OS_TYPE "MSWINCE"
1399#       define ALIGNMENT 4
1400#       define DATAEND /* not needed */
1401#   endif
1402#   if defined(NETBSD)
1403#     define OS_TYPE "NETBSD"
1404#     define ALIGNMENT 4
1405#     define HEURISTIC2
1406#     ifdef __ELF__
1407        extern int etext[];
1408#       define DATASTART GC_data_start
1409#       define NEED_FIND_LIMIT
1410#       define DYNAMIC_LOADING
1411#     else
1412#       define DATASTART ((ptr_t) 0x10000000)
1413#       define STACKBOTTOM ((ptr_t) 0x7ffff000)
1414#     endif /* _ELF_ */
1415#  endif
1416#  if defined(NONSTOP)
1417#    define CPP_WORDSZ 32
1418#    define OS_TYPE "NONSTOP"
1419#    define ALIGNMENT 4
1420#    define DATASTART ((ptr_t) 0x08000000)
1421     extern char **environ;
1422#    define DATAEND ((ptr_t)(environ - 0x10))
1423#    define STACKBOTTOM ((ptr_t) 0x4fffffff)
1424#   endif
1425# endif
1426
1427# ifdef HP_PA
1428#   define MACH_TYPE "HP_PA"
1429#   ifdef __LP64__
1430#     define CPP_WORDSZ 64
1431#     define ALIGNMENT 8
1432#   else
1433#     define CPP_WORDSZ 32
1434#     define ALIGNMENT 4
1435#   endif
1436#   if !defined(GC_HPUX_THREADS) && !defined(GC_LINUX_THREADS)
1437#     ifndef LINUX /* For now. */
1438#       define MPROTECT_VDB
1439#     endif
1440#   else
1441#     ifdef PARALLEL_MARK
1442#	define USE_MARK_BYTES
1443		/* Minimize compare-and-swap usage.		*/
1444#     endif
1445#   endif
1446#   define STACK_GROWS_UP
1447#   ifdef HPUX
1448#     define OS_TYPE "HPUX"
1449      extern int __data_start[];
1450#     define DATASTART ((ptr_t)(__data_start))
1451#     if 0
1452	/* The following appears to work for 7xx systems running HP/UX	*/
1453	/* 9.xx Furthermore, it might result in much faster		*/
1454	/* collections than HEURISTIC2, which may involve scanning	*/
1455	/* segments that directly precede the stack.  It is not the	*/
1456	/* default, since it may not work on older machine/OS		*/
1457	/* combinations. (Thanks to Raymond X.T. Nijssen for uncovering	*/
1458	/* this.)							*/
1459#       define STACKBOTTOM ((ptr_t) 0x7b033000)  /* from /etc/conf/h/param.h */
1460#     else
1461	/* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2	*/
1462	/* to this.  Note that the GC must be initialized before the	*/
1463    	/* first putenv call.						*/
1464	extern char ** environ;
1465#       define STACKBOTTOM ((ptr_t)environ)
1466#     endif
1467#     define DYNAMIC_LOADING
1468#     include <unistd.h>
1469#     define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
1470#     ifndef __GNUC__
1471#       define PREFETCH(x)  { \
1472                              register long addr = (long)(x); \
1473                              (void) _asm ("LDW", 0, 0, addr, 0); \
1474                            }
1475#     endif
1476#   endif /* HPUX */
1477#   ifdef LINUX
1478#     define OS_TYPE "LINUX"
1479#     define LINUX_STACKBOTTOM
1480#     define DYNAMIC_LOADING
1481#     define SEARCH_FOR_DATA_START
1482      extern int _end[];
1483#     define DATAEND (&_end)
1484#   endif /* LINUX */
1485# endif /* HP_PA */
1486
1487# ifdef ALPHA
1488#   define MACH_TYPE "ALPHA"
1489#   define ALIGNMENT 8
1490#   define CPP_WORDSZ 64
1491#   ifdef NETBSD
1492#	define OS_TYPE "NETBSD"
1493#	define HEURISTIC2
1494#	define DATASTART GC_data_start
1495#	define ELFCLASS32 32
1496#	define ELFCLASS64 64
1497#	define ELF_CLASS ELFCLASS64
1498#       define DYNAMIC_LOADING
1499#   endif
1500#   ifdef OPENBSD
1501#	define OS_TYPE "OPENBSD"
1502#	define HEURISTIC2
1503#   	ifdef __ELF__	/* since OpenBSD/Alpha 2.9 */
1504#	   define DATASTART GC_data_start
1505#   	   define ELFCLASS32 32
1506#   	   define ELFCLASS64 64
1507#   	   define ELF_CLASS ELFCLASS64
1508#       else		/* ECOFF, until OpenBSD/Alpha 2.7 */
1509#   	   define DATASTART ((ptr_t) 0x140000000)
1510#   	endif
1511#   endif
1512#   ifdef FREEBSD
1513#	define OS_TYPE "FREEBSD"
1514/* MPROTECT_VDB is not yet supported at all on FreeBSD/alpha. */
1515#	define SIG_SUSPEND SIGUSR1
1516#	define SIG_THR_RESTART SIGUSR2
1517#	define FREEBSD_STACKBOTTOM
1518#	ifdef __ELF__
1519#	    define DYNAMIC_LOADING
1520#	endif
1521/* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
1522	extern char etext[];
1523	extern char edata[];
1524	extern char end[];
1525#	define NEED_FIND_LIMIT
1526#	define DATASTART ((ptr_t)(&etext))
1527#	define DATAEND (GC_find_limit (DATASTART, TRUE))
1528#	define DATASTART2 ((ptr_t)(&edata))
1529#	define DATAEND2 ((ptr_t)(&end))
1530#   endif
1531#   ifdef OSF1
1532#	define OS_TYPE "OSF1"
1533#   	define DATASTART ((ptr_t) 0x140000000)
1534	extern int _end[];
1535#   	define DATAEND ((ptr_t) &_end)
1536 	extern char ** environ;
1537	/* round up from the value of environ to the nearest page boundary */
1538	/* Probably breaks if putenv is called before collector 	   */
1539	/* initialization.						   */
1540#	define STACKBOTTOM ((ptr_t)(((word)(environ) | (getpagesize()-1))+1))
1541/* #   	define HEURISTIC2 */
1542	/* Normally HEURISTIC2 is too conervative, since		*/
1543	/* the text segment immediately follows the stack.		*/
1544	/* Hence we give an upper pound.				*/
1545	/* This is currently unused, since we disabled HEURISTIC2	*/
1546    	extern int __start[];
1547#   	define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1)))
1548#	ifndef GC_OSF1_THREADS
1549	  /* Unresolved signal issues with threads.	*/
1550#   	  define MPROTECT_VDB
1551#       endif
1552#   	define DYNAMIC_LOADING
1553#   endif
1554#   ifdef LINUX
1555#       define OS_TYPE "LINUX"
1556#       define LINUX_STACKBOTTOM
1557#       ifdef __ELF__
1558#	  define SEARCH_FOR_DATA_START
1559#         define DYNAMIC_LO…

Large files files are truncated, but you can click here to view the full file