boehm-gc (all platforms, mega-) configuration patch

Loren James Rittle rittle@latour.rsch.comm.mot.com
Fri Mar 22 09:33:00 GMT 2002


This rote patch was generated as follows.  If it looked like a linker
script synthesized item, then use this idiom:

	extern int end[];
	end

instead of:

	extern int end;
	&end

Note: binutils sometimes synthesized and provides __data_start (and
symbols similar to that); sometimes they are provided by glibc.  If it
could be a synthesized item, I converted the use without looking at
the particular platform's configuration.  As long as only the address
was used, I believe that this conversion is completely safe even if it
wasn't a synthesized item (yes, it seems slimy to me that this trick
works).

This patch hits far more platforms than I can personally test [1].  I
understand why such symbols can be referenced either way but RTH or
another binutils expert would have to explain why the latter is
actually needed (or will be needed with newer binutils) on some
platforms.

If an item was explicitly mentioned as coming from a source file and
not a linker script synthesized item, then I didn't touch it.

To ensure that I updated everything properly, I double-checked by
closely inspecting every hit of this regexp: [^&]&[^&] after finishing
the first pass of the edit (this caught two uses I had missed).

Then I triple-checked the actual text of the patch I am now
submitting.  I would like some other eyes before approval (no way I am
installing this without explicit approval ;-)

[1] Rebuilt and tested on:

i386-*-freebsd4.5 (in recent gcc bootstrap tree)
alpha-*-freebsd4.2 (in recent gcc bootstrap tree)
sparc-sun-solaris2.7 (in new boehm-gc using installed gcc 3.1 20020125)
alphaev67-dec-osf5.1 (in new boehm-gc using installed gcc 2.95.1)
i386-*-linux* (in new boehm-gc using stock RedHat 6 toolchain)

	* include/private/gcconfig.h: Change all likely references
	to linker script synthesized symbols to use this idiom:
	extern int etext[]; etext

Index: include/private/gcconfig.h
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/include/private/gcconfig.h,v
retrieving revision 1.12
diff -c -r1.12 gcconfig.h
*** gcconfig.h	2002/03/22 02:40:32	1.12
--- gcconfig.h	2002/03/22 06:11:10
***************
*** 450,456 ****
   * On UNIX systems, the collector will scan the area between DATASTART
   * and DATAEND for root pointers.
   *
!  * DATAEND, if not &end.
   *
   * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
   * the pointer size.
--- 450,458 ----
   * On UNIX systems, the collector will scan the area between DATASTART
   * and DATAEND for root pointers.
   *
!  * DATAEND, if not `end' where `end' is defined as ``extern int end[];''.
!  * RTH suggests gaining access to linker script synth'd values with
!  * this idiom instead of `&end' where `end' is defined as ``extern int end;'' .
   *
   * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
   * the pointer size.
***************
*** 546,559 ****
  #   ifdef OPENBSD
  #	define OS_TYPE "OPENBSD"
  #	define HEURISTIC2
! 	extern char etext;
! #	define DATASTART ((ptr_t)(&etext))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
  #	define HEURISTIC2
! 	extern char etext;
! #	define DATASTART ((ptr_t)(&etext))
  #   endif
  #   ifdef LINUX
  #       define OS_TYPE "LINUX"
--- 548,561 ----
  #   ifdef OPENBSD
  #	define OS_TYPE "OPENBSD"
  #	define HEURISTIC2
! 	extern char etext[];
! #	define DATASTART ((ptr_t)(etext))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
  #	define HEURISTIC2
! 	extern char etext[];
! #	define DATASTART ((ptr_t)(etext))
  #   endif
  #   ifdef LINUX
  #       define OS_TYPE "LINUX"
***************
*** 576,599 ****
                               /* contain large read-only data tables    */
                               /* that we'd rather not scan.             */
  #	     endif /* !GLIBC2 */
!              extern int _end;
! #            define DATAEND (&_end)
  #       else
!              extern int etext;
! #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #       endif
  #   endif
  #   ifdef SUNOS4
  #	define OS_TYPE "SUNOS4"
! 	extern char etext;
! #	define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff))
  #	define HEURISTIC1	/* differs	*/
  #	define DYNAMIC_LOADING
  #   endif
  #   ifdef HP
  #	define OS_TYPE "HP"
! 	extern char etext;
! #       define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #       define STACKBOTTOM ((ptr_t) 0xffeffffc)
  			      /* empirically determined.  seems to work. */
  #  	include <unistd.h>
--- 578,601 ----
                               /* contain large read-only data tables    */
                               /* that we'd rather not scan.             */
  #	     endif /* !GLIBC2 */
!              extern int _end[];
! #            define DATAEND (_end)
  #       else
!              extern int etext[];
! #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #       endif
  #   endif
  #   ifdef SUNOS4
  #	define OS_TYPE "SUNOS4"
! 	extern char etext[];
! #	define DATASTART ((ptr_t)((((word) (etext)) + 0x1ffff) & ~0x1ffff))
  #	define HEURISTIC1	/* differs	*/
  #	define DYNAMIC_LOADING
  #   endif
  #   ifdef HP
  #	define OS_TYPE "HP"
! 	extern char etext[];
! #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #       define STACKBOTTOM ((ptr_t) 0xffeffffc)
  			      /* empirically determined.  seems to work. */
  #  	include <unistd.h>
***************
*** 601,613 ****
  #   endif
  #   ifdef SYSV
  #	define OS_TYPE "SYSV"
! 	extern etext;
! #   	define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
  				   & ~0x3fffff) \
! 				  +((word)&etext & 0x1fff))
  	/* This only works for shared-text binaries with magic number 0413.
  	   The other sorts of SysV binaries put the data at the end of the text,
! 	   in which case the default of &etext would work.  Unfortunately,
  	   handling both would require having the magic-number available.
  	   	   		-- Parag
  	   */
--- 603,615 ----
  #   endif
  #   ifdef SYSV
  #	define OS_TYPE "SYSV"
! 	extern etext[];
! #   	define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
  				   & ~0x3fffff) \
! 				  +((word)etext & 0x1fff))
  	/* This only works for shared-text binaries with magic number 0413.
  	   The other sorts of SysV binaries put the data at the end of the text,
! 	   in which case the default of etext would work.  Unfortunately,
  	   handling both would require having the magic-number available.
  	   	   		-- Parag
  	   */
***************
*** 667,674 ****
  #     define STACK_GRAN 0x10000000
  	/* Stack usually starts at 0x80000000 */
  #     define LINUX_DATA_START
!       extern int _end;
! #     define DATAEND (&_end)
  #   endif
  #   ifdef MACOSX
        /* There are reasons to suspect this may not be reliable. 	*/
--- 669,676 ----
  #     define STACK_GRAN 0x10000000
  	/* Stack usually starts at 0x80000000 */
  #     define LINUX_DATA_START
!       extern int _end[];
! #     define DATAEND (_end)
  #   endif
  #   ifdef MACOSX
        /* There are reasons to suspect this may not be reliable. 	*/
***************
*** 685,700 ****
  #     define ALIGNMENT 4
  #     define OS_TYPE "NETBSD"
  #     define HEURISTIC2
!       extern char etext;
  #     define DATASTART GC_data_start
  #     define DYNAMIC_LOADING
  #   endif
  #   ifdef NOSYS
  #     define ALIGNMENT 4
  #     define OS_TYPE "NOSYS"
!       extern void __end, __dso_handle;
! #     define DATASTART (&__dso_handle)  /* OK, that's ugly.  */
! #     define DATAEND (&__end)
  	/* Stack starts at 0xE0000000 for the simulator.  */
  #     undef STACK_GRAN
  #     define STACK_GRAN 0x10000000
--- 687,702 ----
  #     define ALIGNMENT 4
  #     define OS_TYPE "NETBSD"
  #     define HEURISTIC2
!       extern char etext[];
  #     define DATASTART GC_data_start
  #     define DYNAMIC_LOADING
  #   endif
  #   ifdef NOSYS
  #     define ALIGNMENT 4
  #     define OS_TYPE "NOSYS"
!       extern void __end[], __dso_handle[];
! #     define DATASTART (__dso_handle)  /* OK, that's ugly.  */
! #     define DATAEND (__end)
  	/* Stack starts at 0xE0000000 for the simulator.  */
  #     undef STACK_GRAN
  #     define STACK_GRAN 0x10000000
***************
*** 705,712 ****
  # ifdef VAX
  #   define MACH_TYPE "VAX"
  #   define ALIGNMENT 4	/* Pointers are longword aligned by 4.2 C compiler */
!     extern char etext;
! #   define DATASTART ((ptr_t)(&etext))
  #   ifdef BSD
  #	define OS_TYPE "BSD"
  #	define HEURISTIC1
--- 707,714 ----
  # ifdef VAX
  #   define MACH_TYPE "VAX"
  #   define ALIGNMENT 4	/* Pointers are longword aligned by 4.2 C compiler */
!     extern char etext[];
! #   define DATASTART ((ptr_t)(etext))
  #   ifdef BSD
  #	define OS_TYPE "BSD"
  #	define HEURISTIC1
***************
*** 738,748 ****
  #   define ALIGN_DOUBLE
  #   ifdef SUNOS5
  #	define OS_TYPE "SUNOS5"
! 	extern int _etext;
! 	extern int _end;
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
! #	define DATAEND (&_end)
  #	if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
  #	    define USE_MMAP
  	    /* Otherwise we now use calloc.  Mmap may result in the	*/
--- 740,750 ----
  #   define ALIGN_DOUBLE
  #   ifdef SUNOS5
  #	define OS_TYPE "SUNOS5"
! 	extern int _etext[];
! 	extern int _end[];
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext)
! #	define DATAEND (_end)
  #	if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
  #	    define USE_MMAP
  	    /* Otherwise we now use calloc.  Mmap may result in the	*/
***************
*** 780,788 ****
  #	define OS_TYPE "SUNOS4"
  	/* [If you have a weak stomach, don't read this.]		*/
  	/* We would like to use:					*/
! /* #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */
  	/* This fails occasionally, due to an ancient, but very 	*/
! 	/* persistent ld bug.  &etext is set 32 bytes too high.		*/
  	/* We instead read the text segment size from the a.out		*/
  	/* header, which happens to be mapped into our address space	*/
  	/* at the start of the text segment.  The detective work here	*/
--- 782,790 ----
  #	define OS_TYPE "SUNOS4"
  	/* [If you have a weak stomach, don't read this.]		*/
  	/* We would like to use:					*/
! /* #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1fff) & ~0x1fff)) */
  	/* This fails occasionally, due to an ancient, but very 	*/
! 	/* persistent ld bug.  etext is set 32 bytes too high.		*/
  	/* We instead read the text segment size from the a.out		*/
  	/* header, which happens to be mapped into our address space	*/
  	/* at the start of the text segment.  The detective work here	*/
***************
*** 798,805 ****
  #   ifdef DRSNX
  #	define OS_TYPE "DRSNX"
  	extern char * GC_SysVGetDataStart();
! 	extern int etext;
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
  #	define MPROTECT_VDB
  #       define STACKBOTTOM ((ptr_t) 0xdfff0000)
  #	define DYNAMIC_LOADING
--- 800,807 ----
  #   ifdef DRSNX
  #	define OS_TYPE "DRSNX"
  	extern char * GC_SysVGetDataStart();
! 	extern int etext[];
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, etext)
  #	define MPROTECT_VDB
  #       define STACKBOTTOM ((ptr_t) 0xdfff0000)
  #	define DYNAMIC_LOADING
***************
*** 811,833 ****
  #     else
            Linux Sparc/a.out not supported
  #     endif
!       extern int _end;
!       extern int _etext;
! #     define DATAEND (&_end)
  #     define SVR4
  #     ifdef __arch64__
  #       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
! #	define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, &_etext)
  #     else
  #       define STACKBOTTOM ((ptr_t) 0xf0000000)
! #	define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
  #     endif
  #   endif
  #   ifdef OPENBSD
  #     define OS_TYPE "OPENBSD"
  #     define STACKBOTTOM ((ptr_t) 0xf8000000)
!       extern int etext;
! #     define DATASTART ((ptr_t)(&etext))
  #   endif
  #   ifdef NETBSD
  #     define OS_TYPE "NETBSD"
--- 813,835 ----
  #     else
            Linux Sparc/a.out not supported
  #     endif
!       extern int _end[];
!       extern int _etext[];
! #     define DATAEND (_end)
  #     define SVR4
  #     ifdef __arch64__
  #       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
! #	define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, _etext)
  #     else
  #       define STACKBOTTOM ((ptr_t) 0xf0000000)
! #	define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext)
  #     endif
  #   endif
  #   ifdef OPENBSD
  #     define OS_TYPE "OPENBSD"
  #     define STACKBOTTOM ((ptr_t) 0xf8000000)
!       extern int etext[];
! #     define DATASTART ((ptr_t)(etext))
  #   endif
  #   ifdef NETBSD
  #     define OS_TYPE "NETBSD"
***************
*** 836,843 ****
  #	define DATASTART GC_data_start
  #	define DYNAMIC_LOADING
  #     else
! 	extern char etext;
! #	define DATASTART ((ptr_t)(&etext))
  #     endif
  #   endif
  # endif
--- 838,845 ----
  #	define DATASTART GC_data_start
  #	define DYNAMIC_LOADING
  #     else
! 	extern char etext[];
! #	define DATASTART ((ptr_t)(etext))
  #     endif
  #   endif
  # endif
***************
*** 857,880 ****
  #   endif
  #   ifdef SEQUENT
  #	define OS_TYPE "SEQUENT"
! 	extern int etext;
! #       define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #       define STACKBOTTOM ((ptr_t) 0x3ffff000) 
  #   endif
  #   ifdef BEOS
  #     define OS_TYPE "BEOS"
  #     include <OS.h>
  #     define GETPAGESIZE() B_PAGE_SIZE
!       extern int etext;
! #     define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #   endif
  #   ifdef SUNOS5
  #	define OS_TYPE "SUNOS5"
!         extern int _etext, _end;
    	extern char * GC_SysVGetDataStart();
! #       define DATASTART GC_SysVGetDataStart(0x1000, &_etext)
! #	define DATAEND (&_end)
! /*	# define STACKBOTTOM ((ptr_t)(&_start)) worked through 2.7,  	*/
  /*      but reportedly breaks under 2.8.  It appears that the stack	*/
  /* 	base is a property of the executable, so this should not break	*/
  /* 	old executables.						*/
--- 859,882 ----
  #   endif
  #   ifdef SEQUENT
  #	define OS_TYPE "SEQUENT"
! 	extern int etext[];
! #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #       define STACKBOTTOM ((ptr_t) 0x3ffff000) 
  #   endif
  #   ifdef BEOS
  #     define OS_TYPE "BEOS"
  #     include <OS.h>
  #     define GETPAGESIZE() B_PAGE_SIZE
!       extern int etext[];
! #     define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #   endif
  #   ifdef SUNOS5
  #	define OS_TYPE "SUNOS5"
!         extern int _etext[], _end[];
    	extern char * GC_SysVGetDataStart();
! #       define DATASTART GC_SysVGetDataStart(0x1000, _etext)
! #	define DATAEND (_end)
! /*	# define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7,  	*/
  /*      but reportedly breaks under 2.8.  It appears that the stack	*/
  /* 	base is a property of the executable, so this should not break	*/
  /* 	old executables.						*/
***************
*** 902,917 ****
  #   endif
  #   ifdef SCO
  #	define OS_TYPE "SCO"
! 	extern int etext;
! #   	define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
  				  & ~0x3fffff) \
! 				 +((word)&etext & 0xfff))
  #	define STACKBOTTOM ((ptr_t) 0x7ffffffc)
  #   endif
  #   ifdef SCO_ELF
  #       define OS_TYPE "SCO_ELF"
!         extern int etext;
! #       define DATASTART ((ptr_t)(&etext))
  #       define STACKBOTTOM ((ptr_t) 0x08048000)
  #       define DYNAMIC_LOADING
  #	define ELF_CLASS ELFCLASS32
--- 904,919 ----
  #   endif
  #   ifdef SCO
  #	define OS_TYPE "SCO"
! 	extern int etext[];
! #   	define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
  				  & ~0x3fffff) \
! 				 +((word)etext & 0xfff))
  #	define STACKBOTTOM ((ptr_t) 0x7ffffffc)
  #   endif
  #   ifdef SCO_ELF
  #       define OS_TYPE "SCO_ELF"
!         extern int etext[];
! #       define DATASTART ((ptr_t)(etext))
  #       define STACKBOTTOM ((ptr_t) 0x08048000)
  #       define DYNAMIC_LOADING
  #	define ELF_CLASS ELFCLASS32
***************
*** 942,949 ****
  #       ifdef __ELF__
  #            define DYNAMIC_LOADING
  #	     ifdef UNDEFINED	/* includes ro data */
! 	       extern int _etext;
! #              define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff))
  #	     endif
  #	     include <features.h>
  #	     if defined(__GLIBC__) && __GLIBC__ >= 2
--- 944,951 ----
  #       ifdef __ELF__
  #            define DYNAMIC_LOADING
  #	     ifdef UNDEFINED	/* includes ro data */
! 	       extern int _etext[];
! #              define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
  #	     endif
  #	     include <features.h>
  #	     if defined(__GLIBC__) && __GLIBC__ >= 2
***************
*** 960,970 ****
  			      /* contain large read-only data tables    */
  			      /* that we'd rather not scan.		*/
  #	     endif
! 	     extern int _end;
! #	     define DATAEND (&_end)
  #	else
! 	     extern int etext;
! #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #       endif
  #	ifdef USE_I686_PREFETCH
  #	  define PREFETCH(x) \
--- 962,972 ----
  			      /* contain large read-only data tables    */
  			      /* that we'd rather not scan.		*/
  #	     endif
! 	     extern int _end[];
! #	     define DATAEND (_end)
  #	else
! 	     extern int etext[];
! #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #       endif
  #	ifdef USE_I686_PREFETCH
  #	  define PREFETCH(x) \
***************
*** 989,998 ****
  #   endif
  #   ifdef CYGWIN32
  #       define OS_TYPE "CYGWIN32"
!           extern int _data_start__;
!           extern int _data_end__;
!           extern int _bss_start__;
!           extern int _bss_end__;
    	/* For binutils 2.9.1, we have			*/
    	/*	DATASTART   = _data_start__		*/
    	/*	DATAEND	    = _bss_end__		*/
--- 991,1000 ----
  #   endif
  #   ifdef CYGWIN32
  #       define OS_TYPE "CYGWIN32"
!           extern int _data_start__[];
!           extern int _data_end__[];
!           extern int _bss_start__[];
!           extern int _bss_end__[];
    	/* For binutils 2.9.1, we have			*/
    	/*	DATASTART   = _data_start__		*/
    	/*	DATAEND	    = _bss_end__		*/
***************
*** 1003,1010 ****
    	/* minumum/maximum of the two.			*/
  #   	define MAX(x,y) ((x) > (y) ? (x) : (y))
  #   	define MIN(x,y) ((x) < (y) ? (x) : (y))
! #       define DATASTART ((ptr_t) MIN(&_data_start__, &_bss_start__))
! #       define DATAEND	 ((ptr_t) MAX(&_data_end__, &_bss_end__))
  #	undef STACK_GRAN
  #       define STACK_GRAN 0x10000
  #       define HEURISTIC1
--- 1005,1012 ----
    	/* minumum/maximum of the two.			*/
  #   	define MAX(x,y) ((x) > (y) ? (x) : (y))
  #   	define MIN(x,y) ((x) < (y) ? (x) : (y))
! #       define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
! #       define DATAEND	 ((ptr_t) MAX(_data_end__, _bss_end__))
  #	undef STACK_GRAN
  #       define STACK_GRAN 0x10000
  #       define HEURISTIC1
***************
*** 1033,1042 ****
  #   ifdef DJGPP
  #       define OS_TYPE "DJGPP"
  #       include "stubinfo.h"
!         extern int etext;
          extern int _stklen;
          extern int __djgpp_stack_limit;
! #       define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff))
  /* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
                                                       + _stklen)) */
  #       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
--- 1035,1044 ----
  #   ifdef DJGPP
  #       define OS_TYPE "DJGPP"
  #       include "stubinfo.h"
!         extern int etext[];
          extern int _stklen;
          extern int __djgpp_stack_limit;
! #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ff) & ~0x1ff))
  /* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
                                                       + _stklen)) */
  #       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
***************
*** 1056,1063 ****
  #	ifdef __ELF__
  #	    define DYNAMIC_LOADING
  #	endif
! 	extern char etext;
! #	define DATASTART ((ptr_t)(&etext))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
--- 1058,1065 ----
  #	ifdef __ELF__
  #	    define DYNAMIC_LOADING
  #	endif
! 	extern char etext[];
! #	define DATASTART ((ptr_t)(etext))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
***************
*** 1071,1078 ****
  #   if defined(OPENBSD) || defined(NETBSD) \
          || defined(THREE86BSD) || defined(BSDI)
  #	define HEURISTIC2
! 	extern char etext;
! #	define DATASTART ((ptr_t)(&etext))
  #   endif
  #   ifdef NEXT
  #	define OS_TYPE "NEXT"
--- 1073,1080 ----
  #   if defined(OPENBSD) || defined(NETBSD) \
          || defined(THREE86BSD) || defined(BSDI)
  #	define HEURISTIC2
! 	extern char etext[];
! #	define DATASTART ((ptr_t)(etext))
  #   endif
  #   ifdef NEXT
  #	define OS_TYPE "NEXT"
***************
*** 1099,1108 ****
  #     define OS_TYPE "HURD"
  #     define STACK_GROWS_DOWN
  #     define HEURISTIC2
!       extern int  __data_start;
! #     define DATASTART ( (ptr_t) (&__data_start))
!       extern int   _end;
! #     define DATAEND ( (ptr_t) (&_end))
  /* #     define MPROTECT_VDB  Not quite working yet? */
  #     define DYNAMIC_LOADING
  #   endif
--- 1101,1110 ----
  #     define OS_TYPE "HURD"
  #     define STACK_GROWS_DOWN
  #     define HEURISTIC2
!       extern int  __data_start[];
! #     define DATASTART ( (ptr_t) (__data_start))
!       extern int   _end[];
! #     define DATAEND ( (ptr_t) (_end))
  /* #     define MPROTECT_VDB  Not quite working yet? */
  #     define DYNAMIC_LOADING
  #   endif
***************
*** 1126,1133 ****
        /* This was developed for a linuxce style platform.  Probably	*/
        /* needs to be tweaked for workstation class machines.		*/
  #     define OS_TYPE "LINUX"
!       extern int __data_start;
! #     define DATASTART ((ptr_t)(&__data_start))
  #     define ALIGNMENT 4
  #     define USE_GENERIC_PUSH_REGS
  #     define STACKBOTTOM ((ptr_t)0x7fff8000)
--- 1128,1135 ----
        /* This was developed for a linuxce style platform.  Probably	*/
        /* needs to be tweaked for workstation class machines.		*/
  #     define OS_TYPE "LINUX"
!       extern int __data_start[];
! #     define DATASTART ((ptr_t)(__data_start))
  #     define ALIGNMENT 4
  #     define USE_GENERIC_PUSH_REGS
  #     define STACKBOTTOM ((ptr_t)0x7fff8000)
***************
*** 1145,1159 ****
  #        define CPP_WORDSZ _MIPS_SZPTR
  #        define ALIGNMENT (_MIPS_SZPTR/8)
  #      else
!          extern int etext, edata, end;
!          extern int _DYNAMIC_LINKING, _gp;
! #        define DATASTART ((ptr_t)((((word)&etext + 0x3ffff) & ~0x3ffff) \
!                + ((word)&etext & 0xffff)))
! #        define DATAEND (&edata)
! #        define DATASTART2 (&_DYNAMIC_LINKING \
!                ? (ptr_t)(((word)&_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
!                : (ptr_t)&edata)
! #        define DATAEND2 (&end)
  #        define ALIGNMENT 4
  #      endif
  #      define OS_TYPE "EWS4800"
--- 1147,1161 ----
  #        define CPP_WORDSZ _MIPS_SZPTR
  #        define ALIGNMENT (_MIPS_SZPTR/8)
  #      else
!          extern int etext[], edata[], end[];
!          extern int _DYNAMIC_LINKING[], _gp[];
! #        define DATASTART ((ptr_t)((((word)etext + 0x3ffff) & ~0x3ffff) \
!                + ((word)etext & 0xffff)))
! #        define DATAEND (edata)
! #        define DATASTART2 (_DYNAMIC_LINKING \
!                ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
!                : (ptr_t)edata)
! #        define DATAEND2 (end)
  #        define ALIGNMENT 4
  #      endif
  #      define OS_TYPE "EWS4800"
***************
*** 1175,1182 ****
  #   endif
  #   ifdef IRIX5
  #	define HEURISTIC2
!         extern int _fdata;
! #       define DATASTART ((ptr_t)(&_fdata))
  #       ifdef USE_MMAP
  #         define HEAP_START (ptr_t)0x30000000
  #       else
--- 1177,1184 ----
  #   endif
  #   ifdef IRIX5
  #	define HEURISTIC2
!         extern int _fdata[];
! #       define DATASTART ((ptr_t)(_fdata))
  #       ifdef USE_MMAP
  #         define HEAP_START (ptr_t)0x30000000
  #       else
***************
*** 1214,1220 ****
  #     define HEURISTIC2
  #     define USE_GENERIC_PUSH_REGS
  #     ifdef __ELF__
!         extern int etext;
  #       define DATASTART GC_data_start
  #       define NEED_FIND_LIMIT
  #       define DYNAMIC_LOADING
--- 1216,1222 ----
  #     define HEURISTIC2
  #     define USE_GENERIC_PUSH_REGS
  #     ifdef __ELF__
!         extern int etext[];
  #       define DATASTART GC_data_start
  #       define NEED_FIND_LIMIT
  #       define DYNAMIC_LOADING
***************
*** 1234,1242 ****
  #     define ALIGNMENT 4
  #     define CPP_WORDSZ 32
  #   endif
!     extern int _data, _end;
! #   define DATASTART ((ptr_t)((ulong)&_data))
! #   define DATAEND ((ptr_t)((ulong)&_end))
      extern int errno;
  #   define STACKBOTTOM ((ptr_t)((ulong)&errno))
  #   define USE_GENERIC_PUSH_REGS
--- 1236,1244 ----
  #     define ALIGNMENT 4
  #     define CPP_WORDSZ 32
  #   endif
!     extern int _data[], _end[];
! #   define DATASTART ((ptr_t)((ulong)_data))
! #   define DATAEND ((ptr_t)((ulong)_end))
      extern int errno;
  #   define STACKBOTTOM ((ptr_t)((ulong)&errno))
  #   define USE_GENERIC_PUSH_REGS
***************
*** 1270,1277 ****
  #   define STACK_GROWS_UP
  #   ifdef HPUX
  #     define OS_TYPE "HPUX"
!       extern int __data_start;
! #     define DATASTART ((ptr_t)(&__data_start))
  #     if 0
  	/* The following appears to work for 7xx systems running HP/UX	*/
  	/* 9.xx Furthermore, it might result in much faster		*/
--- 1272,1279 ----
  #   define STACK_GROWS_UP
  #   ifdef HPUX
  #     define OS_TYPE "HPUX"
!       extern int __data_start[];
! #     define DATASTART ((ptr_t)(__data_start))
  #     if 0
  	/* The following appears to work for 7xx systems running HP/UX	*/
  	/* 9.xx Furthermore, it might result in much faster		*/
***************
*** 1303,1310 ****
  #     define LINUX_STACKBOTTOM
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end;
! #     define DATAEND (&_end)
  #   endif /* LINUX */
  # endif /* HP_PA */
  
--- 1305,1312 ----
  #     define LINUX_STACKBOTTOM
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end[];
! #     define DATAEND (_end)
  #   endif /* LINUX */
  # endif /* HP_PA */
  
***************
*** 1344,1364 ****
  #	    define DYNAMIC_LOADING
  #	endif
  /* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
! 	extern char etext;
! 	extern char edata;
! 	extern char end;
  #	define NEED_FIND_LIMIT
! #	define DATASTART ((ptr_t)(&etext))
  #	define DATAEND (GC_find_limit (DATASTART, TRUE))
! #	define DATASTART2 ((ptr_t)(&edata))
! #	define DATAEND2 ((ptr_t)(&end))
  #	define CPP_WORDSZ 64
  #   endif
  #   ifdef OSF1
  #	define OS_TYPE "OSF1"
  #   	define DATASTART ((ptr_t) 0x140000000)
! 	extern int _end;
! #   	define DATAEND ((ptr_t) &_end)
   	extern char ** environ;
  	/* round up from the value of environ to the nearest page boundary */
  	/* Probably breaks if putenv is called before collector 	   */
--- 1346,1366 ----
  #	    define DYNAMIC_LOADING
  #	endif
  /* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
! 	extern char etext[];
! 	extern char edata[];
! 	extern char end[];
  #	define NEED_FIND_LIMIT
! #	define DATASTART ((ptr_t)(etext))
  #	define DATAEND (GC_find_limit (DATASTART, TRUE))
! #	define DATASTART2 ((ptr_t)(edata))
! #	define DATAEND2 ((ptr_t)(end))
  #	define CPP_WORDSZ 64
  #   endif
  #   ifdef OSF1
  #	define OS_TYPE "OSF1"
  #   	define DATASTART ((ptr_t) 0x140000000)
! 	extern int _end[];
! #   	define DATAEND ((ptr_t) _end)
   	extern char ** environ;
  	/* round up from the value of environ to the nearest page boundary */
  	/* Probably breaks if putenv is called before collector 	   */
***************
*** 1369,1376 ****
  	/* the text segment immediately follows the stack.		*/
  	/* Hence we give an upper pound.				*/
  	/* This is currently unused, since we disabled HEURISTIC2	*/
!     	extern int __start;
! #   	define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1)))
  #   	define CPP_WORDSZ 64
  #   	define MPROTECT_VDB
  #   	define DYNAMIC_LOADING
--- 1371,1378 ----
  	/* the text segment immediately follows the stack.		*/
  	/* Hence we give an upper pound.				*/
  	/* This is currently unused, since we disabled HEURISTIC2	*/
!     	extern int __start[];
! #   	define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1)))
  #   	define CPP_WORDSZ 64
  #   	define MPROTECT_VDB
  #   	define DYNAMIC_LOADING
***************
*** 1386,1393 ****
  #       else
  #           define DATASTART ((ptr_t) 0x140000000)
  #       endif
! 	extern int _end;
! #	define DATAEND (&_end)
  #	define MPROTECT_VDB
  		/* Has only been superficially tested.  May not	*/
  		/* work on all versions.			*/
--- 1388,1395 ----
  #       else
  #           define DATASTART ((ptr_t) 0x140000000)
  #       endif
! 	extern int _end[];
! #	define DATAEND (_end)
  #	define MPROTECT_VDB
  		/* Has only been superficially tested.  May not	*/
  		/* work on all versions.			*/
***************
*** 1420,1427 ****
  #         define ALIGNMENT 8
  #       endif
  #       define OS_TYPE "HPUX"	
!         extern int __data_start;
! #       define DATASTART ((ptr_t)(&__data_start))
          /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2	*/
          /* to this.  Note that the GC must be initialized before the	*/
      	/* first putenv call.						*/
--- 1422,1429 ----
  #         define ALIGNMENT 8
  #       endif
  #       define OS_TYPE "HPUX"	
!         extern int __data_start[];
! #       define DATASTART ((ptr_t)(__data_start))
          /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2	*/
          /* to this.  Note that the GC must be initialized before the	*/
      	/* first putenv call.						*/
***************
*** 1469,1476 ****
  #  	endif
  #	define MPROTECT_VDB
  		/* Requires Linux 2.3.47 or later.	*/
! 	extern int _end;
! #	define DATAEND (&_end)
  #       ifdef __GNUC__
  #	  define PREFETCH(x) \
  	    __asm__ ("	lfetch	[%0]": : "r"((void *)(x)))
--- 1471,1478 ----
  #  	endif
  #	define MPROTECT_VDB
  		/* Requires Linux 2.3.47 or later.	*/
! 	extern int _end[];
! #	define DATAEND (_end)
  #       ifdef __GNUC__
  #	  define PREFETCH(x) \
  	    __asm__ ("	lfetch	[%0]": : "r"((void *)(x)))
***************
*** 1486,1500 ****
  #   define MACH_TYPE "M88K"
  #   define ALIGNMENT 4
  #   define ALIGN_DOUBLE
!     extern int etext;
  #   ifdef CX_UX
  #	define OS_TYPE "CX_UX"
! #       define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000)
  #   endif
  #   ifdef  DGUX
  #	define OS_TYPE "DGUX"
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
  #   endif
  #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
  # endif
--- 1488,1502 ----
  #   define MACH_TYPE "M88K"
  #   define ALIGNMENT 4
  #   define ALIGN_DOUBLE
!     extern int etext[];
  #   ifdef CX_UX
  #	define OS_TYPE "CX_UX"
! #       define DATASTART ((((word)etext + 0x3fffff) & ~0x3fffff) + 0x10000)
  #   endif
  #   ifdef  DGUX
  #	define OS_TYPE "DGUX"
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, etext)
  #   endif
  #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
  # endif
***************
*** 1505,1531 ****
  #   define USE_GENERIC_PUSH_REGS
  #   ifdef UTS4
  #       define OS_TYPE "UTS4"
!         extern int etext;
! 	extern int _etext;
! 	extern int _end;
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
! #	define DATAEND (&_end)
  #	define HEURISTIC2
  #   endif
  #   ifdef LINUX
  #       define OS_TYPE "LINUX"
  #       define HEURISTIC1
  #       define DYNAMIC_LOADING
!         extern int __data_start;
! #       define DATASTART ((ptr_t)(&__data_start))
  #   endif
  # endif
  
  # if defined(PJ)
  #   define ALIGNMENT 4
!     extern int _etext;
! #   define DATASTART ((ptr_t)(&_etext))
  #   define HEURISTIC1
  # endif
  
--- 1507,1533 ----
  #   define USE_GENERIC_PUSH_REGS
  #   ifdef UTS4
  #       define OS_TYPE "UTS4"
!         extern int etext[];
! 	extern int _etext[];
! 	extern int _end[];
  	extern char * GC_SysVGetDataStart();
! #       define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext)
! #	define DATAEND (_end)
  #	define HEURISTIC2
  #   endif
  #   ifdef LINUX
  #       define OS_TYPE "LINUX"
  #       define HEURISTIC1
  #       define DYNAMIC_LOADING
!         extern int __data_start[];
! #       define DATASTART ((ptr_t)(__data_start))
  #   endif
  # endif
  
  # if defined(PJ)
  #   define ALIGNMENT 4
!     extern int _etext[];
! #   define DATASTART ((ptr_t)(_etext))
  #   define HEURISTIC1
  # endif
  
***************
*** 1536,1543 ****
  #   ifdef NETBSD
  #       define OS_TYPE "NETBSD"
  #       define HEURISTIC2
!         extern char etext;
! #       define DATASTART ((ptr_t)(&etext))
  #       define USE_GENERIC_PUSH_REGS
  #   endif
  #   ifdef LINUX
--- 1538,1545 ----
  #   ifdef NETBSD
  #       define OS_TYPE "NETBSD"
  #       define HEURISTIC2
!         extern char etext[];
! #       define DATASTART ((ptr_t)(etext))
  #       define USE_GENERIC_PUSH_REGS
  #   endif
  #   ifdef LINUX
***************
*** 1563,1573 ****
  			      /* contain large read-only data tables    */
  			      /* that we'd rather not scan.		*/
  #	     endif
! 	     extern int _end;
! #	     define DATAEND (&_end)
  #	else
! 	     extern int etext;
! #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
  #       endif
  #   endif
  #   ifdef MSWINCE
--- 1565,1575 ----
  			      /* contain large read-only data tables    */
  			      /* that we'd rather not scan.		*/
  #	     endif
! 	     extern int _end[];
! #	     define DATAEND (_end)
  #	else
! 	     extern int etext[];
! #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
  #       endif
  #   endif
  #   ifdef MSWINCE
***************
*** 1576,1583 ****
  #   endif
  #   ifdef NOSYS
        /* __data_start is usually defined in the target linker script.  */
!       extern int __data_start;
! #     define DATASTART (ptr_t)(&__data_start)
  #     define USE_GENERIC_PUSH_REGS
        /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S  */
        extern void *__stack_base__;
--- 1578,1585 ----
  #   endif
  #   ifdef NOSYS
        /* __data_start is usually defined in the target linker script.  */
!       extern int __data_start[];
! #     define DATASTART (ptr_t)(__data_start)
  #     define USE_GENERIC_PUSH_REGS
        /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S  */
        extern void *__stack_base__;
***************
*** 1598,1605 ****
  #     define USE_GENERIC_PUSH_REGS
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end;
! #     define DATAEND (&_end)
  #   endif
  # endif
   
--- 1600,1607 ----
  #     define USE_GENERIC_PUSH_REGS
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end[];
! #     define DATAEND (_end)
  #   endif
  # endif
   
***************
*** 1617,1626 ****
      /* case we lose.  Nonetheless, we try both, prefering __data_start.	*/
      /* We assume gcc.	*/
  #   pragma weak __data_start
!     extern int __data_start;
  #   pragma weak data_start
!     extern int data_start;
! #   define DATASTART ((ptr_t)(&__data_start != 0? &__data_start : &data_start))
  #endif
  
  #if defined(LINUX) && defined(REDIRECT_MALLOC)
--- 1619,1628 ----
      /* case we lose.  Nonetheless, we try both, prefering __data_start.	*/
      /* We assume gcc.	*/
  #   pragma weak __data_start
!     extern int __data_start[];
  #   pragma weak data_start
!     extern int data_start[];
! #   define DATASTART ((ptr_t)(__data_start != 0? __data_start : data_start))
  #endif
  
  #if defined(LINUX) && defined(REDIRECT_MALLOC)
***************
*** 1644,1651 ****
  # endif
  
  # ifndef DATAEND
!     extern int end;
! #   define DATAEND (&end)
  # endif
  
  # if defined(SVR4) && !defined(GETPAGESIZE)
--- 1646,1653 ----
  # endif
  
  # ifndef DATAEND
!     extern int end[];
! #   define DATAEND (end)
  # endif
  
  # if defined(SVR4) && !defined(GETPAGESIZE)



More information about the Java-patches mailing list