OSDN Git Service

This commit was generated by cvs2svn to compensate for changes in r33244,
[pf3gnuchains/gcc-fork.git] / boehm-gc / include / private / gcconfig.h
index c9017d3..4c4bca3 100644 (file)
@@ -13,9 +13,9 @@
  * modified is included with the above copyright notice.
  */
  
-#ifndef CONFIG_H
+#ifndef GCCONFIG_H
 
-# define CONFIG_H
+# define GCCONFIG_H
 
 /* Machine dependent parameters.  Some tuning parameters can be found  */
 /* near the top of gc_private.h.                                       */
 #    define NETBSD
 #    define mach_type_known
 # endif
+# if defined(__NetBSD__) && defined(arm32)
+#    define ARM32
+#    define NETBSD
+#    define mach_type_known
+# endif
 # if defined(vax)
 #    define VAX
 #    ifdef ultrix
 # endif
 # if defined(mips) || defined(__mips)
 #    define MIPS
-#    if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
-#      define ULTRIX
-#    else
-#      if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) || defined(__SYSTYPE_SVR4__)
-#        define IRIX5   /* or IRIX 6.X */
-#      else
-#        define RISCOS  /* or IRIX 4.X */
-#      endif
-#    endif
+#    if !defined(LINUX)
+#      if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
+#       define ULTRIX
+#      else
+#       if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) \
+           || defined(__SYSTYPE_SVR4__)
+#         define IRIX5   /* or IRIX 6.X */
+#       else
+#         define RISCOS  /* or IRIX 4.X */
+#       endif
+#      endif
+#    endif /* !LINUX */
 #    define mach_type_known
 # endif
 # if defined(sequent) && defined(i386)
 #   define SYSV
 #   define mach_type_known
 # endif
-# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) \
+# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
      || defined(hppa) || defined(__hppa__)
 #   define HP_PA
+#   ifndef LINUX
+#     define HPUX
+#   endif
 #   define mach_type_known
 # endif
 # if defined(LINUX) && (defined(i386) || defined(__i386__))
 #    define I386
 #    define mach_type_known
 # endif
+# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
+#    define IA64
+#    define mach_type_known
+# endif
 # if defined(LINUX) && defined(powerpc)
 #    define POWERPC
 #    define mach_type_known
 #    define M68K
 #    define mach_type_known
 # endif
-# if defined(LINUX) && defined(sparc)
+# if defined(LINUX) && (defined(sparc) || defined(__sparc__))
 #    define SPARC
 #    define mach_type_known
 # endif
+# if defined(LINUX) && defined(arm)
+#    define ARM32
+#    define mach_type_known
+# endif
 # if defined(__alpha) || defined(__alpha__)
 #   define ALPHA
 #   if !defined(LINUX)
 #   define CYGWIN32
 #   define mach_type_known
 # endif
+# if defined(__MINGW32__)
+#   define I386
+#   define MSWIN32
+#   define mach_type_known
+# endif
 # if defined(__BORLANDC__)
 #   define I386
 #   define MSWIN32
 #   define UTS4
 #   define mach_type_known
 # endif
+# if defined(__pj__)
+#   define PJ
+#   define mach_type_known
+# endif
 /* Ivan Demakov */
 # if defined(__WATCOMC__) && defined(__386__)
 #   define I386
                    /*                  (CX_UX and DGUX)                */
                    /*             S370       ==> 370-like machine      */
                    /*                  running Amdahl UTS4             */
+                   /*             ARM32      ==> Intel StrongARM       */
+                   /*             IA64       ==> Intel IA64            */
+                   /*                            (e.g. Itanium)        */
 
 
 /*
  *
  * An architecture may define DYNAMIC_LOADING if dynamic_load.c
  * defined GC_register_dynamic_libraries() for the architecture.
+ *
+ * An architecture may define PREFETCH(x) to preload the cache with *x.
+ * This defaults to a no-op.
+ *
+ * PREFETCH_FOR_WRITE(x) is used if *x is about to be written.
+ *
+ * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to
+ * clear the two words at GC_malloc-aligned address x.  By default,
+ * word stores of 0 are used instead.
  */
 
 
 #     undef STACK_GRAN
 #     define STACK_GRAN 0x10000000
        /* Stack usually starts at 0x80000000 */
-#     define DATASTART GC_data_start
+#     define LINUX_DATA_START
       extern int _end;
 #     define DATAEND (&_end)
 #   endif
 #   ifdef LINUX
 #     define OS_TYPE "LINUX"
 #     ifdef __ELF__
-#         define DATASTART GC_data_start
-#         define DYNAMIC_LOADING
+#       define LINUX_DATA_START
+#       define DYNAMIC_LOADING
 #     else
           Linux Sparc non elf ?
 #     endif
 #   endif
 #   ifdef LINUX
 #      define OS_TYPE "LINUX"
-#       define HEURISTIC1
-#       undef STACK_GRAN
-#       define STACK_GRAN 0x10000000
-       /* STACKBOTTOM is usually 0xc0000000, but this changes with     */
-       /* different kernel configurations.  In particular, systems     */
-       /* with 2GB physical memory will usually move the user          */
-       /* address space limit, and hence initial SP to 0x80000000.     */
+#       define LINUX_STACKBOTTOM
+#      if 0
+#        define HEURISTIC1
+#         undef STACK_GRAN
+#         define STACK_GRAN 0x10000000
+         /* STACKBOTTOM is usually 0xc0000000, but this changes with   */
+         /* different kernel configurations.  In particular, systems   */
+         /* with 2GB physical memory will usually move the user        */
+         /* address space limit, and hence initial SP to 0x80000000.   */
+#       endif
 #       if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC)
 #          define MPROTECT_VDB
 #      else
 #           endif
 #           include <features.h>
 #           if defined(__GLIBC__) && __GLIBC__ >= 2
-                extern int __data_start;
-#               define DATASTART ((ptr_t)(&__data_start))
+#               define LINUX_DATA_START
 #           else
                 extern char **__environ;
 #                define DATASTART ((ptr_t)(&__environ))
             extern int etext;
 #            define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
 #       endif
+#      ifdef USE_I686_PREFETCH
+#        define PREFETCH(x) \
+           __asm__ __volatile__ ("     prefetchnta     %0": : "m"(*(char *)(x)))
+           /* Empirically prefetcht0 is much more effective at reducing        */
+           /* cache miss stalls for the targetted load instructions.  But it   */
+           /* seems to interfere enough with other cache traffic that the net  */
+           /* result is worse than prefetchnta.                                */
+#         if 0 
+           /* Using prefetches for write seems to have a slight negative       */
+           /* impact on performance, at least for a PIII/500.                  */
+#          define PREFETCH_FOR_WRITE(x) \
+             __asm__ __volatile__ ("   prefetcht0      %0": : "m"(*(char *)(x)))
+#        endif
+#      endif
+#      ifdef USE_3DNOW_PREFETCH
+#        define PREFETCH(x) \
+           __asm__ __volatile__ ("     prefetch        %0": : "m"(*(char *)(x)))
+#        define PREFETCH_FOR_WRITE(x) 
+           __asm__ __volatile__ ("     prefetchw       %0": : "m"(*(char *)(x)))
+#      endif
 #   endif
 #   ifdef CYGWIN32
 #       define OS_TYPE "CYGWIN32"
 
 # ifdef MIPS
 #   define MACH_TYPE "MIPS"
-#   ifndef IRIX5
-#     define DATASTART (ptr_t)0x10000000
-                             /* Could probably be slightly higher since */
-                             /* startup code allocates lots of stuff.   */
-#   else
-      extern int _fdata;
-#     define DATASTART ((ptr_t)(&_fdata))
-#     ifdef USE_MMAP
-#         define HEAP_START (ptr_t)0x30000000
-#     else
-#        define HEAP_START DATASTART
-#     endif
-                             /* Lowest plausible heap address.         */
-                             /* In the MMAP case, we map there.        */
-                             /* In either case it is used to identify  */
-                             /* heap sections so they're not           */
-                             /* considered as roots.                   */
-#   endif /* IRIX5 */
-#   define HEURISTIC2
 /* #   define STACKBOTTOM ((ptr_t)0x7fff8000)  sometimes also works.  */
+#   ifdef LINUX
+      /* 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 1
+#     define STACKBOTTOM 0x80000000
+       /* In many cases, this should probably use LINUX_STACKBOTTOM    */
+       /* instead. But some kernel versions seem to give the wrong     */
+       /* value from /proc.                                            */
+#   endif /* Linux */
 #   ifdef ULTRIX
+#      define HEURISTIC2
+#       define DATASTART (ptr_t)0x10000000
+                             /* Could probably be slightly higher since */
+                             /* startup code allocates lots of stuff.   */
 #      define OS_TYPE "ULTRIX"
 #       define ALIGNMENT 4
 #   endif
 #   ifdef RISCOS
+#      define HEURISTIC2
+#       define DATASTART (ptr_t)0x10000000
 #      define OS_TYPE "RISCOS"
 #      define ALIGNMENT 4  /* Required by hardware */
 #   endif
 #   ifdef IRIX5
+#      define HEURISTIC2
+        extern int _fdata;
+#       define DATASTART ((ptr_t)(&_fdata))
+#       ifdef USE_MMAP
+#         define HEAP_START (ptr_t)0x30000000
+#       else
+#        define HEAP_START DATASTART
+#       endif
+                             /* Lowest plausible heap address.         */
+                             /* In the MMAP case, we map there.        */
+                             /* In either case it is used to identify  */
+                             /* heap sections so they're not           */
+                             /* considered as roots.                   */
 #      define OS_TYPE "IRIX5"
 #       define MPROTECT_VDB
 #       ifdef _MIPS_SZPTR
 # endif
 
 # ifdef HP_PA
+    /* OS is assumed to be HP/UX       */
 #   define MACH_TYPE "HP_PA"
-#   define ALIGNMENT 4
-#   define ALIGN_DOUBLE
+#   define OS_TYPE "HPUX"
+#   ifdef __LP64__
+#     define CPP_WORDSZ 64
+#     define ALIGNMENT 8
+#   else
+#     define CPP_WORDSZ 32
+#     define ALIGNMENT 4
+#     define ALIGN_DOUBLE
+#   endif
     extern int __data_start;
 #   define DATASTART ((ptr_t)(&__data_start))
 #   if 0
 #   endif
 #   define STACK_GROWS_UP
 #   define DYNAMIC_LOADING
+#   ifndef HPUX_THREADS
+#     define MPROTECT_VDB
+#   endif
 #   include <unistd.h>
 #   define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
-       /* They misspelled the Posix macro?     */
 # endif
 
 # ifdef ALPHA
 #   define MACH_TYPE "ALPHA"
 #   define ALIGNMENT 8
+#   define USE_GENERIC_PUSH_REGS
+       /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */
+       /* fp registers in some cases when the target is a 21264.  The assembly */
+       /* code doesn't handle that yet, and version dependencies make that a   */
+       /* bit tricky.  Do the easy thing for now.                              */
 #   ifdef OSF1
 #      define OS_TYPE "OSF1"
 #      define DATASTART ((ptr_t) 0x140000000)
 #       define CPP_WORDSZ 64
 #       define STACKBOTTOM ((ptr_t) 0x120000000)
 #       ifdef __ELF__
-#        if 0
-           /* __data_start apparently disappeared in some recent releases. */
-            extern int __data_start;
-#           define DATASTART &__data_start
-#        endif
-#         define DATASTART GC_data_start
+#        define LINUX_DATA_START
 #         define DYNAMIC_LOADING
+         /* This doesn't work if the collector is in a dynamic library. */
 #       else
 #           define DATASTART ((ptr_t) 0x140000000)
 #       endif
 #   endif
 # endif
 
+# ifdef IA64
+#   define MACH_TYPE "IA64"
+#   define ALIGN_DOUBLE
+       /* Requires 16 byte alignment for malloc */
+#   define ALIGNMENT 8
+#   define USE_GENERIC_PUSH_REGS
+       /* We need to get preserved registers in addition to register windows.  */
+       /* That's easiest to do with setjmp.                                    */
+#   ifdef HPUX
+       --> needs work
+#   endif
+#   ifdef LINUX
+#       define OS_TYPE "LINUX"
+#       define CPP_WORDSZ 64
+       /* This should really be done through /proc, but that   */
+       /* requires we run on an IA64 kernel.                   */
+#       define STACKBOTTOM ((ptr_t) 0xa000000000000000l)
+       /* We also need the base address of the register stack  */
+       /* backing store.  There is probably a better way to    */
+       /* get that, too ...                                    */
+#      define BACKING_STORE_BASE ((ptr_t) 0x9fffffff80000000l)
+#      if 1
+#          define SEARCH_FOR_DATA_START
+#          define DATASTART GC_data_start
+#      else
+           extern int data_start;
+#          define DATASTART ((ptr_t)(&data_start))
+#      endif
+#       define DYNAMIC_LOADING
+#      define MPROTECT_VDB
+               /* Requires Linux 2.3.47 or later.      */
+       extern int _end;
+#      define DATAEND (&_end)
+       /* PREFETCH appears to have a large performance impact. */
+#      define PREFETCH(x) \
+         __asm__ ("    lfetch  [%0]": : "r"((void *)(x)))
+#      define PREFETCH_FOR_WRITE(x) \
+         __asm__ ("    lfetch.excl     [%0]": : "r"((void *)(x)))
+#      define CLEAR_DOUBLE(x) \
+         __asm__ ("    stf.spill       [%0]=f0": : "r"((void *)(x)))
+#   endif
+# endif
+
 # ifdef M88K
 #   define MACH_TYPE "M88K"
 #   define ALIGNMENT 4
 #      define HEURISTIC2
 # endif
 
+# if defined(PJ)
+#   define ALIGNMENT 4
+    extern int _etext;
+#   define DATASTART ((ptr_t)(&_etext))
+#   define HEURISTIC1
+# endif
+
+# ifdef ARM32
+#   define CPP_WORDSZ 32
+#   define MACH_TYPE "ARM32"
+#   define ALIGNMENT 4
+#   ifdef NETBSD
+#       define OS_TYPE "NETBSD"
+#       define HEURISTIC2
+        extern char etext;
+#       define DATASTART ((ptr_t)(&etext))
+#       define USE_GENERIC_PUSH_REGS
+#   endif
+#   ifdef LINUX
+#       define OS_TYPE "LINUX"
+#       define HEURISTIC1
+#       undef STACK_GRAN
+#       define STACK_GRAN 0x10000000
+#       define USE_GENERIC_PUSH_REGS
+#       ifdef __ELF__
+#            define DYNAMIC_LOADING
+#           include <features.h>
+#           if defined(__GLIBC__) && __GLIBC__ >= 2
+#               define LINUX_DATA_START
+#           else
+                extern char **__environ;
+#                define DATASTART ((ptr_t)(&__environ))
+                             /* hideous kludge: __environ is the first */
+                             /* word in crt0.o, and delimits the start */
+                             /* of the data segment, no matter which   */
+                             /* ld options were passed through.        */
+                             /* We could use _etext instead, but that  */
+                             /* would include .rodata, which may       */
+                             /* 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
+#endif
+
+#ifdef LINUX_DATA_START
+    /* Some Linux distributions arrange to define __data_start.  Some  */
+    /* define data_start as a weak symbol.  The latter is technically  */
+    /* broken, since the user program may define data_start, in which  */
+    /* 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
+
 # ifndef STACK_GROWS_UP
 #   define STACK_GROWS_DOWN
 # endif
 #   define SUNOS5SIGS
 # endif
 
+# if defined(HPUX)
+#   define SUNOS5SIGS
+# endif
+
 # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
    -> bad word size
 # endif
 #   define DEFAULT_VDB
 # endif
 
+# ifndef PREFETCH
+#   define PREFETCH(x)
+#   define NO_PREFETCH
+# endif
+
+# ifndef PREFETCH_FOR_WRITE
+#   define PREFETCH_FOR_WRITE(x)
+#   define NO_PREFETCH_FOR_WRITE
+# endif
+
+# ifndef CACHE_LINE_SIZE
+#   define CACHE_LINE_SIZE 32  /* Wild guess   */
+# endif
+
+# ifndef CLEAR_DOUBLE
+#   define CLEAR_DOUBLE(x) \
+       ((word*)x)[0] = 0; \
+       ((word*)x)[1] = 0;
+# endif /* CLEAR_DOUBLE */
+
 # if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS)
 #   define SOLARIS_THREADS
 # endif
 # if defined(SOLARIS_THREADS) && !defined(SUNOS5)
 --> inconsistent configuration
 # endif
+# if defined(HPUX_THREADS) && !defined(HPUX)
+--> inconsistent configuration
+# endif
 # if defined(PCR) || defined(SRC_M3) || \
        defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \
        defined(IRIX_THREADS) || defined(LINUX_THREADS) || \
-       defined(IRIX_JDK_THREADS)
+       defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS)
 #   define THREADS
 # endif
 
                                /* include assembly code to do it well. */
 # endif
 
-# endif
+# endif /* GCCONFIG_H */