3.4 PATCH: Support POSIX threads on Tru64 UNIX

Rainer Orth ro@TechFak.Uni-Bielefeld.DE
Tue Jul 15 21:54:00 GMT 2003


This patch is the last in a series of three to fully support (and enable by
default) --enable-threads=posix on Tru64 UNIX V4/V5.  The relevant boehm-gc
and libjava patches (still unreviewed)

	http://gcc.gnu.org/ml/java-patches/2003-q3/msg00075.html
	http://gcc.gnu.org/ml/java-patches/2003-q3/msg00076.html

need to go in first to avoid problems with enabling pthread support by
default.

Apart from the necessary configury and doc bits, the patch consists of two
parts:

* Depending on the compiler used, <pthread.h> either uses #pragma
  extern_prefix or redefines to change the external names of some pthread
  functions, like so:

# ifdef _PTHREAD_USE_PTDNAM_
#  pragma extern_prefix "__"
# else
#  define pthread_self __pthread_self
# endif

  Since the macro games cause all sorts of problems and gcc already
  supports #pragma extern_prefix, this patch uses fixincludes to also
  define _PTHREAD_USE_PTDNAM_ if __PRAGMA_EXTERN_PREFIX is defined
  (i.e. gcc's feature test macro to denote its support for the feature).
  This is not strictly necessary, but simplifies the patch alot.

* The main part of the patch deals with the following problem: unlike ELF
  systems, the Tru64 UNIX linker cannot handle weak definitions,
  i.e. symbols whose only definition is #pragma weak <symbol>.  On ELF
  systems, <symbol> becomes defined (weak) with a value of 0.  The Tru64
  UNIX linker treats such a symbol as undefined.  This causes problems for
  users of gthr-posix.h (i.e. libstdc++-v3 and libobjc), which used to rely
  on weak definitions of several POSIX threads functions.  As a workaround,
  this patch adds weak definitions of all functions needed by gthr-posix.h
  in a separate file (gthr-posix.c), which is only used as needed.  These
  are only dummy definitions, patterned after the definitions in the
  Solaris 8 libc wrt. return codes.  gthr-posix.o is added to both
  libgcc_s.so and libgcc.a:

  In libgcc_s.so, the definitions are necessary to resolve the references
  from the various unwind functions without having to link with -lpthread,
  but hidden with linker magic (-hidden_symbol).  I didn't want to leave
  them undefined (to be provided by libgcc.a) since that would break if a
  gcc-compiled shared object is used with a non-gcc compiler, which doesn't
  use or know about libgcc.a.  On the other hand, those symbols don't
  belong to the interface of libgcc_s and thus shouldn't be exported.  To
  make sure the -hidden_symbol flags have the desired effect, I've checked
  (using odump -Dt) that the pthread and sched functions are indeed local
  (i.e. not exported from libgcc_s.so).

  Adding the weak definitions to libgcc.a shouldn't hurt (in the same way
  as the definitions in Solaris 2 libc don't seem to hurt), since any user
  of POSIX threads is expected to link with -lpthread anyway.  This
  provides the necessary definitions for the other runtime libraries that
  need them, namely libstc++ and libobjc.  Since those libraries are
  expected to be gcc-only (there's no other compiler implementing either
  the new C++ ABI or Objective-C on Tru64 UNIX), I didn't try to include
  the weak definitions there.

Bootstrapped (together with the two patches above) on alpha-dec-osf4.0f and
alpha-dec-osf5.1 with only the problems reported with the libjava patch
(which are unrelated to this one).

The fixincl bits (apart from performing the desired fix :-) pass make check
in fixinc (and should go in even if there are concerns about the rest of
the patch).

Ok for mainline?

	Rainer

-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University


Tue Jul  8 15:09:16 2003  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>

	* config.gcc (alpha*-dec-osf[45]*): Enable POSIX thread support by
	default.

	* gthr-posix.c: New file.
	* gthr-posix.h: Define _REENTRANT if missing.
	Make _LIBOBJC #pragma weak visible with _LIBOBJC_WEAK.

	* config/alpha/t-osf4 (SHLIB_LINK): Hide dummy functions provided
	by gthr-posix.o.
	* config/alpha/t-osf-pthread: New file.

	* fixinc/inclhack.def (alpha_pthread): New fix.
	* fixinc/fixincl.x: Regenerate.
	* fixinc/tests/base/pthread.h [ALPHA_PTHREAD_CHECK]: New testcase.

	* doc/install.texi (alpha*-dec-osf*): Remove --enable-threads
	warning.
	Fixes PR bootstrap/9330.

Index: gcc/config.gcc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config.gcc,v
retrieving revision 1.331
diff -u -p -r1.331 config.gcc
--- gcc/config.gcc	2 Jul 2003 00:21:55 -0000	1.331
+++ gcc/config.gcc	15 Jul 2003 21:13:08 -0000
@@ -606,6 +606,12 @@ alpha*-dec-osf[45]*)
 	    target_cpu_default=MASK_SUPPORT_ARCH
 	    ;;
 	esac
+	case x${enable_threads} in
+	x | xyes | xpthreads | xposix)
+	    thread_file='posix'
+	    tmake_file="${tmake_file} alpha/t-osf-pthread"
+	    ;;
+	esac
 	;;
 alpha64-dec-*vms*)
 	tm_file="${tm_file} alpha/vms.h alpha/vms64.h"
Index: gcc/doc/install.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/install.texi,v
retrieving revision 1.206
diff -u -p -r1.206 install.texi
--- gcc/doc/install.texi	20 Jun 2003 11:18:03 -0000	1.206
+++ gcc/doc/install.texi	15 Jul 2003 21:20:41 -0000
@@ -2026,9 +2026,6 @@ As of GNU binutils 2.11.2, neither GNU @
 are supported on Tru64 UNIX, so you must not configure GCC with
 @option{--with-gnu-as} or @option{--with-gnu-ld}.
 
-The @option{--enable-threads} options isn't supported yet.  A patch is
-in preparation for a future release.
-
 GCC writes a @samp{.verstamp} directive to the assembler output file
 unless it is built as a cross-compiler.  It gets the version to use from
 the system header file @file{/usr/include/stamp.h}.  If you install a
Index: gcc/gthr-posix.c
===================================================================
RCS file: gcc/gthr-posix.c
diff -N gcc/gthr-posix.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/gthr-posix.c	15 Jul 2003 21:13:21 -0000
@@ -0,0 +1,207 @@
+/* POSIX threads dummy routines for systems without weak definitions.  */
+/* Compile this one with gcc.  */
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+/* As a special exception, if you link this library with other files,
+   some of which are compiled with GCC, to produce an executable,
+   this library does not by itself cause the resulting executable
+   to be covered by the GNU General Public License.
+   This exception does not however invalidate any other reasons why
+   the executable file might be covered by the GNU General Public License.  */
+
+#include "tconfig.h"
+#include "tm.h"
+/* Define so we provide weak definitions of functions used by libobjc only.  */
+#define _LIBOBJC_WEAK
+#include "gthr.h"
+
+int
+pthread_once (pthread_once_t *once ATTRIBUTE_UNUSED,
+	      void (*func) (void) ATTRIBUTE_UNUSED)
+{
+  return -1;
+}
+
+int
+pthread_key_create (pthread_key_t *key ATTRIBUTE_UNUSED,
+		    void (*dtor) (void *) ATTRIBUTE_UNUSED)
+{
+  return -1;
+}
+
+int
+pthread_key_delete (pthread_key_t key ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+void *
+pthread_getspecific (pthread_key_t key ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_setspecific (pthread_key_t key ATTRIBUTE_UNUSED,
+		     const void *ptr ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_create (pthread_t *thread ATTRIBUTE_UNUSED,
+		const pthread_attr_t *attr ATTRIBUTE_UNUSED,
+		void *(*start_routine) (void *) ATTRIBUTE_UNUSED,
+		void *arg ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_mutex_lock (pthread_mutex_t *mutex ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_mutex_trylock (pthread_mutex_t *mutex ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_mutex_unlock (pthread_mutex_t *mutex ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_cond_broadcast (pthread_cond_t *cond ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_cond_destroy (pthread_cond_t *cond ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_cond_init (pthread_cond_t *cond ATTRIBUTE_UNUSED,
+		   const pthread_condattr_t *attr ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_cond_signal (pthread_cond_t *cond ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_cond_wait (pthread_cond_t *cond ATTRIBUTE_UNUSED,
+		   pthread_mutex_t *mutex ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+void
+pthread_exit (void *value_ptr ATTRIBUTE_UNUSED)
+{
+}
+
+int
+pthread_mutex_init (pthread_mutex_t *mutex ATTRIBUTE_UNUSED,
+		    const pthread_mutexattr_t *attr ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_mutex_destroy (pthread_mutex_t *mutex ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+pthread_t
+pthread_self (void)
+{
+  return (pthread_t) 0;
+}
+
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
+int
+sched_get_priority_max (int policy ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+sched_get_priority_min (int policy ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
+
+int
+sched_yield (void)
+{
+  return 0;
+}
+
+int
+pthread_attr_destroy (pthread_attr_t *attr ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_attr_init (pthread_attr_t *attr ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_attr_setdetachstate (pthread_attr_t *attr ATTRIBUTE_UNUSED,
+			     int detachstate ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
+int
+pthread_getschedparam (pthread_t thread ATTRIBUTE_UNUSED,
+		       int *policy ATTRIBUTE_UNUSED,
+		       struct sched_param *param ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+int
+pthread_setschedparam (pthread_t thread ATTRIBUTE_UNUSED,
+		       int policy ATTRIBUTE_UNUSED,
+		       const struct sched_param *param ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
+
Index: gcc/gthr-posix.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gthr-posix.h,v
retrieving revision 1.26
diff -u -p -r1.26 gthr-posix.h
--- gcc/gthr-posix.h	16 Dec 2002 18:19:37 -0000	1.26
+++ gcc/gthr-posix.h	15 Jul 2003 21:13:21 -0000
@@ -1,6 +1,7 @@
 /* Threads compatibility routines for libgcc2 and libobjc.  */
 /* Compile this one with gcc.  */
-/* Copyright (C) 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -34,6 +35,11 @@ Software Foundation, 59 Temple Place - S
 
 #define __GTHREADS 1
 
+/* Some implementations of <pthread.h> require this to be defined.  */
+#ifndef _REENTRANT
+#define _REENTRANT 1
+#endif
+
 #include <pthread.h>
 #include <unistd.h>
 
@@ -57,7 +63,7 @@ typedef pthread_mutex_t __gthread_mutex_
 #pragma weak pthread_mutex_trylock
 #pragma weak pthread_mutex_unlock
 
-#ifdef _LIBOBJC
+#if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)
 /* Objective-C.  */
 #pragma weak pthread_cond_broadcast
 #pragma weak pthread_cond_destroy
@@ -82,7 +88,7 @@ typedef pthread_mutex_t __gthread_mutex_
 #pragma weak pthread_getschedparam
 #pragma weak pthread_setschedparam
 #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
-#endif /* _LIBOBJC */
+#endif /* _LIBOBJC || _LIBOBJC_WEAK */
 
 static inline int
 __gthread_active_p (void)
Index: gcc/config/alpha/t-osf-pthread
===================================================================
RCS file: gcc/config/alpha/t-osf-pthread
diff -N gcc/config/alpha/t-osf-pthread
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/alpha/t-osf-pthread	15 Jul 2003 21:13:21 -0000
@@ -0,0 +1,5 @@
+# Provide dummy POSIX threads functions
+LIB2FUNCS_EXTRA += $(srcdir)/gthr-posix.c
+
+# Compile libgcc2 with POSIX threads supports
+TARGET_LIBGCC2_CFLAGS=-pthread
Index: gcc/config/alpha/t-osf4
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/alpha/t-osf4,v
retrieving revision 1.6
diff -u -p -r1.6 t-osf4
--- gcc/config/alpha/t-osf4	9 Jan 2003 08:00:39 -0000	1.6
+++ gcc/config/alpha/t-osf4	15 Jul 2003 21:13:21 -0000
@@ -10,7 +10,11 @@ SHLIB_NAME = @shlib_base_name@.so
 SHLIB_SONAME = @shlib_base_name@.so.1
 SHLIB_OBJS = @shlib_objs@
 
+# Hide all POSIX threads related symbols provided by gthr-posix.c.  This
+# only has an effect if t-osf-pthread is in use.
 SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
+	-Wl,-hidden_symbol,pthread\* -Wl,-hidden_symbol,__pthread\* \
+	-Wl,-hidden_symbol,sched_get_\* -Wl,-hidden_symbol,sched_yield \
 	-Wl,-msym -Wl,-set_version,gcc.1 -Wl,-soname,$(SHLIB_SONAME) \
 	-o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) -lc && \
 	rm -f $(SHLIB_SONAME) && \
Index: gcc/fixinc/inclhack.def
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fixinc/inclhack.def,v
retrieving revision 1.157
diff -u -p -r1.157 inclhack.def
--- gcc/fixinc/inclhack.def	28 May 2003 11:53:34 -0000	1.157
+++ gcc/fixinc/inclhack.def	15 Jul 2003 21:13:35 -0000
@@ -578,6 +578,25 @@ fix = {
 
 
 /*
+ *  Obey __PRAGMA_EXTERN_PREFIX for Tru64 UNIX <pthread.h>.
+ */
+fix = {
+    hackname  = alpha_pthread;
+    files     = pthread.h;
+    select    = "(#[ \t]*if defined \\(_PTHREAD_ENV_DECC\\) || defined \\(_PTHREAD_ENV_EPCC\\))\n"
+		"(#[ \t]*define _PTHREAD_USE_PTDNAM_)";
+
+    mach      = "alpha*-dec-osf*";
+    c_fix     = format;
+    c_fix_arg = "%1 || defined (__PRAGMA_EXTERN_PREFIX)\n%2";
+
+    test_text = "#  if defined (_PTHREAD_ENV_DECC) || defined (_PTHREAD_ENV_EPCC)\n"
+		"#   define _PTHREAD_USE_PTDNAM_\n"
+		"#  endif";
+};
+
+
+/*
  *  Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0
  */
 fix = {
Index: gcc/fixinc/tests/base/pthread.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fixinc/tests/base/pthread.h,v
retrieving revision 1.9
diff -u -p -r1.9 pthread.h
--- gcc/fixinc/tests/base/pthread.h	22 Mar 2003 21:51:04 -0000	1.9
+++ gcc/fixinc/tests/base/pthread.h	15 Jul 2003 21:13:35 -0000
@@ -15,6 +15,13 @@
 #endif  /* AIX_PTHREAD_CHECK */
 
 
+#if defined( ALPHA_PTHREAD_CHECK )
+#  if defined (_PTHREAD_ENV_DECC) || defined (_PTHREAD_ENV_EPCC) || defined (__PRAGMA_EXTERN_PREFIX)
+#   define _PTHREAD_USE_PTDNAM_
+#  endif
+#endif  /* ALPHA_PTHREAD_CHECK */
+
+
 #if defined( PTHREAD_PAGE_SIZE_CHECK )
 extern int __page_size;
 #endif  /* PTHREAD_PAGE_SIZE_CHECK */



More information about the Gcc-patches mailing list