This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
boehm-gc x86-64 support
- From: Bo Thorsen <bo at sonofthor dot dk>
- To: gcc-patches at gcc dot gnu dot org, patches at x86-64 dot org
- Date: Thu, 18 Jul 2002 23:09:43 +0200
- Subject: boehm-gc x86-64 support
With this patch (and my libffi patch) java testsuite passes 1220 tests on
x86-64. I don't know yet why the number isn't higher, it might be that it
gets some more when I implement the closures API in libffi. If someone
else has ideas, I'd really appreciate them.
I have left some BSD stuff in gcconfig.h, but the BSD guys will have to
make sure they're right and activate the individual ports in the other
files.
2002-07-18 Bo Thorsen <bo@suse.de>
* include/private/gcconfig.h: Add x86-64 definitions.
* os_dep.c: Add x86-64 support.
* configure.in: Likewise.
* configure: Regenerate.
Index: configure
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/configure,v
retrieving revision 1.53
diff -u -r1.53 configure
--- configure 18 Jul 2002 19:41:36 -0000 1.53
+++ configure 18 Jul 2002 21:00:57 -0000
@@ -2391,7 +2391,7 @@
if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
- ac_ext=C
+ ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
@@ -2417,15 +2417,18 @@
fi
rm -f conftest*
ac_cv_prog_CXXCPP="$CXXCPP"
-ac_ext=c
+ ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross
+
fi
+ CXXCPP="$ac_cv_prog_CXXCPP"
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
fi
-CXXCPP="$ac_cv_prog_CXXCPP"
echo "$ac_t""$CXXCPP" 1>&6
@@ -2551,7 +2554,7 @@
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:2555: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:2558: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -2584,7 +2587,7 @@
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:2588: checking for executable suffix" >&5
+echo "configure:2591: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2594,7 +2597,7 @@
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:2598: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:2601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
*.c | *.o | *.obj) ;;
@@ -2617,7 +2620,7 @@
fi
echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6
-echo "configure:2621: checking for thread model used by GCC" >&5
+echo "configure:2624: checking for thread model used by GCC" >&5
THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
if test -z "$THREADS"; then
THREADS=no
@@ -2646,7 +2649,7 @@
THREADS=posix
THREADLIBS=-lpthread
case "$host" in
- x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux*)
+ x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
cat >> confdefs.h <<\EOF
#define GC_LINUX_THREADS 1
EOF
@@ -2748,7 +2751,7 @@
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:2752: checking for dlopen in -ldl" >&5
+echo "configure:2755: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2756,7 +2759,7 @@
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2760 "configure"
+#line 2763 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -2767,7 +2770,7 @@
dlopen()
; return 0; }
EOF
-if { (eval echo configure:2771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2774: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2986,7 +2989,7 @@
EOF
;;
- x86-*-linux* | i586-*-linux* | i686-*-linux* )
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
cat >> confdefs.h <<\EOF
#define MAKE_BACK_GRAPH 1
EOF
Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/configure.in,v
retrieving revision 1.42
diff -u -r1.42 configure.in
--- configure.in 18 Jul 2002 19:41:37 -0000 1.42
+++ configure.in 18 Jul 2002 21:00:57 -0000
@@ -73,7 +73,7 @@
THREADS=posix
THREADLIBS=-lpthread
case "$host" in
- x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux*)
+ x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
AC_DEFINE(GC_LINUX_THREADS)
AC_DEFINE(_REENTRANT)
if test "${enable_parallel_mark}"; then
@@ -259,7 +259,7 @@
ia64-*-linux* )
AC_DEFINE(MAKE_BACK_GRAPH)
;;
- x86-*-linux* | i586-*-linux* | i686-*-linux* )
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
AC_DEFINE(MAKE_BACK_GRAPH)
AC_MSG_WARN("Client must not use -fomit-frame-pointer.")
AC_DEFINE(SAVE_CALL_COUNT, 8)
Index: os_dep.c
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/os_dep.c,v
retrieving revision 1.24
diff -u -r1.24 os_dep.c
--- os_dep.c 27 Mar 2002 19:21:32 -0000 1.24
+++ os_dep.c 18 Jul 2002 21:00:58 -0000
@@ -2174,7 +2174,7 @@
char * addr = (char *) (scp -> si_addr);
# endif
# ifdef LINUX
-# ifdef I386
+# if defined(I386) || defined (X86_64)
char * addr = (char *) (sc.cr2);
# else
# if defined(M68K)
Index: include/private/gcconfig.h
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/include/private/gcconfig.h,v
retrieving revision 1.20
diff -u -r1.20 gcconfig.h
--- include/private/gcconfig.h 10 Jun 2002 17:10:20 -0000 1.20
+++ include/private/gcconfig.h 18 Jul 2002 21:00:58 -0000
@@ -193,6 +193,10 @@
# define I386
# define mach_type_known
# endif
+# if defined(LINUX) && defined(__x86_64__)
+# define X86_64
+# define mach_type_known
+# endif
# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
# define IA64
# define mach_type_known
@@ -427,6 +431,7 @@
/* (HPUX) */
/* SH ==> Hitachi SuperH */
/* (LINUX & MSWINCE) */
+ /* X86_64 ==> AMD x86-64 */
/*
@@ -1624,6 +1629,85 @@
# define DATAEND /* not needed */
# endif
+# ifdef X86_64
+# define MACH_TYPE "X86_64"
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define CACHE_LINE_SIZE 64
+# ifdef HAVE_BUILTIN_UNWIND_INIT
+# define USE_GENERIC_PUSH_REGS
+# endif
+# ifdef LINUX
+# ifndef __GNUC__
+ /* The Intel compiler doesn't like inline assembly */
+# define USE_GENERIC_PUSH_REGS
+# endif
+# define OS_TYPE "LINUX"
+# define LINUX_STACKBOTTOM
+# if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# else
+ /* We seem to get random errors in incremental mode, */
+ /* possibly because Linux threads is itself a malloc client */
+ /* and can't deal with the signals. */
+# endif
+# 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>
+# define LINUX_DATA_START
+ extern int _end[];
+# define DATAEND (_end)
+# else
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
+# endif
+# define PREFETCH(x) \
+ __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x)))
+# define PREFETCH_FOR_WRITE(x) \
+ __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x)))
+# endif
+# ifdef OPENBSD
+# define OS_TYPE "OPENBSD"
+# endif
+# ifdef FREEBSD
+# define OS_TYPE "FREEBSD"
+# ifndef GC_FREEBSD_THREADS
+# define MPROTECT_VDB
+# endif
+# define SIG_SUSPEND SIGUSR1
+# define SIG_THR_RESTART SIGUSR2
+# define FREEBSD_STACKBOTTOM
+# ifdef __ELF__
+# 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"
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# endif
+# endif
+# if defined(OPENBSD) || defined(NETBSD)
+# define HEURISTIC2
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# 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 */
@@ -1817,7 +1901,7 @@
# define CAN_SAVE_CALL_STACKS
# define CAN_SAVE_CALL_ARGS
#endif
-#if defined(I386) && defined(LINUX)
+#if (defined(I386) || defined(X86_64)) && defined(LINUX)
/* SAVE_CALL_CHAIN is supported if the code is compiled to save */
/* frame pointers by default, i.e. no -fomit-frame-pointer flag. */
# define CAN_SAVE_CALL_STACKS
--
Bo Thorsen | Praestevejen 4
Free software developer | 5290 Marslev
SuSE Labs | Denmark