aboutsummaryrefslogtreecommitdiff
path: root/boehm-gc
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-25 09:45:16 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-25 09:45:16 +0000
commit7192af4b793a2fd3c60f7e3e895623614a9cc6b7 (patch)
treea5c42f4b1268f44bb078af04644014a7390b49fd /boehm-gc
parent64c06c2c5160167c30354aa540236ca1ebba98be (diff)
Merge from csl/sourcerygxx-4_1 branch, revision 112375
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/csl/coldfire-4_1@112376 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc')
-rw-r--r--boehm-gc/ChangeLog22
-rwxr-xr-xboehm-gc/configure23
-rw-r--r--boehm-gc/configure.ac19
-rw-r--r--boehm-gc/include/gc_config.h.in3
-rw-r--r--boehm-gc/include/gc_ext_config.h.in2
-rw-r--r--boehm-gc/include/gc_pthread_redirects.h2
-rw-r--r--boehm-gc/pthread_support.c40
7 files changed, 109 insertions, 2 deletions
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 06f026a1121..ac5e80ff154 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,25 @@
+2006-02-28 Release Manager
+
+ * GCC 4.1.0 released.
+
+2006-02-09 Tom Tromey <tromey@redhat.com>
+
+ * pthread_support.c: Conditionally include dlfcn.h.
+
+2006-02-06 Jakub Jelinek <jakub@redhat.com>
+ Anthony Green <green@redhat.com>
+ Tom Tromey <tromey@redhat.com>
+
+ * include/gc_ext_config.h.in: Added GC_PTHREAD_SYM_VERSION.
+ * include/gc_config.h.in: Rebuilt.
+ * include/gc_pthread_redirects.h (pthread_create): Conditionally
+ define.
+ * pthread_support.c (pthread_create_): New global.
+ (constr): New function.
+ (pthread_create): Conditionally renamed.
+ * configure: Rebuilt.
+ * configure.ac (GC_PTHREAD_SYM_VERSION): Define.
+
2005-11-01 Bryce McKinlay <mckinlay@redhat.com>
* include/private/gc_priv.h: Increase MAX_ROOT_SETS to 1024.
diff --git a/boehm-gc/configure b/boehm-gc/configure
index 7aa7c4ff03a..d1ba87617e1 100755
--- a/boehm-gc/configure
+++ b/boehm-gc/configure
@@ -6627,6 +6627,29 @@ _ACEOF
fi
+symver=
+case "$target" in
+ *-*-linux* )
+ cat > conftest.c <<EOF
+#include <pthread.h>
+void *tf (void *arg) { (void) arg; return NULL; }
+int main (void) { pthread_t th; pthread_create (&th, NULL, tf, NULL); return 0; }
+EOF
+ if $CC $CFLAGS -pthread -o conftest conftest.c > /dev/null 2>&1; then
+ symver=`readelf -s conftest 2> /dev/null | sed -n '/UND pthread_create@/{s/^.*@//;s/ .*$//;p;q}'`
+ fi
+ rm -f conftest conftest.c
+ ;;
+esac
+if test -n "$symver"; then
+
+cat >>confdefs.h <<_ACEOF
+#define GC_PTHREAD_SYM_VERSION "$symver"
+_ACEOF
+
+fi
+
+
if test -n "$with_cross_host" &&
test x"$with_cross_host" != x"no"; then
toolexecdir='$(exec_prefix)/$(target_noncanonical)'
diff --git a/boehm-gc/configure.ac b/boehm-gc/configure.ac
index dfb0e17e261..ef1e831a4b5 100644
--- a/boehm-gc/configure.ac
+++ b/boehm-gc/configure.ac
@@ -450,6 +450,25 @@ if test "${gc_use_mmap}" = "yes"; then
AC_DEFINE(USE_MMAP, 1, [use MMAP instead of sbrk to get new memory])
fi
+symver=
+case "$target" in
+ *-*-linux* )
+ cat > conftest.c <<EOF
+#include <pthread.h>
+void *tf (void *arg) { (void) arg; return NULL; }
+int main (void) { pthread_t th; pthread_create (&th, NULL, tf, NULL); return 0; }
+EOF
+ if $CC $CFLAGS -pthread -o conftest conftest.c > /dev/null 2>&1; then
+ symver=`readelf -s conftest 2> /dev/null | sed -n '/UND pthread_create@/{s/^.*@//;s/ .*$//;p;q}'`
+ fi
+ rm -f conftest conftest.c
+ ;;
+esac
+if test -n "$symver"; then
+ AC_DEFINE_UNQUOTED(GC_PTHREAD_SYM_VERSION, "$symver", [symbol version of pthread_create])
+fi
+
+
if test -n "$with_cross_host" &&
test x"$with_cross_host" != x"no"; then
toolexecdir='$(exec_prefix)/$(target_noncanonical)'
diff --git a/boehm-gc/include/gc_config.h.in b/boehm-gc/include/gc_config.h.in
index 92f1b2cf460..cfaae9dd464 100644
--- a/boehm-gc/include/gc_config.h.in
+++ b/boehm-gc/include/gc_config.h.in
@@ -45,6 +45,9 @@
/* support for Tru64 pthreads */
#undef GC_OSF1_THREADS
+/* symbol version of pthread_create */
+#undef GC_PTHREAD_SYM_VERSION
+
/* support for Solaris pthreads */
#undef GC_SOLARIS_PTHREADS
diff --git a/boehm-gc/include/gc_ext_config.h.in b/boehm-gc/include/gc_ext_config.h.in
index 52a662dcf0b..716143dc62f 100644
--- a/boehm-gc/include/gc_ext_config.h.in
+++ b/boehm-gc/include/gc_ext_config.h.in
@@ -3,3 +3,5 @@ external clients that do not want to include the full gc.h. Currently this
is used by libjava/include/boehm-gc.h. */
#undef THREAD_LOCAL_ALLOC
+
+#undef GC_PTHREAD_SYM_VERSION
diff --git a/boehm-gc/include/gc_pthread_redirects.h b/boehm-gc/include/gc_pthread_redirects.h
index 842518cfcc4..f9d4939affc 100644
--- a/boehm-gc/include/gc_pthread_redirects.h
+++ b/boehm-gc/include/gc_pthread_redirects.h
@@ -68,7 +68,9 @@
# undef pthread_detach
#endif
+#ifndef GC_PTHREAD_SYM_VERSION
# define pthread_create GC_pthread_create
+#endif
# define pthread_join GC_pthread_join
# define pthread_detach GC_pthread_detach
diff --git a/boehm-gc/pthread_support.c b/boehm-gc/pthread_support.c
index 2a3b91917c7..4b32afef4bd 100644
--- a/boehm-gc/pthread_support.c
+++ b/boehm-gc/pthread_support.c
@@ -47,6 +47,13 @@
/*#define DEBUG_THREADS 1*/
/*#define GC_ASSERTIONS*/
+#include "gc_config.h"
+
+#ifdef GC_PTHREAD_SYM_VERSION
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#endif
+
# include "gc.h"
# include "private/pthread_support.h"
@@ -1194,8 +1201,37 @@ void * GC_start_routine(void * arg)
return(result);
}
+#ifdef GC_PTHREAD_SYM_VERSION
+
+/* Force constr to execute prior to main(). */
+static void constr (void) __attribute__ ((constructor));
+
+static int
+(*pthread_create_)(pthread_t *new_thread,
+ const pthread_attr_t *attr_in,
+ void * (*thread_execp)(void *), void *arg);
+
+static void
+constr (void)
+{
+ /* Get a pointer to the real pthread_create. */
+ pthread_create_ = dlvsym (RTLD_NEXT, "pthread_create",
+ GC_PTHREAD_SYM_VERSION);
+}
+
+#define GC_PTHREAD_CREATE_NAME pthread_create
+#define GC_PTHREAD_REAL_NAME (*pthread_create_)
+
+#else
+
+#define GC_PTHREAD_CREATE_NAME WRAP_FUNC(pthread_create)
+#define GC_PTHREAD_REAL_NAME REAL_FUNC(pthread_create)
+
+#endif
+
+
int
-WRAP_FUNC(pthread_create)(pthread_t *new_thread,
+GC_PTHREAD_CREATE_NAME(pthread_t *new_thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
{
@@ -1250,7 +1286,7 @@ WRAP_FUNC(pthread_create)(pthread_t *new_thread,
pthread_self());
# endif
- result = REAL_FUNC(pthread_create)(new_thread, attr, GC_start_routine, si);
+ result = GC_PTHREAD_REAL_NAME(new_thread, attr, GC_start_routine, si);
# ifdef DEBUG_THREADS
GC_printf1("Started thread 0x%X\n", *new_thread);