This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: boehm-gc, pull linker symbol reference patches to 3.1 branch


In 3.1 branch source tree, I did this:

cvs update -j1.12 -j1.13  include/private/gcconfig.h
(handle merge conflict due to out-of-order patch transfer)
cvs update -j1.15 -j1.17  include/private/gcconfig.h
(note that file exactly matches mainline version)

cvs update -j1.23 -j1.24 os_dep.c 
(note that file exactly matches mainline version)

Approved/requested by Hans; commented upon by RTH.  Rebuilt and
checked boehm-gc in 3.1 tree on i386-unknown-freebsd4.5.

In FSF format, for the record:

2002-04-09  Loren J. Rittle  <ljrittle@acm.org>
	    Richard Henderson  <rth@redhat.com>

	* include/private/gcconfig.h (DATAEND): Update comment example
	to match reality.  Clarify comment.
	Change all likely references to linker script synthesized
	symbols to use this idiom: extern int etext[]; etext
	* os_dep.c (GC_init_linux_data_start): Fix references to
	__data_start and _end.

Index: include/private/gcconfig.h
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/include/private/gcconfig.h,v
retrieving revision 1.11.2.3
diff -c -r1.11.2.3 gcconfig.h
*** include/private/gcconfig.h	4 Apr 2002 20:49:53 -0000	1.11.2.3
--- include/private/gcconfig.h	10 Apr 2002 01:08:45 -0000
***************
*** 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,461 ----
   * 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;'' .
!  * Otherwise, ``GCC will assume these are in .sdata/.sbss'' and it will, e.g.,
!  * cause failures on alpha*-*-* with ``-msmall-data or -fpic'' or mips-*-*
!  * without any special options.
   *
   * 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"
--- 551,564 ----
  #   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>
--- 581,604 ----
                               /* 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
  	   */
--- 606,618 ----
  #   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. 	*/
--- 672,679 ----
  #     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
--- 690,705 ----
  #     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
--- 710,717 ----
  # 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	*/
--- 743,753 ----
  #   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	*/
--- 785,793 ----
  #	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
--- 803,810 ----
  #   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"
--- 816,838 ----
  #     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
--- 841,848 ----
  #	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.						*/
--- 862,885 ----
  #   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
--- 907,922 ----
  #   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
--- 947,954 ----
  #       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) \
--- 965,975 ----
  			      /* 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__		*/
--- 994,1003 ----
  #   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
--- 1008,1015 ----
    	/* 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))
--- 1038,1047 ----
  #   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))
***************
*** 1057,1071 ****
  #	    define DYNAMIC_LOADING
  #	endif
  /* Handle unmapped hole i386*-*-freebsd[45]* may put between etext and edata. */
! 	extern char etext;
! 	extern char edata;
! 	extern char end;
  #	define NEED_FIND_LIMIT
! #	define DATASTART ((ptr_t)(&etext))
  #   	define MIN(x,y) ((x) < (y) ? (x) : (y))
  #	define DATAEND (MIN (GC_find_limit (DATASTART, TRUE), DATASTART2))
! #	define DATASTART2 ((ptr_t)(&edata))
! #	define DATAEND2 ((ptr_t)(&end))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
--- 1062,1076 ----
  #	    define DYNAMIC_LOADING
  #	endif
  /* Handle unmapped hole i386*-*-freebsd[45]* may put between etext and edata. */
! 	extern char etext[];
! 	extern char edata[];
! 	extern char end[];
  #	define NEED_FIND_LIMIT
! #	define DATASTART ((ptr_t)(etext))
  #   	define MIN(x,y) ((x) < (y) ? (x) : (y))
  #	define DATAEND (MIN (GC_find_limit (DATASTART, TRUE), DATASTART2))
! #	define DATASTART2 ((ptr_t)(edata))
! #	define DATAEND2 ((ptr_t)(end))
  #   endif
  #   ifdef NETBSD
  #	define OS_TYPE "NETBSD"
***************
*** 1082,1089 ****
  #   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"
--- 1087,1094 ----
  #   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"
***************
*** 1110,1119 ****
  #     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
--- 1115,1124 ----
  #     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
***************
*** 1137,1144 ****
        /* 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)
--- 1142,1149 ----
        /* 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)
***************
*** 1156,1170 ****
  #        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"
--- 1161,1175 ----
  #        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"
***************
*** 1186,1193 ****
  #   endif
  #   ifdef IRIX5
  #	define HEURISTIC2
!         extern int _fdata;
! #       define DATASTART ((ptr_t)(&_fdata))
  #       ifdef USE_MMAP
  #         define HEAP_START (ptr_t)0x30000000
  #       else
--- 1191,1198 ----
  #   endif
  #   ifdef IRIX5
  #	define HEURISTIC2
!         extern int _fdata[];
! #       define DATASTART ((ptr_t)(_fdata))
  #       ifdef USE_MMAP
  #         define HEAP_START (ptr_t)0x30000000
  #       else
***************
*** 1225,1231 ****
  #     define HEURISTIC2
  #     define USE_GENERIC_PUSH_REGS
  #     ifdef __ELF__
!         extern int etext;
  #       define DATASTART GC_data_start
  #       define NEED_FIND_LIMIT
  #       define DYNAMIC_LOADING
--- 1230,1236 ----
  #     define HEURISTIC2
  #     define USE_GENERIC_PUSH_REGS
  #     ifdef __ELF__
!         extern int etext[];
  #       define DATASTART GC_data_start
  #       define NEED_FIND_LIMIT
  #       define DYNAMIC_LOADING
***************
*** 1245,1253 ****
  #     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
--- 1250,1258 ----
  #     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
***************
*** 1281,1288 ****
  #   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		*/
--- 1286,1293 ----
  #   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		*/
***************
*** 1314,1321 ****
  #     define LINUX_STACKBOTTOM
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end;
! #     define DATAEND (&_end)
  #   endif /* LINUX */
  # endif /* HP_PA */
  
--- 1319,1326 ----
  #     define LINUX_STACKBOTTOM
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end[];
! #     define DATAEND (_end)
  #   endif /* LINUX */
  # endif /* HP_PA */
  
***************
*** 1355,1375 ****
  #	    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 	   */
--- 1360,1380 ----
  #	    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 	   */
***************
*** 1380,1387 ****
  	/* 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
--- 1385,1392 ----
  	/* 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
***************
*** 1397,1404 ****
  #       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.			*/
--- 1402,1409 ----
  #       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.			*/
***************
*** 1431,1438 ****
  #         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.						*/
--- 1436,1443 ----
  #         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.						*/
***************
*** 1480,1487 ****
  #  	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)))
--- 1485,1492 ----
  #  	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)))
***************
*** 1497,1511 ****
  #   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
--- 1502,1516 ----
  #   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
***************
*** 1516,1542 ****
  #   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
  
--- 1521,1547 ----
  #   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
  
***************
*** 1547,1554 ****
  #   ifdef NETBSD
  #       define OS_TYPE "NETBSD"
  #       define HEURISTIC2
!         extern char etext;
! #       define DATASTART ((ptr_t)(&etext))
  #       define USE_GENERIC_PUSH_REGS
  #   endif
  #   ifdef LINUX
--- 1552,1559 ----
  #   ifdef NETBSD
  #       define OS_TYPE "NETBSD"
  #       define HEURISTIC2
!         extern char etext[];
! #       define DATASTART ((ptr_t)(etext))
  #       define USE_GENERIC_PUSH_REGS
  #   endif
  #   ifdef LINUX
***************
*** 1574,1584 ****
  			      /* 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
--- 1579,1589 ----
  			      /* 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
***************
*** 1587,1594 ****
  #   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__;
--- 1592,1599 ----
  #   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__;
***************
*** 1609,1616 ****
  #     define USE_GENERIC_PUSH_REGS
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end;
! #     define DATAEND (&_end)
  #   endif
  # endif
   
--- 1614,1621 ----
  #     define USE_GENERIC_PUSH_REGS
  #     define DYNAMIC_LOADING
  #     define LINUX_DATA_START
!       extern int _end[];
! #     define DATAEND (_end)
  #   endif
  # endif
   
***************
*** 1628,1637 ****
      /* 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)
--- 1633,1642 ----
      /* 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)
***************
*** 1655,1662 ****
  # endif
  
  # ifndef DATAEND
!     extern int end;
! #   define DATAEND (&end)
  # endif
  
  # if defined(SVR4) && !defined(GETPAGESIZE)
--- 1660,1667 ----
  # endif
  
  # ifndef DATAEND
!     extern int end[];
! #   define DATAEND (end)
  # endif
  
  # if defined(SVR4) && !defined(GETPAGESIZE)
Index: os_dep.c
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/os_dep.c,v
retrieving revision 1.21.2.2
diff -c -r1.21.2.2 os_dep.c
*** os_dep.c	1 Apr 2002 23:06:42 -0000	1.21.2.2
--- os_dep.c	10 Apr 2002 01:08:45 -0000
***************
*** 155,165 ****
  
  # ifdef LINUX
  #   pragma weak __data_start
!     extern int __data_start;
  #   pragma weak data_start
!     extern int data_start;
  # endif /* LINUX */
!   extern int _end;
  
    ptr_t GC_data_start;
  
--- 155,165 ----
  
  # ifdef LINUX
  #   pragma weak __data_start
!     extern int __data_start[];
  #   pragma weak data_start
!     extern int data_start[];
  # endif /* LINUX */
!   extern int _end[];
  
    ptr_t GC_data_start;
  
***************
*** 169,184 ****
  
  #   ifdef LINUX
        /* Try the easy approaches first:	*/
!       if (&__data_start != 0) {
! 	  GC_data_start = (ptr_t)(&__data_start);
  	  return;
        }
!       if (&data_start != 0) {
! 	  GC_data_start = (ptr_t)(&data_start);
  	  return;
        }
  #   endif /* LINUX */
!     GC_data_start = GC_find_limit((ptr_t)(&_end), FALSE);
    }
  #endif
  
--- 169,184 ----
  
  #   ifdef LINUX
        /* Try the easy approaches first:	*/
!       if (__data_start != 0) {
! 	  GC_data_start = (ptr_t)__data_start;
  	  return;
        }
!       if (data_start != 0) {
! 	  GC_data_start = (ptr_t)data_start;
  	  return;
        }
  #   endif /* LINUX */
!     GC_data_start = GC_find_limit((ptr_t)_end, FALSE);
    }
  #endif
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]