This is a rough history of garbage collector bugs and versions.

This has been maintained with varying diligence over the years.

I made an attempt to include recent contributors here.  I apologize for any
omissions.

-------------------------

  Version 1.3 and immediately preceding versions contained spurious
assembly language assignments to TMP_SP.  Only the assignment in the PC/RT
code is necessary.  On other machines, with certain compiler options,
the assignments can lead to an unsaved register being overwritten.
Known to cause problems under SunOS 3.5 WITHOUT the -O option.  (With
-O the compiler recognizes it as dead code.  It probably shouldn't,
but that's another story.)

  Version 1.4 and earlier versions used compile time determined values
for the stack base.  This no longer works on Sun 3s, since Sun 3/80s use
a different stack base.  We now use a straightforward heuristic on all
machines on which it is known to work (incl. Sun 3s) and compile-time
determined values for the rest.  There should really be library calls
to determine such values.

  Version 1.5 and earlier did not ensure 8 byte alignment for objects
allocated on a sparc based machine.

  Version 1.8 added ULTRIX support in gc_private.h.
  
  Version 1.9 fixed a major bug in gc_realloc.
  
  Version 2.0 introduced a consistent naming convention for collector
routines and added support for registering dynamic library data segments
in the standard mark_roots.c.  Most of the data structures were revamped.
The treatment of interior pointers was completely changed.  Finalization
was added.  Support for locking was added.  Object kinds were added.
We added a black listing facility to avoid allocating at addresses known
to occur as integers somewhere in the address space.  Much of this
was accomplished by adapting ideas and code from the PCR collector.
The test program was changed and expanded.

  Version 2.1 was the first stable version since 1.9, and added support
for PPCR.

  Version 2.2 added debugging allocation, and fixed various bugs.  Among them:
- GC_realloc could fail to extend the size of the object for certain large object sizes.
- A blatant subscript range error in GC_printf, which unfortunately
  wasn't exercised on machines with sufficient stack alignment constraints.
- GC_register_displacement did the wrong thing if it was called after
  any allocation had taken place.
- The leak finding code would eventually break after 2048 byte
  byte objects leaked.
- interface.c didn't compile.
- The heap size remained much too small for large stacks.
- The stack clearing code behaved badly for large stacks, and perhaps
  on HP/PA machines.

  Version 2.3 added ALL_INTERIOR_POINTERS and fixed the following bugs:
- Missing declaration of etext in the A/UX version.
- Some PCR root-finding problems.
- Blacklisting was not 100% effective, because the plausible future
  heap bounds were being miscalculated.
- GC_realloc didn't handle out-of-memory correctly.
- GC_base could return a nonzero value for addresses inside free blocks.
- test.c wasn't really thread safe, and could erroneously report failure
  in a multithreaded environment.  (The locking primitives need to be
  replaced for other threads packages.)
- GC_CONS was thoroughly broken.
- On a SPARC with dynamic linking, signals stayed diabled while the
  client code was running.
  (Thanks to Manuel Serrano at INRIA for reporting the last two.)
  
  Version 2.4 added GC_free_space_divisor as a tuning knob, added
  support for OS/2 and linux, and fixed the following bugs:
- On machines with unaligned pointers (e.g. Sun 3), every 128th word could
  fail to be considered for marking.
- Dynamic_load.c erroneously added 4 bytes to the length of the data and
  bss sections of the dynamic library.  This could result in a bad memory
  reference if the actual length was a multiple of a page.  (Observed on
  Sun 3.  Can probably also happen on a Sun 4.)
  (Thanks to Robert Brazile for pointing out that the Sun 3 version
  was broken.  Dynamic library handling is still broken on Sun 3s
  under 4.1.1U1, but apparently not 4.1.1.  If you have such a machine,
  use -Bstatic.)
  
  Version 2.5 fixed the following bugs:
- Removed an explicit call to exit(1)
- Fixed calls to GC_printf and GC_err_printf, so the correct number of
  arguments are always supplied.  The OS/2 C compiler gets confused if
  the number of actuals and the number of formals differ.  (ANSI C
  doesn't require this to work.  The ANSI sanctioned way of doing things
  causes too many compatibility problems.)
  
  Version 3.0  added generational/incremental collection and stubborn
  objects.

  Version 3.1 added the following features:
- A workaround for a SunOS 4.X SPARC C compiler
  misfeature that caused problems when the collector was turned into
  a dynamic library.  
- A fix for a bug in GC_base that could result in a memory fault.
- A fix for a performance bug (and several other misfeatures) pointed
  out by Dave Detlefs and Al Dosser.
- Use of dirty bit information for static data under Solaris 2.X.
- DEC Alpha/OSF1 support (thanks to Al Dosser).
- Incremental collection on more platforms.
- A more refined heap expansion policy.  Less space usage by default.
- Various minor enhancements to reduce space usage, and to reduce
  the amount of memory scanned by the collector.
- Uncollectable allocation without per object overhead.
- More conscientious handling of out-of-memory conditions.
- Fixed a bug in debugging stubborn allocation.
- Fixed a bug that resulted in occasional erroneous reporting of smashed
  objects with debugging allocation.
- Fixed bogus leak reports of size 4096 blocks with FIND_LEAK.

  Version 3.2 fixed a serious and not entirely repeatable bug in
  the incremental collector.  It appeared only when dirty bit info
  on the roots was available, which is normally only under Solaris.
  It also added GC_general_register_disappearing_link, and some
  testing code.  Interface.c disappeared.

  Version 3.3 fixes several bugs and adds new ports:
- PCR-specific bugs.
- Missing locking in GC_free, redundant FASTUNLOCK
  in GC_malloc_stubborn, and 2 bugs in
  GC_unregister_disappearing_link.
  All of the above were pointed out by Neil Sharman
  (neil@cs.mu.oz.au).
- Common symbols allocated by the SunOS4.X dynamic loader
  were not included in the root set.
- Bug in GC_finalize (reported by Brian Beuning and Al Dosser)
- Merged Amiga port from Jesper Peterson (untested)
- Merged NeXT port from Thomas Funke (significantly
  modified and untested)

  Version 3.4:
- Fixed a performance bug in GC_realloc.
- Updated the amiga port.
- Added NetBSD and 386BSD ports.
- Added cord library.
- Added trivial performance enhancement for
  ALL_INTERIOR_POINTERS.  (Don't scan last word.)
  
  Version 3.5
- Minor collections now mark from roots only once, if that
  doesn't cause an excessive pause.
- The stack clearing heuristic was refined to prevent anomalies
  with very heavily recursive programs and sparse stacks.
- Fixed a bug that prevented mark stack growth in some cases.
  GC_objects_are_marked should be set to TRUE after a call
  to GC_push_roots and as part of GC_push_marked, since
  both can now set mark bits.  I think this is only a performance
  bug, but I wouldn't bet on it.  It's certainly very hard to argue
  that the old version was correct.
- Fixed an incremental collection bug that prevented it from
  working at all when HBLKSIZE != getpagesize()
- Changed dynamic_loading.c to include gc_priv.h before testing
  DYNAMIC_LOADING.  SunOS dynamic library scanning
  must have been broken in 3.4.
- Object size rounding now adapts to program behavior.
- Added a workaround (provided by Manuel Serrano and
  colleagues) to a long-standing SunOS 4.X (and 3.X?) ld bug
  that I had incorrectly assumed to have been squished.
  The collector was broken if the text segment size was within
  32 bytes of a multiple of 8K bytes, and if the beginning of
  the data segment contained interesting roots.  The workaround
  assumes a demand-loadable executable.  The original may have
  have "worked" in some other cases.
- Added dynamic library support under IRIX5.
- Added support for EMX under OS/2 (thanks to Ari Huttunen).
  
Version 3.6:
- fixed a bug in the mark stack growth code that was introduced
  in 3.4.
- fixed Makefile to work around DEC AXP compiler tail recursion
  bug.

Version 3.7:
- Added a workaround for an HP/UX compiler bug.
- Fixed another stack clearing performance bug.  Reworked
  that code once more.
  
Version 4.0:
- Added support for Solaris threads (which was possible
  only by reimplementing some fraction of Solaris threads,
  since Sun doesn't currently make the thread debugging
  interface available).
- Added non-threads win32 and win32S support.
- (Grudgingly, with suitable muttering of obscenities) renamed
  files so that the collector distribution could live on a FAT
  file system.  Files that are guaranteed to be useless on
  a PC still have long names.  Gc_inline.h and gc_private.h
  still exist, but now just include  gc_inl.h and gc_priv.h.
- Fixed a really obscure bug in finalization that could cause
  undetected mark stack overflows.  (I would be surprised if
  any real code ever tickled this one.)
- Changed finalization code to dynamically resize the hash
  tables it maintains.  (This probably does not matter for well-
  -written code.  It no doubt does for C++ code that overuses
  destructors.)
- Added typed allocation primitives.  Rewrote the marker to
  accommodate them with more reasonable efficiency.  This
  change should also speed up marking for GC_malloc allocated
  objects a little.  See gc_typed.h for new primitives.
- Improved debugging facilities slightly.  Allocation time
  stack traces are now kept by default on SPARC/SUNOS4.
  (Thanks to Scott Schwartz.)
- Added better support for small heap applications.
- Significantly extended cord package.  Fixed a bug in the
  implementation of lazily read files.  Printf and friends now
  have cord variants.  Cord traversals are a bit faster.
- Made ALL_INTERIOR_POINTERS recognition the default.
- Fixed de so that it can run in constant space, independent
  of file size.  Added simple string searching to cords and de.
- Added the Hull-Ellis C++ interface.
- Added dynamic library support for OSF/1.
  (Thanks to Al Dosser and Tim Bingham at DEC.)
- Changed argument to GC_expand_hp to be expressed
  in units of bytes instead of heap blocks.  (Necessary
  since the heap block size now varies depending on
  configuration.  The old version was never very clean.)
- Added GC_get_heap_size().  The previous "equivalent"
  was broken.
- Restructured the Makefile a bit.  

Since version 4.0:
- Changed finalization implementation to guarantee that
  finalization procedures are called outside of the allocation
  lock, making direct use of the interface a little less dangerous.
  MAY BREAK EXISTING CLIENTS that assume finalizers
  are protected by a lock.  Since there seem to be few multithreaded
  clients that use finalization, this is hopefully not much of
  a problem.
- Fixed a gross bug in CORD_prev.
- Fixed a bug in blacklst.c that could result in unbounded
  heap growth during startup on machines that do not clear
  memory obtained from the OS (e.g. win32S).
- Ported de editor to win32/win32S.  (This is now the only
  version with a mouse-sensitive UI.)
- Added GC_malloc_ignore_off_page to allocate large arrays
  in the presence of ALL_INTERIOR_POINTERS.
- Changed GC_call_with_alloc_lock to not disable signals in
  the single-threaded case.
- Reduced retry count in GC_collect_or_expand for garbage
  collecting when out of memory.
- Made uncollectable allocations bypass black-listing, as they
  should.
- Fixed a bug in typed_test in test.c that could cause (legitimate)
  GC crashes.
- Fixed some potential synchronization problems in finalize.c
- Fixed a real locking problem in typd_mlc.c.
- Worked around an AIX 3.2 compiler feature that results in
  out of bounds memory references.
- Partially worked around an IRIX5.2 beta problem (which may
  or may not persist to the final release).
- Fixed a bug in the heap integrity checking code that could
  result in explicitly deallocated objects being identified as
  smashed.  Fixed a bug in the dbg_mlc stack saving code
  that caused old argument pointers to be considered live.
- Fixed a bug in CORD_ncmp (and hence CORD_str).
- Repaired the OS2 port, which had suffered from bit rot
  in 4.0.  Worked around what appears to be CSet/2 V1.0
  optimizer bug.
- Fixed a Makefile bug for target "c++".

Since version 4.1:
- Multiple bug fixes/workarounds in the Solaris threads version.
  (It occasionally failed to locate some register contents for
  marking.  It also turns out that thr_suspend and friends are
  unreliable in Solaris 2.3.  Dirty bit reads appear
  to be unreliable under some weird 
  circumstances.  My stack marking code
  contained a serious performance bug.  The new code is
  extremely defensive, and has not failed in several cpu
  hours of testing.  But  no guarantees ...)
- Added MacOS support (thanks to Patrick Beard.)
- Fixed several syntactic bugs in gc_c++.h and friends.  (These
  didn't bother g++, but did bother most other compilers.)
  Fixed gc_c++.h finalization interface.  (It didn't.)
- 64 bit alignment for allocated objects was not guaranteed in a
  few cases in which it should have been.
- Added GC_malloc_atomic_ignore_off_page.
- Added GC_collect_a_little.
- Added some prototypes to gc.h.
- Some other minor bug fixes (notably in Makefile).
- Fixed OS/2 / EMX port (thanks to Ari Huttunen).
- Fixed AmigaDOS port. (thanks to Michel Schinz).
- Fixed the DATASTART definition under Solaris.  There
  was a 1 in 16K chance of the collector missing the first
  64K of static data (and thus crashing).
- Fixed some blatant anachronisms in the README file.
- Fixed PCR-Makefile for upcoming PPCR release.

Since version 4.2:
- Fixed SPARC alignment problem with GC_DEBUG.
- Fixed Solaris threads /proc workaround.  The real
  problem was an interaction with mprotect.
- Incorporated fix from Patrick Beard for gc_c++.h (now gc_cpp.h).
- Slightly improved allocator space utilization by
  fixing the GC_size_map mechanism.
- Integrated some Sony News and MIPS RISCos 4.51
  patches.  (Thanks to Nobuyuki Hikichi of
  Software Research Associates, Inc. Japan)
- Fixed HP_PA alignment problem.  (Thanks to
  xjam@cork.cs.berkeley.edu.)
- Added GC_same_obj and friends.  Changed GC_base
  to return 0 for pointers past the end of large objects.
  Improved GC_base performance with ALL_INTERIOR_POINTERS
  on machines with a slow integer mod operation.
  Added GC_PTR_ADD, GC_PTR_STORE, etc. to prepare
  for preprocessor.
- changed the default on most UNIX machines to be that
  signals are not disabled during critical GC operations.
  This is still ANSI-conforming, though somewhat dangerous
  in the presence of signal handlers. But the performance
  cost of the alternative is sometimes problematic.
  Can be changed back with a minor Makefile edit.
- renamed IS_STRING in gc.h, to CORD_IS_STRING, thus
  following my own naming convention.  Added the function
  CORD_to_const_char_star.
- Fixed a gross bug in GC_finalize.  Symptom: occasional
  address faults in that function.  (Thanks to Anselm
  Baird-Smith (Anselm.BairdSmith@inria.fr)
- Added port to ICL DRS6000 running DRS/NX.  Restructured
  things a bit to factor out common code, and remove obsolete
  code.  Collector should now run under SUNOS5 with either
  mprotect or /proc dirty bits.  (Thanks to Douglas Steel
  (doug@wg.icl.co.uk)).
- More bug fixes and workarounds for Solaris 2.X.  (These were
  mostly related to putting the collector in a dynamic library,
  which didn't really work before.  Also SOLARIS_THREADS
  didn't interact well with dl_open.)  Thanks to btlewis@eng.sun.com.
- Fixed a serious performance bug on the DEC Alpha.  The text
  segment was getting registered as part of the root set.
  (Amazingly, the result was still fast enough that the bug
  was not conspicuous.) The fix works on OSF/1, version 1.3.
  Hopefully it also works on other versions of OSF/1 ...
- Fixed a bug in GC_clear_roots.
- Fixed a bug in GC_generic_malloc_words_small that broke
  gc_inl.h.  (Reported by Antoine de Maricourt.  I broke it
  in trying to tweak the Mac port.) 
- Fixed some problems with cord/de under Linux.
- Fixed some cord problems, notably with CORD_riter4.
- Added DG/UX port.
  Thanks to Ben A. Mesander (ben@piglet.cr.usgs.gov)
- Added finalization registration routines with weaker ordering
  constraints.  (This is necessary for C++ finalization with
  multiple inheritance, since the compiler often adds self-cycles.)
- Filled the holes in the SCO port. (Thanks to Michael Arnoldus
  <chime@proinf.dk>.)
- John Ellis' additions to the C++ support:  From John:

* I completely rewrote the documentation in the interface gc_c++.h
(later renamed gc_cpp.h).  I've tried to make it both clearer and more
precise.

* The definition of accessibility now ignores pointers from an
finalizable object (an object with a clean-up function) to itself.
This allows objects with virtual base classes to be finalizable by the
collector.  Compilers typically implement virtual base classes using
pointers from an object to itself, which under the old definition of
accessibility prevented objects with virtual base classes from ever
being collected or finalized.

* gc_cleanup now includes gc as a virtual base.  This was enabled by
the change in the definition of accessibility.

* I added support for operator new[].  Since most (all?) compilers
don't yet support operator new[], it is conditionalized on
-DOPERATOR_NEW_ARRAY.  The code is untested, but its trivial and looks
correct.

* The test program test_gc_c++ (later renamed test_cpp.cc)
tries to test for the C++-specific functionality not tested by the
other programs.
- Added <unistd.h> include to misc.c.  (Needed for ppcr.)
- Added PowerMac port. (Thanks to Patrick Beard again.)
- Fixed "srcdir"-related Makefile problems.  Changed things so
  that all externally visible include files always appear in the
  include subdirectory of the source.  Made gc.h directly
  includable from C++ code.  (These were at Per
  Bothner's suggestion.)
- Changed Intel code to also mark from ebp (Kevin Warne's
  suggestion).
- Renamed C++ related files so they could live in a FAT
  file system. (Charles Fiterman's suggestion.)
- Changed Windows NT Makefile to include C++ support in
  gc.lib.  Added C++ test as Makefile target.
  
Since version 4.3:
 - ASM_CLEAR_CODE was erroneously defined for HP
   PA machines, resulting in a compile error.
 - Fixed OS/2 Makefile to create a library.  (Thanks to
   Mark Boulter (mboulter@vnet.ibm.com)).
 - Gc_cleanup objects didn't work if they were created on
   the stack.  Fixed.
 - One copy of Gc_cpp.h in the distribution was out of 
   synch, and failed to document some known compiler
   problems with explicit destructor invocation.  Partially
   fixed.  There are probably other compilers on which
   gc_cleanup is miscompiled.
 - Fixed Makefile to pass C compiler flags to C++ compiler.
 - Added Mac fixes.
 - Fixed os_dep.c to work around what appears to be
   a new and different VirtualQuery bug under newer
   versions of win32S.
 - GC_non_gc_bytes was not correctly maintained by
   GC_free.  Fixed.  Thanks to James Clark (jjc@jclark.com).
 - Added GC_set_max_heap_size.
 - Changed allocation code to ignore blacklisting if it is preventing
   use of a very large block of memory.  This has the advantage
   that naive code allocating very large objects is much more
   likely to work.  The downside is you might no
   longer find out that such code should really use
   GC_malloc_ignore_off_page.
 - Changed GC_printf under win32 to close and reopen the file
   between calls.  FAT file systems otherwise make the log file
   useless for debugging.
 - Added GC_try_to_collect and GC_get_bytes_since_gc.  These
   allow starting an abortable collection during idle times. 
   This facility does not require special OS support.  (Thanks to
   Michael Spertus of Geodesic Systems for suggesting this.  It was
   actually an easy addition.  Kumar Srikantan previously added a similar
   facility to a now ancient version of the collector.  At the time
   this was much harder, and the result was less convincing.)
 - Added some support for the Borland development environment.  (Thanks
   to John Ellis and Michael Spertus.)
 - Removed a misfeature from checksums.c that caused unexpected 
   heap growth.  (Thanks to Scott Schwartz.)
 - Changed finalize.c to call WARN if it encounters a finalization cycle.
   WARN is defined in gc_priv.h to write a message, usually to stdout.
   In many environments, this may be inappropriate.
 - Renamed NO_PARAMS in gc.h to GC_NO_PARAMS, thus adhering to my own
   naming convention.
 - Added GC_set_warn_proc to intercept warnings.
 - Fixed Amiga port. (Thanks to Michel Schinz (schinz@alphanet.ch).)
 - Fixed a bug in mark.c that could result in an access to unmapped
   memory from GC_mark_from_mark_stack on machines with unaligned
   pointers.
 - Fixed a win32 specific performance bug that could result in scanning of
   objects allocated with the system malloc.
 - Added REDIRECT_MALLOC.

Since version 4.4:
 - Fixed many minor and one major README bugs. (Thanks to Franklin Chen
   (chen@adi.com) for pointing out many of them.)
 - Fixed ALPHA/OSF/1 dynamic library support. (Thanks to Jonathan Bachrach
   (jonathan@harlequin.com)).
 - Added incremental GC support (MPROTECT_VDB) for Linux (with some
   help from Bruno Haible).
 - Altered SPARC recognition tests in gc.h and config.h (mostly as
   suggested by Fergus Henderson).
 - Added basic incremental GC support for win32, as implemented by
   Windows NT and Windows 95.  GC_enable_incremental is a noop
   under win32s, which doesn't implement enough of the VM interface.
 - Added -DLARGE_CONFIG.
 - Fixed GC_..._ignore_off_page to also function without
   -DALL_INTERIOR_POINTERS.
 - (Hopefully) fixed RS/6000 port.  (Only the test was broken.)
 - Fixed a performance bug in the nonincremental collector running
   on machines supporting incremental collection with MPROTECT_VDB
   (e.g. SunOS 4, DEC AXP).  This turned into a correctness bug under
   win32s with win32 incremental collection.  (Not all memory protection
   was disabled.)
 - Fixed some ppcr related bit rot.
 - Caused dynamic libraries to be unregistered before reregistering.
   The old way turned out to be a performance bug on some machines.
 - GC_root_size was not properly maintained under MSWIN32.
 - Added -DNO_DEBUGGING and GC_dump.
 - Fixed a couple of bugs arising with SOLARIS_THREADS +
   REDIRECT_MALLOC.
 - Added NetBSD/M68K port.  (Thanks to Peter Seebach
   <seebs@taniemarie.solon.com>.)
 - Fixed a serious realloc bug.  For certain object sizes, the collector
   wouldn't scan the expanded part of the object.  (Thanks to Clay Spence
   (cds@peanut.sarnoff.com) for noticing the problem, and helping me to
   track it down.)
   
Since version 4.5:
 - Added Linux ELF support.  (Thanks to Arrigo Triulzi <arrigo@ic.ac.uk>.)
 - GC_base crashed if it was called before any other GC_ routines.
   This could happen if a gc_cleanup object was allocated outside the heap
   before any heap allocation.
 - The heap expansion heuristic was not stable if all objects had finalization
   enabled.  Fixed finalize.c to count memory in finalization queue and
   avoid explicit deallocation.  Changed alloc.c to also consider this count.
   (This is still not recommended.  It's expensive if nothing else.)  Thanks
   to John Ellis for pointing this out.
 - GC_malloc_uncollectable(0) was broken.  Thanks to Phong Vo for pointing
   this out.
 - The collector didn't compile under Linux 1.3.X.  (Thanks to Fred Gilham for
   pointing this out.)  The current workaround is ugly, but expected to be
   temporary.
 - Fixed a formatting problem for SPARC stack traces.
 - Fixed some '=='s in os_dep.c that should have been assignments.
   Fortunately these were in code that should never be executed anyway.
   (Thanks to Fergus Henderson.)
 - Fixed the heap block allocator to only drop blacklisted blocks in small
   chunks.  Made BL_LIMIT self adjusting.  (Both of these were in response
   to heap growth observed by Paul Graham.)
 - Fixed the Metrowerks/68K Mac code to also mark from a6.  (Thanks
   to Patrick Beard.)
 - Significantly updated README.debugging.
 - Fixed some problems with longjmps out of signal handlers, especially under
   Solaris.  Added a workaround for the fact that siglongjmp doesn't appear to
   do the right thing with -lthread under Solaris.
 - Added MSDOS/djgpp port.  (Thanks to Mitch Harris  (maharri@uiuc.edu).)
 - Added "make reserved_namespace" and "make user_namespace".  The
   first renames ALL "GC_xxx" identifiers as "_GC_xxx".  The second is the
   inverse transformation.  Note that doing this is guaranteed to break all
   clients written for the other names.
 - descriptor field for kind NORMAL in GC_obj_kinds with ADD_BYTE_AT_END
   defined should be -ALIGNMENT not WORDS_TO_BYTES(-1).  This is
   a serious bug on machines with pointer alignment of less than a word.
 - GC_ignore_self_finalize_mark_proc didn't handle pointers to very near the
   end of the object correctly.  Caused failures of the C++ test on a DEC Alpha
   with g++.
 - gc_inl.h still had problems.  Partially fixed.  Added warnings at the
   beginning to hopefully specify the remaining dangers.
 - Added DATAEND definition to config.h.
 - Fixed some of the .h file organization.  Fixed "make floppy".
 
Since version 4.6:
 - Fixed some compilation problems with -DCHECKSUMS (thanks to Ian Searle)
 - Updated some Mac specific files to synchronize with Patrick Beard.
 - Fixed a serious bug for machines with non-word-aligned pointers.
   (Thanks to Patrick Beard for pointing out the problem.  The collector
   should fail almost any conceivable test immediately on such machines.)

Since version 4.7:
 - Changed a "comment" in a MacOS specific part of mach-dep.c that caused
   gcc to fail on other platforms.

Since version 4.8
 - More README.debugging fixes.
 - Objects ready for finalization, but not finalized in the same GC
   cycle, could be prematurely collected.  This occasionally happened
   in test_cpp.
 - Too little memory was obtained from the system for very large
   objects.  That could cause a heap explosion if these objects were
   not contiguous (e.g. under PCR), and too much of them was blacklisted.
 - Due to an improper initialization, the collector was too hesitant to
   allocate blacklisted objects immediately after system startup.
 - Moved GC_arrays from the data into the bss segment by not explicitly
   initializing it to zero.  This significantly
   reduces the size of executables, and probably avoids some disk accesses
   on program startup.  It's conceivable that it might break a port that I
   didn't test.
 - Fixed EMX_MAKEFILE to reflect the gc_c++.h to gc_cpp.h renaming which
   occurred a while ago.

Since 4.9:
 - Fixed a typo around a call to GC_collect_or_expand in alloc.c.  It broke
   handling of out of memory.  (Thanks to Patrick Beard for noticing.)

Since 4.10:
 - Rationalized (hopefully) GC_try_to_collect in an incremental collection
   environment.  It appeared to not handle a call while a collection was in
   progress, and was otherwise too conservative.
 - Merged GC_reclaim_or_delete_all into GC_reclaim_all to get rid of some
   code.
 - Added Patrick Beard's Mac fixes, with substantial completely untested
   modifications.
 - Fixed the MPROTECT_VDB code to deal with large pages and imprecise
   fault addresses (as on an UltraSPARC running Solaris 2.5).  Note that this
   was not a problem in the default configuration, which uses PROC_VDB.
 - The DEC Alpha assembly code needed to restore $gp between calls.
   Thanks to Fergus Henderson for tracking this down and supplying a
   patch.
 - The write command for "de" was completely broken for large files.
   I used the easiest portable fix, which involved changing the semantics
   so that f.new is written instead of overwriting f.  That's safer anyway.
 - Added README.solaris2 with a discussion of the possible problems of
   mixing the collector's sbrk allocation with malloc/realloc.
 - Changed the data segment starting address for SGI machines.  The
   old code failed under IRIX6.
 - Required double word alignment for MIPS.
 - Various minor fixes to remove warnings.
 - Attempted to fix some Solaris threads problems reported by Zhiying Chen.
   In particular, the collector could try to fork a thread with the
   world stopped as part of GC_thr_init.  It also failed to deal with
   the case in which the original thread terminated before the whole
   process did.
 - Added -DNO_EXECUTE_PERMISSION.  This has a major performance impact
   on the incremental collector under Irix, and perhaps under other
   operating systems.
 - Added some code to support allocating the heap with mmap.  This may
   be preferable under some circumstances.
 - Integrated dynamic library support for HP.
   (Thanks to Knut Tvedten <knuttv@ifi.uio.no>.)
 - Integrated James Clark's win32 threads support, and made a number
   of changes to it, many of which were suggested by Pontus Rydin.
   This is still not 100% solid.
 - Integrated Alistair Crooks' support for UTS4 running on an Amdahl
   370-class machine.
 - Fixed a serious bug in explicitly typed allocation.  Objects requiring
   large descriptors where handled in a way that usually resulted in
   a segmentation fault in the marker.  (Thanks to Jeremy Fitzhardinge
   for helping to track this down.)
 - Added partial support for GNU win32 development.  (Thanks to Fergus
   Henderson.)
 - Added optional support for Java-style finalization semantics.  (Thanks
   to Patrick Bridges.)  This is recommended only for Java implementations.
 - GC_malloc_uncollectable faulted instead of returning 0 when out of
   memory.  (Thanks to dan@math.uiuc.edu for noticing.)
 - Calls to GC_base before the collector was initialized failed on a
   DEC Alpha.  (Thanks to Matthew Flatt.)
 - Added base pointer checking to GC_REGISTER_FINALIZER in debugging
   mode, at the suggestion of Jeremy Fitzhardinge.
 - GC_debug_realloc failed for uncollectable objects.  (Thanks to
   Jeremy Fitzhardinge.)
 - Explicitly typed allocation could crash if it ran out of memory.
   (Thanks to Jeremy Fitzhardinge.)
 - Added minimal support for a DEC Alpha running Linux.
 - Fixed a problem with allocation of objects whose size overflowed
   ptrdiff_t.  (This now fails unconditionally, as it should.)
 - Added the beginning of Irix pthread support.
 - Integrated Xiaokun Zhu's fixes for djgpp 2.01.
 - Added SGI-style STL allocator support (gc_alloc.h).
 - Fixed a serious bug in README.solaris2.  Multithreaded programs must include
   gc.h with SOLARIS_THREADS defined.
 - Changed GC_free so it actually deallocates uncollectable objects.
   (Thanks to Peter Chubb for pointing out the problem.)
 - Added Linux ELF support for dynamic libararies.  (Thanks again to
   Patrick Bridges.)
 - Changed the Borland cc configuration so that the assembler is not
   required.
 - Fixed a bug in the C++ test that caused it to fail in 64-bit
   environments.

Since 4.11:
 - Fixed ElfW definition in dyn_load.c. (Thanks to Fergus Henderson.)
   This prevented the dynamic library support from compiling on some
   older ELF Linux systems.
 - Fixed UTS4 port (which I apparently mangled during the integration)
   (Thanks to again to Alistair Crooks.)
 - "Make C++" failed on Suns with SC4.0, due to a problem with "bool".
   Fixed in gc_priv.h.
 - Added more pieces for GNU win32.  (Thanks to Timothy N. Newsham.)
   The current state of things should suffice for at least some
   applications.
 - Changed the out of memory retry count handling as suggested by
   Kenjiro Taura.  (This matters only if GC_max_retries > 0, which
   is no longer the default.)
 - If a /proc read failed repeatedly, GC_written_pages was not updated
   correctly.  (Thanks to Peter Chubb for diagnosing this.)
 - Under unlikely circumstances, the allocator could infinite loop in
   an out of memory situation.  (Thanks again to Kenjiro Taura for
   identifying the problem and supplying a fix.)
 - Fixed a syntactic error in the DJGPP code.  (Thanks to Fergus
   Henderson for finding this by inspection.)  Also fixed a test program
   problem with DJGPP (Thanks to Peter Monks.)
 - Atomic uncollectable objects were not treated correctly by the
   incremental collector.  This resulted in weird log statistics and
   occasional performance problems.  (Thanks to Peter Chubb for pointing
   this out.)
 - Fixed some problems resulting from compilers that dont define
   __STDC__.  In this case void * and char * were used inconsistently
   in some cases.  (Void * should not have been used at all.  If
   you have an ANSI superset compiler that does not define __STDC__,
   please compile with -D__STDC__=0. Thanks to Manuel Serrano and others
   for pointing out the problem.)
 - Fixed a compilation problem on Irix with -n32 and -DIRIX_THREADS.
   Also fixed some other IRIX_THREADS problems which may or may not have
   had observable symptoms.
 - Fixed an HP PA compilation problem in dyn_load.c.  (Thanks to
   Philippe Queinnec.)
 - SEGV fault handlers sometimes did not get reset correctly.  (Thanks
   to David Pickens.)
 - Added a fix for SOLARIS_THREADS on Intel.  (Thanks again to David
   Pickens.)  This probably needs more work to become functional.
 - Fixed struct sigcontext_struct in os_dep.c for compilation under
   Linux 2.1.X.	(Thanks to Fergus Henderson.)
 - Changed the DJGPP STACKBOTTOM and DATASTART values to those suggested
   by Kristian Kristensen.  These may still not be right, but it is
   it is likely to work more often than what was there before.  They may
   even be exactly right.
 - Added a #include <string.h> to test_cpp.cc.  This appears to help
   with HP/UX and gcc.  (Thanks to assar@sics.se.)
 - Version 4.11 failed to run in incremental mode on recent 64-bit Irix
   kernels.  This was a problem related to page unaligned heap segments.
   Changed the code to page align heap sections on all platforms.
   (I had mistakenly identified this as a kernel problem earlier.
   It was not.)
 - Version 4.11 did not make allocated storage executable, except on
   one or two platforms, due to a bug in a #if test.  (Thanks to Dave
   Grove for pointing this out.)
 - Added sparc_sunos4_mach_dep.s to support Sun's compilers under SunOS4.
 - Added GC_exclude_static_roots.
 - Fixed the object size mapping algorithm.  This shouldn't matter,
   but the old code was ugly.
 - Heap checking code could die if one of the allocated objects was
   larger than its base address.  (Unsigned underflow problem.  Thanks
   to Clay Spence for isolating the problem.)
 - Added RS6000 (AIX) dynamic library support and fixed STACK_BOTTOM.
   (Thanks to Fred Stearns.)
 - Added Fergus Henderson's patches for improved robustness with large
   heaps and lots of blacklisting.
 - Added Peter Chubb's changes to support Solaris Pthreads, to support
   MMAP allocation in Solaris, to allow Solaris to find dynamic libraries
   through /proc, to add malloc_typed_ignore_off_page, and a few other
   minor features and bug fixes.
 - The Solaris 2 port should not use sbrk.  I received confirmation from
   Sun that the use of sbrk and malloc in the same program is not
   supported.  The collector now defines USE_MMAP by default on Solaris.
 - Replaced the djgpp makefile with Gary Leavens' version.
 - Fixed MSWIN32 detection test.
 - Added Fergus Henderson's patches to allow putting the collector into
   a DLL under GNU win32.
 - Added Ivan V. Demakov's port to Watcom C on X86.
 - Added Ian Piumarta's Linux/PowerPC port.
 - On Brian Burton's suggestion added PointerFreeGC to the placement
   options in gc_cpp.h.  This is of course unsafe, and may be controversial.
   On the other hand, it seems to be needed often enough that it's worth
   adding as a standard facility.

Since 4.12:
 - Fixed a crucial bug in the Watcom port.  There was a redundant decl
   of GC_push_one in gc_priv.h.
 - Added FINALIZE_ON_DEMAND.
 - Fixed some pre-ANSI cc problems in test.c.
 - Removed getpagesize() use for Solaris.  It seems to be missing in one
   or two versions.
 - Fixed bool handling for SPARCCompiler version 4.2.
 - Fixed some files in include that had gotten unlinked from the main
   copy.
 - Some RS/6000 fixes (missing casts).  Thanks to Toralf Foerster.
 - Fixed several problems in GC_debug_realloc, affecting mostly the
   FIND_LEAK case.
 - GC_exclude_static_roots contained a buggy unsigned comparison to
   terminate a loop.  (Thanks to Wilson Ho.)
 - CORD_str failed if the substring occurred at the last possible position.
   (Only affects cord users.)
 - Fixed Linux code to deal with RedHat 5.0 and integrated Peter Bigot's
   os_dep.c code for dealing with various Linux versions.
 - Added workaround for Irix pthreads sigaction bug and possible signal
   misdirection problems.
Since alpha1:
 - Changed RS6000 STACKBOTTOM.
 - Integrated Patrick Beard's Mac changes.
 - Alpha1 didn't compile on Irix m.n, m < 6.
 - Replaced Makefile.dj with a new one from Gary Leavens.
 - Added Andrew Stitcher's changes to support SCO OpenServer.
 - Added PRINT_BLACK_LIST, to allow debugging of high densities of false
   pointers.
 - Added code to debug allocator to keep track of return address
   in GC_malloc caller, thus giving a bit more context.
 - Changed default behavior of large block allocator to more
   aggressively avoid fragmentation.  This is likely to slow down the
   collector when it succeeds at reducing space cost.
 - Integrated Fergus Henderson's CYGWIN32 changes.  They are untested,
   but needed for newer versions.
 - USE_MMAP had some serious bugs.  This caused the collector to fail
   consistently on Solaris with -DSMALL_CONFIG.
 - Added Linux threads support, thanks largely to Fergus Henderson.
Since alpha2:
 - Fixed more Linux threads problems.
 - Changed default GC_free_space_divisor to 3 with new large block allocation.
   (Thanks to Matthew Flatt for some measurements that suggest the old
   value sometimes favors space too much over time.)
 - More CYGWIN32 fixes.
 - Integrated Tyson-Dowd's Linux-M68K port.
 - Minor HP PA and DEC UNIX fixes from Fergus Henderson.
 - Integrated Christoffe Raffali's Linux-SPARC changes.
 - Allowed for one more GC fixup iteration after a full GC in incremental
   mode.  Some quick measurements suggested that this significantly
   reduces pause times even with smaller GC_RATE values.
 - Moved some more GC data structures into GC_arrays.  This decreases
   pause times and GC overhead, but makes debugging slightly less convenient.
 - Fixed namespace pollution problem ("excl_table").
 - Made GC_incremental a constant for -DSMALL_CONFIG, hopefully shrinking
   that slightly.
 - Added some win32 threads fixes.
 - Integrated Ivan Demakov and David Stes' Watcom fixes.
 - Various other minor fixes contributed by many people.
 - Renamed config.h to gcconfig.h, since config.h tends to be used for
   many other things.
 - Integrated Matthew Flatt's support for 68K MacOS "far globals".
 - Fixed up some of the dynamic library Makefile targets for consistency
   across platforms.
 - Fixed a USE_MMAP typo that caused out-of-memory handling to fail
   on Solaris.
 - Added code to test.c to test thread creation a bit more.
 - Integrated GC_win32_free_heap, as suggested by Ivan Demakov.
 - Fixed Solaris 2.7 stack base finding problem.  (This may actually
   have been done in an earlier alpha release.)
Since alpha3:
 - Fixed MSWIN32 recognition test, which interfered with cygwin.
 - Removed unnecessary gc_watcom.asm from distribution.  Removed
   some obsolete README.win32 text.
 - Added Alpha Linux incremental GC support.  (Thanks to Philipp Tomsich
   for code for retrieving the fault address in a signal handler.)
   Changed Linux signal handler context argument to be a pointer.
 - Took care of some new warnings generated by the 7.3 SGI compiler.
 - Integrated Phillip Musumeci's FreeBSD/ELF fixes.
 - -DIRIX_THREADS was broken with the -o32 ABI (typo in gc_priv.h>

Since 4.13:
 - Fixed GC_print_source_ptr to not use a prototype.
 - generalized CYGWIN test.
 - gc::new did the wrong thing with PointerFreeGC placement.
   (Thanks to Rauli Ruohonen.)
 - In the ALL_INTERIOR_POINTERS (default) case, some callee-save register
   values could fail to be scanned if the register was saved and
   reused in a GC frame.  This showed up in verbose mode with gctest
   compiled with an unreleased SGI compiler.  I vaguely recall an old
   bug report that may have been related.  The bug was probably quite old.
   (The problem was that the stack scanning could be deferred until
   after the relevant frame was overwritten, and the new save location
   might be outside the scanned area.  Fixed by more eager stack scanning.)
 - PRINT_BLACK_LIST had some problems.  A few source addresses were garbage.
 - Replaced Makefile.dj and added -I flags to cord make targets.
   (Thanks to Gary Leavens.)
 - GC_try_to_collect was broken with the nonincremental collector.
 - gc_cleanup destructors could pass the wrong address to
   GC_register_finalizer_ignore_self in the presence of multiple
   inheritance.  (Thanks to Darrell Schiebel.)
 - Changed PowerPC Linux stack finding code.

Since 4.14alpha1
 - -DSMALL_CONFIG did not work reliably with large (> 4K) pages.
   Recycling the mark stack during expansion could result in a size
   zero heap segment, which confused things.  (This was probably also an
   issue with the normal config and huge pages.)
 - Did more work to make sure that callee-save registers were scanned
   completely, even with the setjmp-based code.  Added USE_GENERIC_PUSH_REGS
   macro to facilitate testing on machines I have access to.
 - Added code to explicitly push register contents for win32 threads.
   This seems to be necessary.  (Thanks to Pierre de Rop.)

Since 4.14alpha2
 - changed STACKBOTTOM for DJGPP (Thanks to Salvador Eduardo Tropea).
 
Since 4.14
 - Reworked large block allocator.  Now uses multiple doubly linked free
   lists to approximate best fit.
 - Changed heap expansion heuristic.  Entirely free blocks are no longer
   counted towards the heap size.  This seems to have a major impact on
   heap size stability; the old version could expand the heap way too
   much in the presence of large block fragmentation.
 - added -DGC_ASSERTIONS and some simple assertions inside the collector.
   This is mainlyt for collector debugging.
 - added -DUSE_MUNMAP to allow the heap to shrink.  Suupported on only
   a few UNIX-like platforms for now.
 - added GC_dump_regions() for debugging of fragmentation issues.
 - Changed PowerPC pointer alignment under Linux to 4.  (This needs
   checking by someone who has one.  The suggestions came to me via a
   rather circuitous path.)
 - Changed the Linux/Alpha port to walk the data segment backwards until
   it encounters a SIGSEGV.  The old way to find the start of the data
   segment broke with a recent release.
 - cordxtra.c needed to call GC_REGISTER_FINALIZER instead of
   GC_register_finalizer, so that it would continue to work with GC_DEBUG.
 - allochblk sometimes cleared the wrong block for debugging purposes
   when it dropped blacklisted blocks.  This could result in spurious
   error reports with GC_DEBUG.
 - added MACOS X Server support.  (Thanks to Andrew Stone.)
 - Changed the Solaris threads code to ignore stack limits > 8 MB with
   a warning.  Empirically, it is not safe to access arbitrary pages
   in such large stacks.  And the dirty bit implementation does not
   guarantee that none of them will be accessed.
 - Integrated Martin Tauchmann's Amiga changes.
 - Integrated James Dominy's OpenBSD/SPARC port.

Since 5.0alpha1
 - Fixed bugs introduced in alpha1 (OpenBSD & large block initialization).
 - Added -DKEEP_BACK_PTRS and backptr.h interface.  (The implementation
   idea came from Al Demers.)

Since 5.0alpha2
 - Added some highly incomplete code to support a copied young generation.
   Comments on nursery.h are appreciated.
 - Changed -DFIND_LEAK, -DJAVA_FINALIZATION, and -DFINALIZE_ON_DEMAND,
   so the same effect could be obtained with a runtime switch.   This is
   a step towards standardizing on a single dynamic GC library.
 - Significantly changed the way leak detection is handled, as a consequence
   of the above.

Since 5.0 alpha3
 - Added protection fault handling patch for Linux/M68K from Fergus
   Henderson and Roman Hodek.
 - Removed the tests for SGI_SOURCE in new_gc_alloc.h.  This was causing that
   interface to fail on nonSGI platforms.
 - Changed the Linux stack finding code to use /proc, after changing it
   to use HEURISTIC1.  (Thanks to David Mossberger for pointing out the
   /proc hook.)
 - Added HP/UX incremental GC support and HP/UX 11 thread support.
   Thread support is currently still flakey.
 - Added basic Linux/IA64 support.
 - Integrated Anthony Green's PicoJava support.
 - Integrated Scott Ananian's StrongARM/NetBSD support.
 - Fixed some fairly serious performance bugs in the incremental
   collector.  These have probably been there essentially forever.
   (Mark bits were sometimes set before scanning dirty pages.
   The reclaim phase unnecessarily dirtied full small object pages.)
 - Changed the reclaim phase to ignore nearly full pages to avoid
   touching them.
 - Limited GC_black_list_spacing to roughly the heap growth increment.
 - Changed full collection triggering heuristic to decrease full GC
   frequency by default, but to explicitly trigger full GCs during
   heap growth.  This doesn't always improve things, but on average it's
   probably a win.
 - GC_debug_free(0, ...) failed.  Thanks to Fergus Henderson for the
   bug report and fix.

Since 5.0 alpha4
 - GC_malloc_explicitly_typed and friends sometimes failed to
   initialize first word.
 - Added allocation routines and support in the marker for mark descriptors
   in a type structure referenced by the first word of an object.  This was
   introduced to support gcj, but hopefully in a way that makes it
   generically useful.
 - Added GC_requested_heapsize, and inhibited collections in nonincremental
   mode if the actual used heap size is less than what was explicitly
   requested.
 - The Solaris pthreads version of GC_pthread_create didn't handle a NULL
   attribute pointer.  Solaris thread support used the wrong default thread
   stack size.  (Thanks to Melissa O'Neill for the patch.)
 - Changed PUSH_CONTENTS macro to no longer modify first parameter.
   This usually doesn't matter, but it was certainly an accident waiting
   to happen ...
 - Added GC_register_finalizer_no_order and friends to gc.h.  They're
   needed by Java implementations.
 - Integrated a fix for a win32 deadlock resulting from clock() calling
   malloc.  (Thanks to Chris Dodd.)
 - Integrated Hiroshi Kawashima's port to Linux/MIPS.  This was designed
   for a handheld platform, and may or may not be sufficient for other
   machines.
 - Fixed a va_arg problem with the %c specifier in cordprnt.c.  It appears
   that this was always broken, but recent versions of gcc are the first to
   report the (statically detectable) bug.
 - Added an attempt at a more general solution to dlopen races/deadlocks.
   GC_dlopen now temporarily disables collection.  Still not ideal, but ...
 - Added -DUSE_I686_PREFETCH, -DUSE_3DNOW_PREFETCH, and support for IA64
   prefetch instructions.  May improve performance measurably, but I'm not
   sure the code will run correctly on processors that don't support the
   instruction.  Won't build except with very recent gcc.
 - Added caching for header lookups in the marker.  This seems to result
   in a barely measurable performance gain.  Added support for interleaved
   lookups of two pointers, but unconfigured that since the performance
   gain is currently near zero, and it adds to code size.
 - Changed Linux DATA_START definition to check both data_start and
   __data_start, since nothing else seems to be portable.
 - Added -DUSE_LD_WRAP to optionally take advantage of the GNU ld function
   wrapping mechanism.  Probably currently useful only on Linux.
 - Moved some variables for the scratch allocator into GC_arrays, on
   Martin Hirzel's suggestion.
 - Fixed a win32 threads bug that caused the collector to not look for
   interior pointers from one of the thread stacks without
   ALL_INTERIOR_POINTERS.  (Thanks to Jeff Sturm.)
 - Added Mingw32 support.  (Thanks again to Jeff Sturm for the patch.)
 - Changed the alpha port to use the generic register scanning code instead
   of alpha_mach_dep.s.  Alpha_mach_dep.s doesn't look for pointers in fp
   registers, but gcc sometimes spills pointers there.  (Thanks to Manuel
   Serrano for helping me debug this by email.)  Changed the IA64 code to
   do something similar for similar reasons.

[5.0alpha5 doesn't really exist, but it may have escaped.]

Since 5.0alpha6:
 - -DREDIRECT_MALLOC was broken in alpha6. Fixed.
 - Cleaned up gc_ccp.h slightly, thus also causing the HP C++ compiler to
   accept it.
 - Removed accidental reference to dbg_mlc.c, which caused dbg_mlc.o to be
   linked into every executable.
 - Added PREFETCH to bitmap marker.  Changed it to use the header cache.
 - GC_push_marked sometimes pushed one object too many, resulting in a
   segmentation fault in GC_mark_from_mark_stack.  This was probably an old
   bug.  It finally showed up in gctest on win32.
 - Gc_priv.h erroneously #defined GC_incremental to be TRUE instead of FALSE
   when SMALL_CONFIG was defined.  This was no doubt a major performance bug for
   the default win32 configuration.
 - Removed -DSMALL_CONFIG from NT_MAKEFILE.  It seemed like an anchronism now
   that the average PC has 64MB or so.
 - Integrated Bryce McKinley's patches for linux threads and dynamic loading
   from the libgcj tree.  Turned on dynamic loading support for Linux/PPC.
 - Changed the stack finding code to use environ on HP/UX.  (Thanks
   to Gustavo Rodriguez-Rivera for the suggestion.)  This should probably
   be done on other platforms, too.  Since I can't test those, that'll
   wait until after 5.0.

Since 5.0alpha7:
 - Fixed threadlibs.c for linux threads.  -DUSE_LD_WRAP was broken and
   -ldl was omitted.  Fixed Linux stack finding code to handle
   -DUSE_LD_WRAP correctly.
 - Added MSWIN32 exception handler around marker, so that the collector
   can recover from root segments that are unmapped during the collection.
   This caused occasional failures under Windows 98, and may also be
   an issue under Windows NT/2000.

Since 5.0
 - Fixed a gc.h header bug which showed up under Irix.  (Thanks to
   Dan Sullivan.)
 - Fixed a typo in GC_double_descr in typd_mlc.c.
   This probably could result in objects described by array descriptors not
   getting traced correctly.  (Thanks to Ben Hutchings for pointing this out.)
 - The block nearly full tests in reclaim.c were not correct for 64 bit
   environments.  This could result in unnecessary heap growth under unlikely
   conditions.

Since 5.1
 - dyn_load.c declared GC_scratch_last_end_ptr as an extern even if it
   was defined as a macro.  This prevented the collector from building on
   Irix.
 - We quietly assumed that indirect mark descriptors were never 0.
   Our own typed allocation interface violated that.  This could result
   in segmentation faults in the marker with typed allocation.
 - Fixed a _DUSE_MUNMAP bug in the heap block allocation code.
   (Thanks to Ben Hutchings for the patch.)
 - Taught the collector about VC++ handling array operator new.
   (Thanks again to Ben Hutchings for the patch.)
 - The two copies of gc_hdrs.h had diverged.  Made one a link to the other
   again.

Since 5.2  (A few 5.2 patches are not in 6.0alpha1)
 - Fixed _end declaration for OSF1.
 - There were lots of spurious leak reports in leak detection mode, caused
   by the fact that some pages were not being swept, and hence unmarked
   objects weren't making it onto free lists.  (This bug dated back to 5.0.)
 - Fixed a typo in the liblinuxgc.so Makefile rule.
 - Added the GetExitCodeThread to Win32 GC_stop_world to (mostly) work
   around a Windows 95 GetOpenFileName problem.  (Thanks to Jacob Navia.)

Since 5.3
 - Fixed a typo that prevented compilation with -DUSE_3DNOW_PREFETCH.
   (Thanks to Shawn Wagner for actually testing this.)
 - Fixed GC_is_thread_stack in solaris_threads.c.  It forgot to return a value
   in the common case.  I wonder why nobody noticed?
 - Fixed another silly syntax problem in GC_double_descr.  (Thanks to
   Fergus Henderson for finding it.)
 - Fixed a GC_gcj_malloc bug: It tended to release the allocator lock twice.

Since 5.4  (A few 5.3 patches are not in 6.0alpha2)
 - Added HP/PA prefetch support.
 - Added -DDBG_HDRS_ALL and -DSHORT_DBG_HDRS to reduce the cost and improve
   the reliability of generating pointer backtrace information, e.g. in
   the Bigloo environment.
 - Added parallel marking support (-DPARALLEL_MARK).  This currently
   works only under IA32 and IA64 Linux, but it shouldn't be hard to adapt
   to other platforms.  This is intended to be a lighter-weight (less
   new code, probably not as scalable) solution than the work by Toshio Endo
   et al, at the University of Tokyo.  A number of their ideas were
   reused, though the code wasn't, and the underlying data structure
   is significantly different.  In particular, we keep the global mark
   stack as a single shared data structure, but most of the work is done
   on smaller thread-local mark stacks.
 - Changed GC_malloc_many to be cheaper, and to require less mutual exclusion
   with -DPARALLEL_MARK.
 - Added full support for thread local allocation under Linux
   (-DTHREAD_LOCAL_ALLOC).  This is a thin veneer on GC_malloc_many, and
   should be easily portable to other platforms, especially those that
   support pthreads.
 - CLEAR_DOUBLE was not always getting invoked when it should have been.
 - GC_gcj_malloc and friends used different out of memory handling than
   everything else, probably because I forgot about one when I implemented
   the other.  They now both call GC_oom_fn(), not GC_oom_action().
 - Integrated Jakub Jelinek's fixes for Linux/SPARC.
 - Moved GC_objfreelist, GC_aobjfreelist, and GC_words_allocd out of
   GC_arrays, and separately registered the first two as excluded roots.
   This makes code compiled with gc_inl.h less dependent on the
   collector version.  (It would be nice to remove the inclusion of
   gc_priv.h by gc_inl.h completely, but we're not there yet.  The
   locking definitions in gc_priv.h are still referenced.)
   This change was later coniditoned on SEPARATE_GLOBALS, which
   is not defined by default, since it involves a performance hit.
 - Register GC_obj_kinds separately as an excluded root region.  The
   attempt to register it with GC_arrays was usually failing.  (This wasn't
   serious, but seemed to generate some confusion.) 
 - Moved backptr.h to gc_backptr.h.

Since 6.0alpha1
 - Added USE_MARK_BYTES to reduce the need for compare-and-swap on platforms
   for which that's expensive.
 - Fixed a locking bug ib GC_gcj_malloc and some locking assertion problems.
 - Added a missing volatile to OR_WORD and renamed the parameter to
   GC_compare_and_swap so it's not a C++ reserved word.  (Thanks to
   Toshio Endo for pointing out both of those.)
 - Changed Linux dynamic library registration code to look at /proc/self/maps
   instead of the rld data structures when REDIRECT_MALLOC is defined.
   Otherwise some of the rld data data structures may be prematurely garbage
   collected.  (Thanks to Eric Benson for helping to track this down.)
 - Fixed USE_LD_WRAP a bit more, so it should now work without threads.
 - Renamed XXX_THREADS macros to GC_XXX_THREADS for namespace correctness.
   Tomporarily added some backward compatibility definitions.  Renamed
   USE_LD_WRAP to GC_USE_LD_WRAP.
 - Many MACOSX POWERPC changes, some additions to the gctest output, and
   a few minor generic bug fixes.  (Thanks to Dietmar Planitzer.)

Since 6.0 alpha2
 - Fixed the /proc/self/maps code to not seek, since that apparently is not
   reliable across all interesting kernels.
 - Fixed some compilation problems in the absence of PARALLEL_MARK
   (introduced in alpha2).
 - Fixed an algorithmic problem with PARALLEL_MARK.  If work needs to
   be given back to the main mark "stack", the BOTTOM entries of the local
   stack should be given away, not the top ones.  This has substantial
   performance impact, especially for > 2 processors, from what I can tell.
 - Extracted gc_lock.h from gc_priv.h.  This should eventually make it a
   bit easier to avoid including gc_priv.h in clients.
 - Moved all include files to include/ and removed duplicate links to the
   same file.  The old scheme was a bad idea because it was too easy to get the
   copies out of sync, and many systems don't support hard links.
   Unfortunately, it's likely that I broke some of the non-Unix Makefiles in
   the process, although I tried to update them appropriately.
 - Removed the partial support for a copied nursery.  It's not clear that
   this would be a tremendous win, since we don't consistently lose to
   generational copying collectors.  And it would significantly complicate
   many things.  May be reintroduced if/when it really turns out to win.
 - Removed references to IRIX_JDK_THREADS, since I believe there never
   were and never will be any clients.
 - Added some code to linux_threads.c to possibly support HPUX threads
   using the Linux code.  Unfortunately, it doesn't work yet, and is
   currently disabled.
 - Added support under Linux/X86 for saving the call chain, both in (debug)
   objects for client debugging, and in GC_arrays._last_stack for GC
   debugging.  This was previously supported only under Solaris.  It is
   not enabled by default under X86, since it requires that code be compiled
   to explicitly dave frame pointers on the call stack.  (With gcc this
   currently happens by default, but is often turned off explicitly.)
   To turn it on, define SAVE_CALL_CHAIN.
 
Since 6.0 alpha3
 - Moved up the detection of mostly full blocks to the initiatiation of the
   sweep phase.  This eliminates some lock conention in the PARALLEL_MARK case,
   as multiple threads try to look at mostly full blocks concurrently.
 - Restored the code in GC_malloc_many that grabs a prefix of the global
   free list.  This avoids the case in which every GC_malloc_many call
   tries and fails to allocate a new heap block, and the returns a single
   object from the global free list.
 - Some minor fixes in new_hblk.c.  (Attempted to build free lists in order
   of increasing addresses instead of decreasing addresses for cache performance
   reasons.  But this seems to be only a very minor gain with -DEAGER_SWEEP,
   and a loss in other cases.  So the change was backed out.)
 - Fixed some of the documentation.  (Thanks in large part to Fergus
   Henderson.)
 - Fixed the Linux USE_PROC_FOR_LIBRARIES code to deal with apps that perform
   large numbers of mmaps.  (Thanks to Eric Benson.)  Also fixed that code to
   deal with short reads.
 - Added GC_get_total_bytes(). 
 - Fixed leak detection mode to avoid spurious messages under linuxthreads.
   (This should also now be easy for the other supported threads packages.
   But the code is tricky enough that I'm hesitant to do it without being able
   to test.  Everything allocated in the GC thread support itself should be
   explicitly deallocated.)
 - Made it possible (with luck) to redirect malloc to GC_local_malloc.

Since 6.0 alpha4
 - Changed the definition of GC_pause in linux_threads.c to use a volatile
   asm.  Some versions of gcc apparently optimize away writes to local volatile
   variables.  This caused poor locking behaviour starting at about
   4 processors.
 - Added GC_start_blocking(), GC_end_blocking() calls and wrapper for sleep
   to linux_threads.c.
   The first two calls could be used to generally avoid sending GC signals to
   blocked threads, avoiding both premature wakeups and unnecessary overhead.
 - Fixed a serious bug in thread-local allocation.  At thread termination,
   GC_free could get called on small integers.  Changed the code for thread
   termination to more efficiently return left-over free-lists.
 - Integrated Kjetil Matheussen's BeOS support.
 - Rearranged the directory structure to create the doc and tests
   subdirectories.
 - Sort of integrated Eric Benson's patch for OSF1.  This provided basic
   OSF1 thread support by suitably extending hpux_irix_threads.c.  Based
   on earlier email conversations with David Butenhof, I suspect that it
   will be more reliable in the long run to base this on linux_threads.c
   instead.  Thus I attempted to patch up linux_threads.c based on Eric's code.
   The result is almost certainly broken, but hopefully close enough that
   someone with access to a machine can pick it up.
 - Integrated lots of minor changes from the NetBSD distribution.  (These
   were supplied by David Brownlee.  I'm not sure about the original
   authors.)
 - Hacked a bit more on the HP/UX thread-support in linux_threads.c.  It
   now appears to work in the absence of incremental collection.  Renamed
   hpux_irix_threads.c back to irix_threads.c, and removed the attempt to
   support HPUX there.
 - Changed gc.h to define _REENTRANT in cases in which it should already
   have been defined. It is still safer to also define it on the command
   line. 

Since 6.0alpha5:
 - Changed the definition of DATASTART on ALPHA and IA64, where data_start
   and __data_start are not defined by earlier versions of glibc.  This might
   need to be fixed on other platforms as well.
 - Changed the way the stack base and backing store base are found on IA64.
   This should now remain reliable on future kernels.  But since it relies
   on /proc, it will no longer work in the simulated NUE environment.
 - Made the call to random() in dbg_mlc.c with -DKEEP_BACK_PTRS dependent
   on the OS.  On non-Unix systems, rand() should be used instead.  Handled
   small RAND_MAX.  (Thanks to Peter Ross for pointing this out.)
 - Fixed the cord make rules to create the cord subdirectory, if necessary.
   (Thanks to Doug Moen.)
 - Changed fo_object_size calculation in finalize.c.  Turned finalization
   of nonheap object into a no-op.  Removed anachronism from GC_size()
   implementation.
 - Changed GC_push_dirty call in solaris_threads.c to GC_push_selected.
   It was missed in a previous renaming. (Thanks to Vladimir Tsichevski
   for pointing this out.)
 - Arranged to not not mask SIGABRT in linux_threads.c.  (Thanks to Bryce
   McKinlay.) 
 - Added GC_no_dls hook for applications that want to register their own
   roots.
 - Integrated Kjetil Matheussen's Amiga changes.
 - Added FREEBSD_STACKBOTTOM.  Changed the X86/FreeBSD port to use it.
   (Thanks to Matthew Flatt.)
 - Added pthread_detach interception for platforms supported by linux_threads.c
   and irix_threads.c.  Should also be added for Solaris?
 - Changed the USE_MMAP code to check for the case in which we got the
   high end of the address space, i.e. mem_ptr + mem_sz == 0.  It appears
   that this can happen under Solaris 7.  It seems to be allowed by what
   I would claim is an oversight in the mmap specification.  (Thanks to Toshio
   Endo for pointing out the problem.)
 - Cleanup of linux_threads.c.  Some code was originally cloned from
   irix_threads.c and now unnecessary.  Some comments were obviously wrong.
 - (Mostly) fixed a longstanding problem with setting of dirty bits from
   a signal handler.  In the presence of threads, dirty bits could get lost,
   since the etting of a bit in the bit vector was not atomic with respect
   to other updates.  The fix is 100% correct only for platforms for which
   GC_test_and_set is defined.  The goal is to make that all platforms with
   thread support.  Matters only if incremental GC and threads are both
   enabled.
 - made GC_all_interior_pointers (a.k.a. ALL_INTERIOR_POINTERS) an
   initialization time, instead of build-time option.  This is a 
   nontrivial, high risk change.  It should slow down the code measurably
   only if MERGE_SIZES is not defined, which is a very nonstandard
   configuration.   
 - Added doc/README.environment, and implemented what it describes.  This
   allows a number of additional configuration options to be set through
   the environment.  It documents a few previously undocumented options.
 - Integrated Eric Benson's leak testing improvements.
 - Removed the option to throw away the beginning of each page (DISCARD_WORDS).
   This became less and less useful as processors enforce stricter alignment.
   And it hadn't been tested in ages, and was thus probably broken anyway.

Since 6.0alpha6:
 - Added GC_finalizer_notifier.  Fixed GC_finalize_on_demand.  (The variable
   actually wasn't being tested at the right points.  The build-time flag
   was.)
 - Added Tom Tromey's S390 Linux patch.
 - Added code to push GC_finalize_now in GC_push_finalizer_structures.
   (Thanks to Matthew Flatt.)
 - Added GC_push_gc_structures() to push all GC internal roots.
 - Integrated some FreeBSD changes from Matthew Flatt.
 - It looks like USRSTACK is not always correctly defined under Solaris.
   Hacked gcconfig.h to attempt to work around the problem.  The result
   is not well tested.  (Thanks again to Matthew Flatt for pointing this
   out.  The gross hack is mine. - HB)
 - Added Ji-Yong Chung's win32 threads and C++ fixes.
 - Arranged for hpux_test_and_clear.s to no longer be needed or built.
   It was causing build problems with gas, and it's not clear this is
   better than the pthreads alternative on this platform.
 - Some MINGW32 fixes from Hubert Garavel.
 - Added Initial Hitachi SH4 port from Kaz Kojima.
 - Ported thread-local allocation and parallel mark code to HP/UX on PA_RISC.
 - Made include/gc_mark.h more public and separated out the really private
   pieces.  This is probably still not quite sufficient for clients that
   want to supply their own kind of type information.  But it's a start.
   This involved lots of identifier renaming to make it namespace clean.
 - Added GC_dont_precollect for clients that need complete control over
   the root set.
 - GC_is_visible didn't do the right thing with gcj objects.  (Not that
   many people are likely to care, but ...)
 - Don't redefine read with GC_USE_LD_WRAP.
 - Initial port to LINUX/HP_PA.  Incremental collection and threads are not
   yet supported.  (Incremental collection should work if you have the
   right kernel.  Threads may work with a sufficiently patched pthread
   library.)
 - Changed gcconfig.h to recognize __i386__ as an alternative to i386 in
   many places.  (Thanks to Benjamin Lerman.)
 - Made win32_threads.c more tolerant of detaching a thread that it didn't
   know about.  (Thanks to Paul Nash.)
 - Added Makefile.am and configure.in from gcc to the distribution, with
   minimal changes.  For the moment, those are just placeholders.  In the
   future, we're planning to switch to a GNU-style build environment for
   Un*x-like systems, though the old Makefile will remain as a backup.
 - Turned off STUBBORN_ALLOC by default, and added it back as a Makefile
   option.
 - Redistributed some functions between malloc.c and mallocx.c, so that
   simple statically linked apps no longer pull in mallocx.o.
 - Changed large object allocation to clear the first and last few words
   of each block before releassing the lock.  Otherwise the marker could see
   objects with nonsensical type descriptors.
 - Fixed a couple of subtle problems that could result in not recognizing
   interior pointers from the stack.  (I believe these were introduced
   in 6.0alpha6.)
 - GC_debug_free_inner called GC_free, which tried to reacquire the
   allocator lock, and hence deadlocked.  (DBG_HDRS_ALL probably never worked
   with threads?)
 - Fixed several problems with back traces.  Accidental references to a free
   list could cause the free list pointer to be overwritten by a back pointer.
   There seemed to be some problems with the encoding of root and finalizer
   references.
  
Since 6.0alpha7:
 - Changed GC_debug_malloc_replacement and GC_debug_realloc_replacement
   so that they compile under Irix.  (Thanks to Dave Love.)
 - Updated powerpc_macosx_mach_dep.s so that it works if the collector
   is in a dynamic library.  (Thanks to Andrew Begel.)
 - Transformed README.debugging into debugging.html, updating and
   expanding it in the process.  Added gcdescr.html and tree.html
   from the web site to the GC distribution.
 - Fixed several problems related to PRINT_BLACK_LIST. This involved
   restructuring some of the marker macros.
 - Fixed some problems with the sizing of objects with debug information.
   Finalization was broken KEEP_BACK_PTRS or PRINT_BLACK_LIST.  Reduced the
   object size with SHORT_DEBUG_HDRS by another word.
 - The "Needed to allocate blacklisted ..." warning had inadvertently
   been turned off by default, due to a buggy test in allchblk.c.  Turned
   it back on.
 - Removed the marker macros to deal with 2 pointers in interleaved fashion.
   They were messy and the performance improvement seemed minimal.  We'll
   leave such scheduling issues to the compiler.
 - Changed Linux/PowerPC test to also check for __powerpc__ in response
   to a discussion on the gcc mailing list.
 - On Matthew Flatt's suggestion removed the "static" from the jmp_buf
   declaration in GC_generic_push_regs.  This was causing problems in
   systems that register all of their own roots.  It looks far more correct
   to me without the "static" anyway. 
 - Fixed several problems with thread local allocation of pointerfree or
   typed objects.  The collector was reclaiming thread-local free lists, since
   it wasn't following the link fields.
 - There was apparently a long-standing race condition related to multithreaded
   incremental collection.  A collection could be started and a thread stopped
   between the memory unprotect system call and the setting of the
   corresponding dirt bit.  I believe this did not affect Solaris or PCR, which
   use a different dirty-bit implementation.  Fixed this by installing
   signal handlers with sigaction instead of signal, and disabling the thread
   suspend signal while in the write-protect handler.  (It is unclear
   whether this scenario ever actually occurred.  I found it while tracking
   down the following:)
 - Incremental collection did not cooperate correctly with the PARALLEL_MARK
   implementation of GC_malloc_many or the local_malloc primitves.  It still
   doesn't work well, but it shouldn't lose memory anymore.
 - Integrated some changes from the gcc source tree that I had previously
   missed.  (Thanks to Bryce McKinley for the reminder/diff.)
 - Added Makefile.direct as a copy of the default Makefile, which would
   normally be overwritten if configure is run.
 - Changed the gc.tar target in Makefile.direct to embed the version number
   in the gc directory name.  This will affect future tar file distributions.
 - Changed the Irix dynamic library finding code to no longer try to
   eliminate writable text segments under Irix6.x, since that is probably no
   longer necessary, and can apparently be unsafe on occasion.  (Thanks to
   Shiro Kawai for pointing this out.)
 - GC_cleanup with GC_DEBUG enabled passed a real object base address to
   GC_debug_register_finalizer_ignore_self, which expected a pointer past the
   debug header.  Call GC_register_finalizer_ignore_self instead, even with
   debugging enabled.  (Thanks to Jean-Daniel Fekete for catching this.)
 - The collector didn't build with call chain saving enabled but NARGS=0.
   (Thanks to Maarten Thibaut.)
 - Fixed up the GNU-style build files enough so that they work in some
   obvious cases.
 - Added initial port to Digital Mars compiler for win32. (Thanks to Walter
   Bright.)

Since 6.0alpha8:
 - added README.macros.
 - Made gc.mak a symbolic link to work around winzip's tendency to ignore
   hard links.
 - Simplified the setting of NEED_FIND_LIMIT in os_dep.c, possibly breaking
   it on untested platforms.
 - Integrated initial GNU HURD port. (Thanks to Chris Lingard and Igor
   Khavkine.)
 - A few more fixes for Digital Mars compiler (Walter Bright).
 - Fixed gcc version recognition.  Renamed OPERATOR_NEW_ARRAY to
   GC_OPERATOR_NEW_ARRAY.  Changed GC_OPERATOR_NEW_ARRAY to be the default.
   It can be overridden with -DGC_NO_OPERATOR_NEW_ARRAY.  (Thanks to
   Cesar Eduardo Barros.) 
 - Changed the byte size to free-list mapping in thread local allocation
   so that size 0 allocations are handled correctly.
 - Fixed Linux/MIPS stackbottom for new toolchain. (Thanks to Ryan Murray.)
 - Changed finalization registration to invoke GC_oom_fn when it runs out
   of memory.
 - Removed lvalue cast in finalize.c.  This caused some debug configurations
   not to build with some non-gcc compilers.

Since 6.0alpha9:
 - Two more bug fixes for KEEP_BACK_PTRS and DBG_HDRS_ALL.
 - Fixed a stack clearing problem that resulted in SIGILL with a
   misaligned stack pointer for multithreaded SPARC builds.
 - Integrated another HURD patch (thanks to Igor Khavkine).

Since 6.0:
 - Non-debug, atomic allocations could result in bogus smashed object
   reports with debugging on.  (Thanks to Patrick Doyle for the small
   test case.)
 - Fixed GC_get_register_stack_base (Itanium only) to work around a glibc
   2.2.4 bug.
 - Initial port to HP/UX on Itanium.  Thread support and both 32 and 64
   bit ABIs appear to work.  Parallel mark support doesn't yet, due to
   some inline assembly code issues.  Thread local allocation does appear
   to work.
 - ifdef'ed out glibc2.1/Itanium workaround.  I suspect nobody is using
   that combination anymore.
 - Added a patch to make new_gc_alloc.h usable with gcc3.0.  (Thanks to
   Dimitris Vyzovitis for the patch.)
 - Debugged 64-bit support on HP/UX PA-RISC.
 - Turned on dynamic loading support for FreeBSD/ELF.  (Thanks to Peter
   Housel.)
 - Unregistering of finalizers with debugging allocation was broken.
   (Thanks to Jani Kajala for the test case.)
 - Old finalizers were not returned correctly from GC_debug_register_finalizer.
 - Disabled MPROTECT_VDB for Linux/M68K based on a report that it doesn't work.
 - Cleaned up some statistics gathering code in reclaim.c (Thanks to Walter
   Bright.)
 - Added some support for OpenBSD/ELF/Linux.  (Thanks to Suzuki Toshiya.)
 - Added Jakub Jelinek's patch to use dl_iterate_phdr for dynamic library
   traversal to dyn_load.c.  Changed it to weakly reference dl_iterate_phdr,
   so that the old code is stilll used with old versions of glibc.
 - Cleaned up feature test macros for various threads packages and
   integrated (partially functional) FreeBSD threads code from Loren Rittle.
   It's likely that the cleanup broke something, since it touched lots of
   code.  It's also likelly that it fixed some unreported bugs in the
   less common thread implementations, since some of the original code
   didn't stand up to close scrutiny.  Support for the next pthreads
   implementation should be easier to add.

Since 6.1alpha1:
 - No longer wrap read by default in multithreaded applications.  It was
   pointed out on the libgcj list that this holds the allocation lock for
   way too long if the read blocks.  For now, reads into the heap are
   broken with incremental collection.  It's possible to turn this back on
   if you make sure that read calls don't block (e.g. by calling select
   first).
 - Fix ifdef in Solaris_threads.h to refer to GC_SOLARIS_THREADS.
 - Added check for environment variable GC_IGNORE_GCJ_INFO.
 - Added printing of stop-the-world GC times if GC_PRINT_STATS environment
   variable is set.
 - The calloc definition in leak_detector.h was missing parentheses, and
   realloc was missing a second argument to GC_REALLOC.
   (Thanks to Elrond (elrond<at>samba-tng.org).)
 - Added GC_PRINT_BACK_HEIGHT environment variable and associated
   code, mostly in the new file backgraph.c.  See doc/README.environment.
 - Added -DUSE_GLOBAL_ALLOC to work around a Windows NT issue.  (Thanks to
   Jonathan Clark.)
 - Integrated port to NEC EWS4800 (MIPS-based workstation, with somewhat
   different address-space layout). This may help for other machines with
   holes in the data segment.  (Thanks to Hironori Sakamoto.)
 - Changed the order in which GC_push_roots and friends push things onto
   the mark stack.  GC_push_all calls need to come first, since we can't
   necessarily recovere if those overflow the mark stack.  (Thanks to
   Matthew Flatt for tracking down the problem.)
 - Some minor cleanups to mostly support the Intel compiler on Linux/IA64.

Since 6.1 alpha2:
 - Minor cleanup on the gcconfig.h section for SPARC.
 - Minor fix to support Intel compiler for I386/Linux. (Thanks to Sven
   Hartrumpf.)
 - Added SPARC V9 (64-bit) support.  (Thanks to Jeff Sturm.)
 - Restructured the way in which we determine whether or not to keep
   call stacks for debug allocation.  By default SAVE_CALL_COUNT is
   now zero on all platforms.  Added SAVE_CALL_NARGS parameters.
   If possible, use execinfo.h to capture call stack.  (This should
   add support for a number of new platforms, though often at
   considerable runtime expense.)
 - Try to print symbolic information for call stacks.  On Linux, we
   do this with a combination of execinfo.h and running addr2line in
   a separate process.  This is both much more expensive and much more
   useful.  Amazingly, it seems to be fast enough for most purposes.
 - Redefined strdup if -DREDIRECT_MALLOC is given.
 - Changed incremental collector and MPROTECT_VDB implementation so that,
   under favorable conditions, pointerfree objects are not protected.
   Added GC_incremental_protection_needs() to determine ahead of time whether
   pointerfree objects may be protected.  Replaced GC_write_hint() with
   GC_remove_protection().
 - Added test for GC_ENABLE_INCREMENTAL environment variable.
 - Made GC_time_limit runtime configurable.  Added GC_PAUSE_TIME_TARGET
   environment variable.
 - Eliminated GC_page_sz, a duplicate of GC_page_size.
 - Caused the Solaris and Irix thread creation primitives to call
   GC_init_inner().
 
Since 6.1alpha3:
 - Fixed typo in sparc_mach_dep.S, preventing the 64-bit version from
   building.  Increased 64-bit heap size limit in test.c slightly, since
   a functional SPARC collector seems to slightly exceed the old limits.
   (Thanks again to Jeff Sturm.)
 - Use NPRGREG in solaris_threads.c, thus printing all registers if things
   go wrong.
 - Added GC_MARKERS environment variable to allow use of a single marker
   thread on an MP without confusing the lock implementation.
 - Collect much less aggressively in incremental mode with GC_TIME_UNLIMITED.
   This is really a purely generational mode, and we can afford to 
   postpone the collection until the heap is (nearly) full.
 - Remove read() wrapper for MPROTECT_VDB.  It was causing more harm than
   good.  It is often no longer needed if system calls avoid writing to
   pointerfull heap objects.
 - Fix MACOSX test in gcconfig.h. (Thanks to John Clements.)
 - Change GC_test_and_set so that it consistently has one argument.
   Add spaces to ::: in powerpc assembly code in gc_locks.h.
   (Thanks to Ryan Murray.)
 - Fixed a formatting error in dbg_mlc.c.  Added prototype to GC_abort()
   declaration.   (Thanks to Michael Smith.)
 - Removed "source" argument to GC_find_start().  Eliminate GC_FIND_START().
 - Added win32 recognition code in configure.in.  Changed some of the
   dllimport/export defines in gc.h.  (Thanks to Adam Megacz.)
 - GC_malloc_many didn't set hb_last_reclaimed when it called 
   GC_reclaim_generic.  (I'm not sure this matters much, but ...)
 - Allocating uncollectable objects with debug information sometimes
   allocated objects that were one byte too small, since uncollectable
   objects don't have the extra byte added at the end.  (Thanks to
   Wink Saville for pointing this out.)
 - Added a bit more assertion checking to make sure that gcj objects
   on free lists never have a nonzero second word.
 - Replaced BCC_MAKEFILE with an up-to-date one.  (Thanks to 
   Andre Leiradella.)
 - Upgraded libtool, cinfigure.in and some related files to hopefully
   support NetBSD/SPARC.  (Thanks to Adrian Bunk.)  Unfortunately,
   libtool 1.4.2 seemed to be buggy due to missing quotes in several
   "test" invocations.  Fixed those in the ltmain.sh script.
 - Some win32-specific patches, including the introduction of
   GC_CreateThread.  (Thanks to Adam Megacz.)
 - Merged in gcj changes from Anthony Green to support embedded systems.
 - Tried to consistently rename preprocessed assembly files with a capital
   .S extension.
 - Use alpha_mach_dep.S on ALPHA again.  It doesn't really matter, but this
   makes our distribution consistent with the gcc one, avoiding future merge
   problems.
 - Move GET_MEM definition into gcconfig.h.  Include gcconfig.h slightly
   later in gc_priv.h to avoid forward references to ptr_t.
 - Add some testing of local allocation to test.c.
 - Change definition of INVALID_QTID in specific.h.  The -1 value was used
   inconsistently, and too likely to collide with a valid stack address.
   Some general clean-up of specific.[ch].  Added assertions.  (Thanks
   to Michael Smith for tracking down an intermittent bug to this
   general area.  I'm not sure it has been squashed yet, however.)
 - On Pthread systems it was not safe to call GC_malloc() between fork()
   and exec().  According to the applicable standards, it doesn't appear
   to be safe to call malloc() or many other libc functions either, thus
   it's not clear this is fixable.  Added experimental support for
   -DHANDLE_FORK in linux_threads.c which tries to support it.  It may
   succeed if libc does the right thing.  I'm not sure whether it does.
   (Thanks to Kenneth Schalk for pointing out this issue.)
 - Documented thread local allocation primitives to require an
   explicit GC_init call.  GC_init_parallel is no longer declared to
   be a constructor function, since that isn't portable and often
   seems to lead to initialization order problems.
 - Changed gc_cpp.cc and gc_cpp.h in one more attempt to make them
   compatible with Visual C++ 6.  (Thanks to Wink Saville for the
   patch.)
 - Some more patches for Linux on HP PA-RISC.
 - Added include/gc_allocator.h.  It implements (hopefully) standard
   conforming (as opposed to SGI-style) allocators that allocate
   collectable (gc_allocator) or GC-traceable, but not collectable
   (traceable_allocator) objects.  This borrows heavily from libstc++,
   which borrows heavily from the SGI implementation, this part of
   which was written by Matt Austern.  Changed test_cpp.cc to very
   minimally test this.
 - On Linux/X86, retry mmap with a different start argument.  That should
   allow the collector to use more (closer to 3GB) of the address space.
   (Thanks to Jeffrey Mark Siskind for tracking this down.)
 - Force 64 bit alignment with GCJ support.  (Reflects Bryce McKinley's
   patch to the gcc tree.)
 - Refined the choice of sa_handler vs. sa_sigaction in GC_dirty_init
   to accomodate some glibc5 systems.  (Thanks to Dan Fandrich for the
   patch.)
 - Compensated for the fact that current versions of glibc set
   __libc_stack_end incorrectly on Linux/IA64 while initialization code
   is running.  This could cause the collector to miss 16 bytes of
   the memory stack if GC_malloc or friends where called before main().
 - Mostly integrated Takis Psarogiannakopoulos' port to DG/UX Inix 86.
   This will probably take another iteration to work, since his
   patch conflicted with the libtool upgrade. 
 - Added README.arm.cross containing some information about cross-
   compiling to an ARM processor from Margaret Fleck.

Since 6.1alpha4:
 - Added GC_finalizer_mem_freed, and changed some of the code that
   decided on heap expansion to look at it.  Memory explicitly
   deallocated by finalizers essentially needs to be counted as reclaimed
   by the GC.  Otherwise there are cases in which the heap can grow
   unboundedly.  (Thanks to Mark Reichert for the test case.)
 - Integrated Adam Megacz patches to not scan dynamic libraries if
   we are compiling with gcc on win32.  Otherwise we need structured
   exception handling to deal with asynchronously unmapped root
   segments, and gcc doesn't directly support that.
 - Integrated Anthony Green's patch to support Wine.
 - GC_OPERATOR_NEW_ARRAY was misspelled OPERATOR_NEW_ARRAY in several
   places, including gc_cpp.cc.  (Thanks to Wink Saville for pointing
   this out.)
 - Integrated Loren James Rittle's Alpha FreeBSD patches.  In
   response to Richard Henderson's suggestion, these also
   changed the declarations of symbols like _end on many platforms to
   that they wouldn't mistakenly be declared as short data symbols.
 - Integrated changes from the Debian distribution.  (Thanks to Ryan Murray
   for pointing these out.)  Fix C++ comments in POWERPC port.  Add ARM32
   incremental GC support.  Get rid of USE_GENERIC_PUSH_REGS for alpha/Linux,
   this time for real.  Use va_copy to get rid of cord printf problems
   (finally).
 - Close file descriptor used to count cpus.  Thanks to Jeff Sturm for
   pointing out the omission.
 - Don't just drop gcj free lists in GC_start_reclaim, since that can
   eventually cause the marker to see a bogus mark descriptor in the 
   dropped objects.  The usual symptom was a very intermittent segmentation
   fault in the marker.  This mattered only if one of the GC_gcj_malloc
   variants was used.  (Thanks to Michael Smith, Jeff Sturm, Bryce
   McKinley and Tom Tromey for helping to track this down.)
 - Fixed Linux and Solaris/64 SPARC configuration.  (Thanks to David Miller,
   Jeff Sturm, Tom Tromey, and Christian Joensson.)
 - Fixed a typo in strdup definition.  (Thanks to Gerard A Allan.)
 - Changed Makefile.direct to invoke $(CC) to assemble alpha_mach_dep.S.
   This is needed on Linux.  I'm not sure whether it's better or worse
   on Tru64.
 - Changed gc_cpp.h once more to declare operator new and friends only in
   a Microsoft environment.  This may need further fine tuning.  (Thanks to
   Johannes Schmidt for pointing out that the older code breaks on gcc3.0.4.)
 - Don't ever override strdup if it's already macro defined.  (Thanks to
   Adnan Ali for pointing out the problem.)
 - Changed gc_cpp.h yet again to also overload placement new.  Due to the
   C++ overloading rules, the other overloaded new operations otherwise hide
   placement new, which causes many STL uses to break.  (Thanks to Reza
   Shahidi for reporting this, and to Matt Austern for proposing a fix.)
 - Integrated cygwin pthreads support from Dan Bonachea.
 - Turn on DYNAMIC_LOADING for NetBSD.  (Thanks to Krister Walfridsson.)
 - Changed printing code to print more complete GC times.
 - Applied Mark Mitchell's Irix patch to correct some bitrot.
 - Clarified which object-printing routines in dbg_mlc.c should hold
   the allocation lock.  Restructured the code to allow reasonable object
   printing with -DREDIRECT_MALLOC.
 - Fix the Linux mmap code to always start with 0x1000 as the initial hint.
   Minor patches for 64-bit AIX, particularly to STACKBOTTOM.
   (Thanks again to Jeffrey Mark Siskind.)
 - Renamed "SUSPENDED" flag for Solaris threads support to avoid a conflict
   with a system header. (Thanks to Philp Brown.)
 - Cause win32_threads.c to handle an out of range stack pointer correctly,
   though currently with a warning.  (Thanks to Jonathan Clark for
   observing that win32 applications may temporarily use the stack
   pointer for other purposes, and suggesting a fix.  Unfortunately, it's
   not clear that there is a complete solution to this problem.)

Since 6.1alpha5:
 - Added GC_MAXIMUM_HEAP_SIZE environment variable.
 - Fix configure.in for MIPS/LINUX. (Thanks to H.J. Lu.)
 - Double page hash table size for -DLARGE_CONFIG.
 - Integrated Bo Thorsen's X86-64 support.
 - STACKBOTTOM definition for LINUX/MIPS was partially changed back.
   (Thanks to H.J. Lu and Hiroshi Kawashima for resolving this.)
 - Replaced all occurrences of LINUX_DATA_START in gcconfig.h with
   SEARCH_FOR_DATA_START.  It doesn't hurt to falll back to a search.
   And __data_start doesn't seem to get defined correctly of the GC
   library is loaded with LD_PRELOAD, e.g. for leak detection.
 - If the GC_find_leak environment variable is set, do a
   atexit(GC_gcollect) to give us at least one chance to detect leaks.
   This may report some very benign leaks, but ...
 - Addeded REDIRECT_FREE.  It's necessary if we want leak detection with
   LD_PRELOAD.
 - Defer printing of leaked objects, as for smashed objects.
 - Fixed process and descriptor leak in GC_print_callers.  Try for
   line number even if we got function name.)
 - Ported parallel GC support and thread local allocation to Alpha.
   Not yet well-tested.
 - Added GC_DUMP_REGULARLY and added finalization statistics to GC_dump().
 - Fixed Makefile.am to mention alpha_mach_dep.S instead of the defunct
   alpha_mach_dep.s.  (Thanks to Fergus Henderson.)
 - Incorporated a change to new_gc_alloc.h, suggested by Johannes Schmidt,
   which should make it work with gcc3.1.  (I would still like to encourage
   use of gc_allocator.h instead.) 
 - Use alpha_mach_dep.S only on Linux.  (It's not clear that this is
   optimal, but it otherwise didn't build on Tru64.  Thanks to Fergus
   Henderson.)
 - Added ifdef to guard free() in os_dep.c.  Otherwise we get a
   compilation error on Irix.  (Thanks to Dai Sato.)
 - Added an experimental version of GC_memalign to mallocx.c.  This can't
   always work, since we don't handle alignment requests in the hblk-level
   allocator, and we can't handle arbitrary pointer displacements unless
   GC_all_interior_pointers is enabled.  But it should work for alignment
   requests up to HBLKSIZE.  This is not yet documented in the standard
   places.
 - Finally debugged the OSF1/Tru64 thread support.  This needs more testing,
   since I needed to add a somewhat unconvincing workaround for signal
   delivery issues that I don't yet completely understand.  But it does
   pass my tests, even in parallel GC mode.  Incremental GC support is
   disabled if thread support is enabled, due to the signal issues.
 - Eliminated name-space-incorrect definition of _cdecl from gc_cpp.h.
 - Added GC_debug_malloc_replacement and GC_debug_realloc_replacement
   declarations to gc.h.  On IA64, this is required for REDIRECT_MALLOC
   to work correctly with these.
 - Fixed Linux USE_PROC_FOR_LIBRARIES to work with a 64-bit /proc format.

Since 6.1:
 - Guard the test for GC_DUMP_REGULARLY in misc.c with
   "#ifndef NO_DEBUGGING".  Otherwise it fails to build with NO_DEBUGGING
   defined.  (Thanks to Manuel Serrano.)
 - Message about retrying suspend signals was incorrectly generated even when
   flag was not set.
 - Cleaned up MACOSX/NEXT root registration code.  There was apparently a
   separate ifdef case in GC_register_data_segments() for no reason.
 - Removed MPROTECT_VDB for MACOSX port, based on one negative report.
 - Arrange for gc.h and friends to be correctly installed with GNU-style
   "make install".
 - Enable the GNU-style build facility include C++ support in the library
   with --enable-cplusplus. (Thanks to Thomas Maier for some of the patch.)
 - Mark from GC_thread_key in linux_threads.c, in case that's allocated
   from the garbage collected heap, as it is with our own thread-specific
   storage implementation.  (Thanks to Jeff Sturm.)
 - Mark all free list header blocks if they are heap allocated.  This avoids
   some unnecessary tracing.  And it remains correct if we clear the
   root set. (Thanks to Jeff Sturm for identifying the bug.)
 - Improved S390/Linux support.  Add S390/Linux 64-bit support.  (Thanks
   to Ulrich Weigand.)
 - Corrected the spelling of GC_{M,C}ALLOC_EXPLICTLY_TYPED to
   GC_{M,C}ALLOC_EXPLICITLY_TYPED in gc_typed.h.  This is technically
   an interface change.  Based on the fact that nobody reported this,
   I suspect/hope there were no clients.
 - Cleaned up gc_typed.h so that (1) it adds an extern "C" declaration
   when appropriate, (2) doesn't generate references to undefined internal
   macros, and (3) allows easier manual construction of descriptors.
 - Close the file descriptor used by GC_print_address_map().
 - Set the "close-on-exec" bit for various file descriptors maintained
   for the collector's internal use.
 - Added a hack to find memory segments owned by the system allocator
   under win32.  Based on my tests, this tends to eventually find all
   segments, though it may take a while.  There appear to be cleaner,
   but slower solutions under NT/XP.  But they rely on an API that's
   unsupported under 9X.
 - Changed Linux PowerPC stack finding to LINUX_STACKBOTTOM.  (Thanks
   to Akira Tagoh for pointing out that HEURISTIC1 doesn't work on
   64-bit kernels.)
 - Added GC_set_free_space_divisor to avoid some Windows dll issues.
 - Added FIXUP_POINTER, POINTER_SHIFT, POINTER_MASK to allow preprocessing
   of candidate pointers for tagging, etc.
 - Always lock around GC_notify_full_gc().  Simplified code for
   invoking GC_notify_full_gc().
 - Changed the way DATASTART is defined on FreeBSD to be robust against
   an unmapped page after etext.  (Thanks to Hironori Sakamoto for
   tracking down the intermittent failure.)
 - Made GC_enable() and GC_disable() official.  Deprecated direct update
   of GC_dont_gc.  Changed GC_gcollect to be a noop when garbage collection
   is disabled.
 - Call GC_register_dynamic_libraries before stopping the world on Linux,
   in order to avoid a potential deadlock due to the dl_iterate_phdr lock.
 - Introduced a more general mechanism for platform-dependent code to
   decide whether the main data segment should be handled separately
   from dynamic libraries, or registered by GC_register_dynamic_libraries.
   The latter is more reliable and easier on Linux with dl_iterate_phdr. 

Since 6.2alpha1:
 - Fixed the completely broken FreeBSD code in 6.2alpha1.  (Thanks to
   Hironori Sakamoto for the patch.)
 - Changed IRIX reference in dbg_mlc.c to IRIX5. (Thanks to Marcus Herbert.)
 - Attempted to work around the problems with .S filenames and the SGI
   compiler.  (Reported by several people. Untested.)
 - Worked around an HP/UX make issue with the GNU-style build process.
 - Fixed the --enable-cplusplus build machinery to allow builds without
   a C++ compiler.  (That was always the intent ...)
 - Changed the debugging allocation macros to explicitly pass the return
   address for Linux and XXXBSD on hardware for which we can't get stack
   traces.  Use __builtin_return_address(0) to generate it when possible.
   Some of the configuration work was cleaned up (good) and moved to gc.h
   (bad, but necessary).  This should make leak detection more useful
   on a number of platforms.  (Thanks to Fabian Thylman for the suggestion.)
 - Fixed compilation problems in dbg_mlc.c with GC_ADD_CALLER.
 - Bumped revision number for dynamic library.

Since 6.2alpha2:
 - Don't include execinfo.h in os_dep.c when it's not needed, and may not exist.

Since 6.2alpha3:
 - Use LINUX_STACKBOTTOM for >= glibc2.2 on Linux/MIPS.  (See Debian bug
   # 177204)
 - Integrated Jeff Sturm and Jesse Rosenstock's MACOSX threads patches.
 - Integrated Grzegorz Jakacki's substantial GNU build patch.  "Make dist"
   should now work for the GNU build process.  Documentation files
   are installed under share/gc.
 - Tweaked gc_cpp.h to again support the Borland compiler.  (Thanks to
   Rene Girard for pointing out the problems.)
 - Updated BCC_MAKEFILE (thanks to Rene Girard).
 - Added GC_ASSERT check for minimum thread stack size.
 - Added --enable-gc-assertions.
 - Added some web documentation to the distribution.  Updated it in the
   process.
 - Separate gc_conf_macros.h from gc.h.
 - Added generic GC_THREADS client-defined macro to set the appropriate
   GC_XXX_THREADS internal macro.  (gc_config_macros.h.)
 - Add debugging versions of _ignore_off_page allocation primitves.
 - Moved declarations of GC_make_closure and GC_debug_invoke_finalizer
   from gc.h to gc_priv.h.
 - Reset GC_fail_count even if only a small allocation succeeds.
 - Integrated Brian Alliet's patch for dynamic library support on Darwin.
 - gc_cpp.h's gc_cleanup destructor called GC_REGISTER_FINALIZER_IGNORE_SELF
   when it should have called the lower case version, since it was
   explicitly computing a base pointer.

Since 6.2alpha4:
 - GC_invoke_finalizers could, under rare conditions, set
   GC_finalizer_mem_freed to an essentially random value.  This could
   possibly cause unbounded heap growth for long-running applications
   under some conditions.  (The bug was introduced in 6.1alpha5, and
   is not in gcc3.3.  Thanks to Ben Hutchings for finding it.)
 - Attempted to sanitize the various DLL macros.  GC_USE_DLL disappeared.
   GC_DLL is used instead.  All internal tests are now on GC_DLL.
   README.macros is now more precise about the intended meaning.
 - Include DllMain in the multithreaded win32 version only if the
   collector is actually built as a dll.  (Thanks to Mohan Embar for
   a version of the patch.)
 - Hide the cygwin threadAttach/Detach functions.  They were violating our
   namespace rules.  
 - Fixed an assertion in GC_check_heap_proc.  Added GC_STATIC_ASSERT.
   (Thanks again to Ben Hutchings.)
 - Removed some obsolete definitions for Linux/PowerPC in gcconfig.h.
 - CORD_cat was not rebalancing unbalanced trees in some cases, violating
   a CORD invariant.  Also tweaked the rebalancing rule for
   CORD_cat_char_star.  (Thanks to Alexandr Petrosian for the bug report
   and patch.)
 - Added hand-coded structured exception handling support to mark.c.
   This should enable support of dynamic libraries under win32 with
   gcc-compiled code.  (Thanks to Ranjit Mathew for the patch.)
   Turned on dynamic library scanning for win32/gcc.
 - Removed some remnants of read wrapping.  (Thanks to Kenneth Schalk.)
   GC_USE_LD_WRAP ws probably broken in recent versions.
 - The build could fail on some platforms since gcconfig.h could include
   declarations mentioning ptr_t, which was not defined, e.g. when if_mach
   was built.  (Thanks to Yann Dirson for pointing this out.)  Also
   cleaned up tests for GC_PRIVATE_H in gcconfig.h a bit. 
 - The GC_LOOP_ON_ABORT environment variable interfered with incremental
   collection, since the write fault handler was erroneously overridden.
   Handlers are now set up in the correct order.
 - It used to be possible to call GC_mark_thread_local_free_lists() while
   the world was not stopped during an incremental GC.  This was not safe.
   Fortunately, it was also unnecessary.  Added GC_world_stopped flag
   to avoid it.  (This caused occasional crashes in GC_set_fl_marks
   with thread local allocation and incremental GC.  This probably happened
   primarily on old, slow multiprocessors.)
 - Allowed overriding of MAX_THREADS in win32_threads.c from the build
   command line.  (Patch from Yannis Bres.)
 - Taught the IA64/linux code to determine the register backing store base from
   /proc/self/maps after checking the __libc symbol, but before guessing.
   (__libc symbols are on the endangered list, and the guess is likely to not
   always be right for 2.6 kernels.)  Restructured the code to read and parse
   /proc/self/maps so it only exists in one place (all platforms).
 - The -DUSE_PROC_FOR_LIBRARIES code was broken on Linux.  It claimed that it
   also registered the main data segment, but didn't actually do so.  (I don't
   think anyone actually uses this configuration, but ...)
 - Made another attempt to get --enablecplusplus to do the right thing.
   Since there are unavoidable problems with C programs linking against a
   dynamic library that includes C++ code, I separated out the c++ code into
   libgccpp.

Since 6.2alpha5:
 - There was an extra underscore in the name of GC_save_registers_in_stack
   for NetBSD/SPARC.  (Thanks to Jaap Boender for the patch.)
 - Integrated Brian Alliet's patch for Darwin.  This restructured the
   linuxthreads/pthreads support to separate generic pthreads support
   from more the system-dependent thread-stopping code.  I believe this
   should make it easier to eliminate the code duplication between
   pthreads platforms in the future.  The patch included some other
   code cleanups.
 - Integrated Dan Bonachea's patch to support AIX threads.  This required
   substantial manual integration, mostly due to conflicts with other
   recent threads changes.  It may take another iteration to
   get it to work.
 - Removed HPUX/PA-RISC support from aix_irix_threads.c.  It wasn't used
   anyway and it cluttered up the code.  And anything we can do to migrate
   towards generic pthreads support is a good thing.
 - Added a more explicit test for tracing of function arguments to test.c.
   (Thanks to Dan Grayson.)
 - Added Akira Tagoh's PowerPC64 patch.
 - Fixed some bit rot in the Cygwin port.  (Thanks to Dan Bonachea for
   pointing it out.)  Gc.h now includes just windows.h, not winbase.h.
 - Declared GC_save_regs_in_stack() in gc_priv.h.  Remove other declarations.
 - Changed --enable-cplusplus to use automake consitionals.  The old way
   confused libtool.  "Make install" didn't work correctly for the old version.
   Previously --enable-cplusplus was broken on cygwin.
 - Changed the C version of GC_push_regs to fail at compile time if it is
   generated with an empty body.  This seems to have been the cause of one
   or two subtle failures on unusual platforms.  Those failures should
   now occur at build time and be easily fixable.

Since 6.2alpha6:
 - Integrated a second round of Irix/AIX patches from Dan Bonachea.
   Renamed mips_sgi_mach_dep.S back to mips_sgi_mach_dep.s, since it requires
   the Irix assembler to do the C preprocessing; gcc -E doesn't work.
 - Fixed Makefile.direct for DARWIN.  (Thanks to Manuel Serrano.)
 - There was a race between GC_pthread_detach and thread exit that could
   result in a thread structure being deallocated by GC_pthread_detach
   eventhough it was still needed by the thread exit code.  (Thanks to
   Dick Porter for the small test case that allowed this to be debugged.)
 - Fixed version parsing for non-alpha versions in acinclude.m4 and
   version checking in version.h.

Since 6.2:
 - Integrated some NetBSD patches forwarded to me by Marc Recht.  These
   were already in the NetBSD package.    
 - GC_pthread_create waited for the semaphore even if pthread_create failed.
   Thanks to Dick Porter for the pthread_support.c patch.  Applied the
   analogous fix for aix_irix_threads.c.
 - Added Rainer Orth's Tru64 fixes.
 - The check for exceeding the thread table size in win32 threadDetach
   was incorrect.  (Thanks to Alexandr Petrosian for the patch.)
 - Applied Andrew Begel's patch to correct some reentrancy issues
   with dynamic loading on Darwin.
 - GC_CreateThread() was neglecting to duplicate the thread handle in
   the table.  (Thanks to Tum Nguyen for the patch.)
 - Pass +ESdbgasm only on PA-RISC machines with vendor compiler.
   (Thanks to Roger Sayle for the patch.)
 - Applied more AIX threads patches from Scott Ananian.

Since 6.3alpha1:
 - Reenabled I_HOLD_LOCK assertion in aix_irix_threads.h.
 - Put back the WINABI qualifier for GC_CreateThread.  (Thanks to
   Danny Smith for the patch.  6.3alpha1 had the qualifier in one place
   but not elsewhere, which was clearly wrong.)
 - Sometimes explicitly define __private_extern__ before DARWIN dyld.h
   include.  (Thanks to Andreas Tobker for postting the patch.)
 - Included signal.h from pthread_support.c.  Removed GC_looping_handler,
   which was dead code.
 - GC_find_start was misdeclared by gc_pmark.h if PRINT_BLACK_LIST was
   defined.  (Thanks to Glauco Masotti for testing and reporting this.)
   Changed GC_find_start to never just return 0.  According to its
   comment it doesn't, and it's unclear that's correct.
 - GC_alloc_large had several largely compensating bugs in the
   computation of GC_words_wasted.  (It was confused about bytes vs.
   words in two places.)
 - Integrated Slava Sysoltev's patch to support more recent versions of
   the Intel compiler on IA64/Linux.
 - Changed win32 spinlock initialization to conditionally set a spin count.
   (Emmanual Stumpf pointed out that enabling this makes a large performance
   difference on win32 multiprocessors.)  Also cleaned up the win32 spinlock
   initialization code a bit.
 - Fixed thread support for HP/UX/IA64.  The register backing store base for
   the main thread was sometimes not set correctly.  (Thanks to Laurent
   Morichetti.)
 - Added -DEMPTY_GETENV_RESULTS flag to work around Wine problem.
 - Declare GC_stack_alloc and GC_stack_free in solaris_threads.h to
   avoid 64-bit size mismatches.  (Thanks to Bernie Solomon.)
 - Fixed GC_generic_push_regs to avoid a potential and very unfortunate
   tail call optimization.  This could lead to prematurely reclaimed
   objects on configurations that used the generic routine and the new
   build infrastructure (which potentially optimizes mach_dep.c).
   This was a serious bug, but it's unclear whether it has resulted in
   any real failures.
 - Fixed CORD_str to deal with signed characters.  (Thanks to Alexandr
   Petrosian for noticing the problem and supplying the patch.)
 - Merged a couple of NOSYS/ECOS tests into os_dep.c from gcj.  (Thanks
   to Anthony Green.)
 - Partially merged a win32 patch from Ben Hutchings, and substantially
   revised other parts of win32_threads.c.  It had several problems.
   Under MinGW with a statically linked library, the main thread was
   not registered.  Cygwin detached threads leaked thread descriptors.
   There were several race conditions.  For now, unfortunately the
   static threads limit remains, though we increased it, and made table
   traversal cost depend on the actual thread count.
   There is also still some code duplication with pthread_support.c.
   (Thread descriptors did become much smaller, since Ben Hutchings
   removed the thread context from them.)
 - Integrated a Solaris configure.in patch from Rainer Orth.
 - Added GC_IGNORE_FB and associated warning to very partially address
   the issue of the collector treating a mapped frame buffer as part
   of the root set.  (Thanks to David Peroutka for providing some
   insight.  More would be helpful.  Is there anything that can be used
   to at least partially identify such memory segments?)
   
Since 6.3alpha2:
 - Removed -DSMALL_CONFIG from BCC_MAKEFILE.
 - Changed macros to test for an ARM processor (Patch from Richard Earnshaw.)
 - Mostly applied a DJGPP patch from Doug Kaufman.  Especially Makefile.dj
   had suffered from serious bit rot.
 - Rewrote GC_apply_to_maps, eliminating an off-by-one subscript error,
   and a call to alloca (for lcc compatibility).
 - Changed USE_MUNMAP behavior on posixy platforms to immediately remap
   the memory with PROT_NONE instead of unmapping it.  The latter risks
   an intervening mmap grabbing the address space out from underneath us.
   Updated this code to reflect a cleaner patch from Ulrich Drepper.
 - Replaced _T with _Tp in new_gc_alloc.h to avoid a MACOS X conflict.
   (Patch from Andrew Begel.)
 - Dynamically choose whether or not lock should spin on win32.  (Thanks
   to Maurizio Vairani for the patch.)  This may be a significant performance
   improvement for win32.
 - Fix Makefile.direct to actually include NT_STATIC_THREADS_MAKEFILE
   in the distribution.  (Again thanks to Maurizio Vairani.)
 - Maybe_install_looping_handler() was accidentally exported, violating
   our name space convention.
 - Made os_dep.c use sigsetjmp and SA_NODEFER for NetBSD.  (Thanks to
   Christian Limpach.)  (I generalized the patch to use sigsetjmp on all
   UNIX_LIKE platforms, admittedly a slightly risky move.  But it may avoid
   similar problems on some other platforms. I also cleaned up the defn
   of UNIX_LIKE a bit. - Hans)
 - Integrated Andrew Begel's Darwin threads patch, adjusted according to
   some of Fergus Hendersons's comments.  (Patch didn't apply cleanly,
   errors are possible.)
 - Added another test or two for the Intel 8.0 compiler to avoid
   confusing it with gcc.  The single-threaded collector should now build
   with icc, at least on ia64. 

Since 6.3alpha3:
 - USE_MMAP was broken by confusion in the code dealing with USE_MMAP_ANON.
   (This was pointed out, and fixes were suggested by several other people.)
 - Darwin supprt was broken in alpha3 as a result of my misintegration of
   Andrew Begel's patches.  Fixed with another patch from Andrew Begel.
 - A new sanity check in pthread_stop_world.c:GC_push_all_stacks() was
   overly aggressive.  We may collect from an unregistered thread during
   thread creation.  Fixed by explicitly checking for that case.  (Added
   GC_in_thread_creation.)

Since 6.3alpha4:
 - Fix & vs && typo in GC_generic_malloc and
   GC_generic_malloc_ignore_off_page.  (Propagated from the gcc tree.)
 - Removed SA_NODEFER hack from NetBSD and Solaris write-protect handler.
   (According to Christian Limpach, the NetBSD problem is fixed.
   Presumably so is the Solaris 2.3 problem.)
 - Removed placement delete from gc_cpp.h for the SGI compiler.
   (Thanks to Simon Gornall for the patch.)
 - Changed semantics of the GC_IGNORE_FB environment variable, based 
   on experimentation by Nicolas Cannasse pointing out that the old
   interpretation was useless.  We still need help in identifying win32
   graphics memory mappings.  The current "solution" is a hack.
 - Removed "MAKEOVERRIDES =" from Makefile.am and thus Makefile.in.
   It probably made more sense in the gcc context.
 - Explicitly ensure that NEED_FIND_LIMIT is defined for {Open,Net}BSD/ELF.
 - Replaced USE_HPUX_TLS macro by USE_COMPILER_TLS, since gcc often
   supports the same extension on various platforms.
 - Added some basic (completely untested) defines for win64, in support
   of future work.
 - Declared GC_jmp_buf in os_dep.s as JMP_BUF instead of jmp_buf, fixing
   a memory overwrite bug on Solaris and perhaps other platforms.
 - Added 0 != __libc_stack_end test to GC_linux_stack_base.  (Thanks to Jakub
   Jelinek, both for the patch, and for explaining the problem to me.)
   Otherwise "prelink"ing could cause the collector to fail.
 - Changed default thread local storage implementation to USE_PTHREAD_SPECIFIC
   for HP/UX with gcc.  The compiler-based implementation appears to work
   only with the vendor compiler.
 - Export GC_debug_header_size and GC_USR_PTR_FROM_BASE from gc_mark.h,
   making client mark code cleaner and less dependent on GC version.
 - Export several new procedures and GC_generic_malloc from gc_mark.h
   to support user-defined kinds.  Use the new procedures to replace existing
   code in gcj_mlc.c and typd_mlc.c.
 - Added support for GC_BACKTRACES.
 - Fixed a remaining problem in CORD_str with signed characters.  (Thanks
   to Alexandr Petrosian for the patch.)
 - Removed supposedly redundant, but very buggy, definitions of finalizer
   macros from javaxfc.h.  Fortunately this file probably has no users.
   The correct declarations were already in gc.h.
 - Also need to set GC_in_thread_creation while waiting for GC during
   thread termination, since it is also possible to collect from an
   unregistered thread in that case.
 - Define NO_GETENV for Windows CE, since getenv doesn't appear to exist.
   + some other minor WinCE fixes. (Thanks to Alain Novak.)
 - Added GC_register_describe_type_fn.
 - Arrange for debugging finalizer registration to ignore non-heap
   registrations, since the regular version of the routine also behaves
   that way.
 - GC_gcj_malloc and friends need to check for finalizers waiting to be run.
   One of the more obscure allocation routines with missing a LOCK() call.
 - Fixed cvtres invocations in NT_MAKEFILE and NT_STATIC_THREADS_MAKEFILE
   to work with VS.NET.
 - Cleaned up GC_INIT calls in test.  Updated gc.man to encourage GC_INIT
   use in portable code.
 - Taught the GC to use libunwind if --enable-full-debug is specified on
   IA64 and libunwind is present.
 - The USE_MUNMAP code could get confused about the age of a block and
   prematurely unmap it.  GC_unmap_old had a bug related to wrapping of
   GC_gc_no.  GC_freehblk and GC_merge_unmapped didn't maintain
   hb_last_reclaimed reasonably when blocks were merged.  The code was
   fixed to reflect original intent, but that may not always be an
   improvement.  See todo list item.

Since 6.3alpha5:
 - Define USE_GENERIC_PUSH_REGS for NetBSD/M68K.
 - Fixed the X86_64 PREFETCH macros to correctly handle ia32e (which uses
   different prefetch instructions from AMD64).  (Thanks to H.J. Lu.)
 - GC_config_macros.h did not correctly define GC_WIN32_THREADS from
   GC_THREADS. 
 - Added simple_example.html.
 - Merged Andrew Gray's patch to correctly restore signal handlers on
   FreeBSD.
 - Merged a patch from Andreas Jaeger to deal with prefetch-related warnings
   on x86-64.  Added some other casts so that the PREFETCH macros
   always get a ptr_t argument.  Removed some casts inthe PREFETCH
   implementations.
 - At Jesse Jones suggestion: Added a header guard for gc_allocator.h
   and changed GC_debug_free to clobber contents of deallocated object.
 - The signal masking code in pthread_stop_world.c contained some errors.
   In particular SIGSEGV was masked in the handler, in spite of the fact that
   it wrote to the heap.  This could lead to an uncaught SIGSEGV, which
   apparently became much more likely in Linux 2.6.  Also fixed some
   typos, and reduced code duplication in the same area.
 - Remove ltconfig, clean up configure messages for DGUX (thanks to
   Adrian Bunk for the patches).
 - Integrated NetBSD/OpenBSD patches from Marc Recht and Matthias Drochner.

Since gc6.3alpha6:
 - Compile test_cpp.cc with CXXCOMPILE instead of COMPILE.
 - Very large allocations could cause a collector hang.  Correct
   calculation of GC_collect_at_heapsize.
 - GC_print_hblkfreelist printed some bogus results if USE_MUNMAP
   was defined.
 - The generic GC_THREADS macro didn't work correctly on Solaris,
   since the implementation failed to include gc_config_macros.h
   before deciding whether or not to compile the rest of the file.
 - Threadlibs.c failed to expand the generic GC_THREADS macro.
 - Correct MacOSX thread stop code. (Thanks to Dick Porter.)
 - SMALL_OBJ definition was off by one.  This could cause crashes
   at startup.  (Thanks to Zoltan Varga for narrowing this down to
   a trivial test case.)
 - Integrate Paolo Molara's patch to deal with a race in the Darwin
   thread stopping code.
 - Changed X86_64 implementation to use SA_SIGINFO in the MPROTECT_VDB
   implementation.  The old approach appears to have been broken by
   recent kernels.
 - Add GC_ATTR_UNUSED to eliminate a warning in gc_allocator.h.  (Thanks
   to Andrew Begel.)
 - Fix GC_task_self declaration in os_dep.c.  (Thanks to Andrew Pinski.)
 - Increase INITIAL_BUF_SZ in os_dep.c for Solaris /proc reads.

Since 6.3:
 - Merge gcconfig.h changes from gcc tree.
 - Unconditionally include gc_priv.h in solaris_pthreads.c, win32_threads.h,
   aix_irix_threads.c, and solaris_threads.c to get thread definitions.
 - Start marker threads in GC_thr_init, so that they get started even
   if no other threads are ever started.  (Oddly enough, the parallel
   collector worked correctly, though not well, with no helper threads.)
 - Go ahead and split large blocks in GC_allochblk_nth if GC_dont_gc
   is set.  (Thanks to Alexander Petrossian.)
 - GC_PRINT_BACK_HEIGHT would deadlock with thread support.
 - Let in_progress_space in backgraph.s grow dynamically.
 - Fix README.solaris2.  The GC_thr_init() hack doesn't work anymore.
 - Convert GC_finalizer_mem_freed to bytes in allchblk.c.
 - Add missing declaration for GC_generic_malloc_words_small_inner.
   Without it, s390x breaks.  (Thanks to Ulrich Weigand.)
 - Applied several MacOSX patches to support older tool chains.
   (Thanks to Stefan Ring.)
 - Bug fix for NetBSD/amd64.  (Thanks to Marc Recht.)  Add NetBSD/sh3
   support.  (Thanks to Uchiyama Yasushi.)
 - Fixed an uninitialized variable in cordprnt.c.  (Thanks to gcc for
   providing the warning.)
 - Eliminated some, but not all, gcc -Wall warnings.
 - Changed some old style casts to reinterpret_cast in new_gc_alloc.h.
   (Thanks to Dan Grayson.)
 - GC_extend_size_map shouldn't adjust for GC_all_interior_pointers if
   GC_DONT_ADD_BYTE_AT_END is set.
 - Changed some (long) casts to (word) in preparation for win64.
   (Thanks to Peter Colson.)
 - Changed "int stack_size" declaration in pthread_support.c to use
   size_t.  (Only mattered with GC_ASSERTIONS enabled.)
 - Added CRIS (etrax) support.  (Thanks to Simon Posnjak and
   Hans-Peter Nilsson.)
 - Removed GC_IGNORE_FB frame buffer recognition, and replaced
   it with a check that the mapping type is MEM_IMAGE.
   In theory, this should work much better, but it is a high
   risk change for win32.  (Thanks to Ashley Bone for the crucial
   experimental data behind this, and to Rutger Ovidus for
   some further experiments.)
 - Fixed print_block_list to print the correct kind number for
   STUBBORN.  (Thanks to Rutger Ovidus.)
 - GC_allochblk_nth incremented GC_words_wasted by bytes rather than
   words.
 - Consider GC_words_wasted in GC_adj_words_allocd only if it is within
   reason.  (A hack to avoid some extremely unlikely scenarios in which
   we manage to allocate only "wasted" space.  7.0 has a better fix.)
 - Changed PowerPC GC_clear implementation to use lwsync instead of
   eieio, since the documentation recommends against eieio, and
   it seems to be incorrect if the preceding memory op is a load.
 - Fixed print_block_list to print the correct kind number for
   STUBBORN.  (Thanks to Rutger Ovidus.)
 - Have configure.in generate an error if it is asked to support
   pthreads, but doesn't know how to.
 - Added Kazuhiro Inaoka's patch for Renesas M32R support.
 - Have the GNU build mechanism link with -ldl.  Rename THREADLIBS
   to THREADDLLIBS to reflect this.  (Thanks to Sven Verdoolaege.)
 - Added Hannes Mehnert's patch for FreeBSD/SPARC support.
 - Merged some FreeBSD specific patches to threadlibs.c and dyn_load.c.
   (Thanks tp John Merryweather Cooper.)
 - Define MPROTECT_VDB on MACOSX only if threads are being used, since the
   dirty page tracking mechanism uses threads.  (This avoids an undefined
   reference to _GC_darwin_register_mach_handler_thread.)
 - By popular demand, use __libc symbols only if we are built with
   USE_LIBC_PRIVATES, which is off by default, and not otherwise documented.
 - Ignore GC_enable_incremental() requests when KEEP_BACK_PTRS is set.
   The GC itself will dirty lots of pages in this cases, probably making
   it counterproductive on all platforms.  And the DARWIN port crashes.

Since GC6.4:
 - Integrated Paolo Molaro's patch to deal with EINTR in sem_wait.
 - Make GC_approx_sp() write to dummy location to ensure that stack
   is grown here, when sp looks reasonable, rather than later, when
   it might look like a bad memory reference.  (Problem was never
   observed that I know of.  But on rereading the code it seemed
   dubious.)
 - Separate out GC_with_callee_saves_pushed and sometimes call
   it from GC_suspend_handler in pthread_stop_world.c.  Callee-save
   register values sometimes failed to get traced under HP/UX on
   PA-RISC.  Linux/IA64 had the same problem, though non-stacked
   callee-save registers seem to be so rarely used there that nobody
   ever noticed.
 - Integrated an ancient Darwin powerpc_darwin_machine_dep.s patch
   from Andreas Tobler, which I had lost.
 - Fix compare_and_exchange implementation for gcc/IA64 to deal with
   pickier compiler versions.
 - Fixed Itanium 32-bit ABI support (HP/UX).  In particular, the
   compare_and_exchange implementation didn't consider that possibility.
 - Undefine GC_pthread_detach in win32_threads.c.  (Thanks to
   Tagliapietra Tommaso.)
 - Fixed inclusion of frame.h for NETBSD in os_dep.c.
 - Applied Dan Bonachea's patch to use mmap on AIX.
 - Several fixes to resurrect the Irix port on recent OS versions.
 - Change ALPHA to use LINUX_STACKBOTTOM.
 - Change SPARC64/LINUX to also use LINUX_STACKBOTTOM.  Deal with potential
   bad values of __libc_stack_end on that platform.  (Thanks to David Miller.)
 - Relax gctest to allow larger heap if ALIGN_DOUBLE isn't set.
   (Unnecessary in 7.0)
 - Force a define of __STDC__=0 for the IBM compiler on AIX, so that
   we get prototypes.  (Unnecessary in 7.0)
 - GC_INIT definition for AIX and CYGWIN referred to DATASTART and DATAEND
   which are only defined in private include files.
 - Integrated some small gcconfig.h patches from Dan Bonachea.  Also
   relaxed assertion about FreeBSD stack size in pthread_support.c.
 - Integrated Andrew Begel's darwin_stop_world.c patch for 64-bit
   support.  This may need additional work.
 - Avoided potentially infinite recursion in GC_save_callers if
   the system backtrace calls malloc.  The workaround currently requires
   __thread support if this code is used with threads.
 - Avoided another similar infinite recursion by conditionally
   invoking GC_save_callers in alloc.c.  (Thanks to Matthias Andree
   for helping to track down both of these.)
 - Removed all traces of aix_irix_threads.c.  AIX and Irix now use
   pthread_support.c and pthread_stop_world.c.  The old code appeared
   to be unreliable for AIX, and was not regularly maintained.
 - On Irix, ignore segments with MA_FETCHOP or MA_NOTCACHED attributed;
   they're not always safe to read.
 - Fixed a previously vacuous assertion (diagnosed by the SGI compiler)
   in GC_remove_from_fl.
 - Fix stack_size assertion in GC_pthread_create.
 - Fix assertion in GC_steal_mark_stack.
  
Since 6.5
 - Fix CPU count detection for Irix and FreeBSD. (Thanks to Dan Bonachea.)
 - Integrate Dan Bonachea's patch for the IBM XLC compiler on Darwin.
 - Integrated Andreas Tobler's FreeBSD/PowerPC patch.
 - Don't access the GC thread structure from the restart handler.  It's
   unsafe, since the handler may run too late.  (Thanks to Ben Maurer for
   tracking this down.)
 - Applied Christian Thalinger's patch to change comment syntax in
   alpha_mach_dep.S.
 - Added test for GC_no_dls in GC_dyld_image_add for DARWIN. (Thanks to
   Juan Jose Garcia Ripoli).
 - Use LINUX_STACKBOTTOM for Linux/SH and LINUX/ARM. (Thanks to Sugioka
   Toshinobu and Christian Thalinger.)
 - Rewrote GC_parse_map_entry.  This assumed a fixed column layout of
   /proc/self/maps on Linux.  This ceased to be true about 2 years ago.
   The old code is probably quite problemetic with -DREDIRECT_MALLOC.  It
   is also used by default for IA64, though I haven't seen actual failures
   there.
 - More consistently define HBLKSIZE to 4096 on 64 bit architectures with
   4K pages.  (Thanks to Andrew Haley.)
 - With win32 threads, GC_stop_world needs to acquire GC_write_cs.  (Thanks
   to Ben Hutchings for the observation and patch.)
 - Move up struct callinfo declaration to make gcc 4.0.2. happy.

To do:
 - The USE_MUNMAP code should really use a separate data structure
   indexed by physical page to keep track of time since last use of
   a page.  Using hblk headers means we lose track of ages when
   blocks are merged, and we can't unmap pages that have been allocated and
   dropped by the blacklisting code.  I suspect both of these matter.
 - A dynamic libgc.so references dlopen unconditionally, but doesn't link
   against libdl.
 - GC_proc_fd for Solaris is not correctly updated in response to a
   fork() call.  Thus incremental collection in the child won't work
   correctly.  (Thanks to Ben Cottrell for pointing this out.)
 - --enable-redirect-malloc is mostly untested and known not to work
   on some platforms. 
 - There seem to be outstanding issues on Solaris/X86, possibly with
   finding the data segment starting address.  Information/patches would
   be appreciated.
 - Very large root set sizes (> 16 MB or so) could cause the collector
   to abort with an unexpected mark stack overflow.  (Thanks again to
   Peter Chubb.)  NOT YET FIXED.  Workaround is to increase the initial
   size.
 - The SGI version of the collector marks from mmapped pages, even
   if they are not part of dynamic library static data areas.  This
   causes performance problems with some SGI libraries that use mmap
   as a bitmap allocator.  NOT YET FIXED.  It may be possible to turn
   off DYNAMIC_LOADING in the collector as a workaround.  It may also
   be possible to conditionally intercept mmap and use GC_exclude_static_roots.
   The real fix is to walk rld data structures, which looks possible.
 - Incremental collector should handle large objects better.  Currently,
   it looks like the whole object is treated as dirty if any part of it
   is.
 
