This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Fix libgomp alignment errors on Tru64 UNIX (PR libgomp/45351)


As discussed in the PR, we need to force int alignment for sem_t on
Tru64 UNIX to work around a bug in the native librt.  The following
patch does this.

Tested by rebuilding libgomp, make check is still running.  No failures
or unaligned access errors so for.

Ok for mainline if it passes?

Thanks.
	Rainer


2011-07-22  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR libgomp/45351
	* config/osf/sem.h: New file.
	* configure.tgt (alpha*-dec-osf*): Prepend osf to config_path.

diff --git a/libgomp/config/osf/sem.h b/libgomp/config/osf/sem.h
new file mode 100644
--- /dev/null
+++ b/libgomp/config/osf/sem.h
@@ -0,0 +1,53 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+
+   This file is part of the GNU OpenMP Library (libgomp).
+
+   Libgomp 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 3, or (at your option)
+   any later version.
+
+   Libgomp 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.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This is a variant of config/posix/sem.h for Tru64 UNIX.  The librt
+   sem_init implementation assumes int (4-byte) alignment for sem_t, while
+   the type only requires short (2-byte) alignment.  This mismatch causes
+   lots of unaligned access warnings from the kernel, so enforce that
+   alignment.  */
+
+#ifndef GOMP_SEM_H
+#define GOMP_SEM_H 1
+
+#include <semaphore.h>
+
+typedef sem_t gomp_sem_t __attribute__((aligned (__alignof__ (int))));
+
+static inline void gomp_sem_init (gomp_sem_t *sem, int value)
+{
+  sem_init (sem, 0, value);
+}
+
+extern void gomp_sem_wait (gomp_sem_t *sem);
+
+static inline void gomp_sem_post (gomp_sem_t *sem)
+{
+  sem_post (sem);
+}
+
+static inline void gomp_sem_destroy (gomp_sem_t *sem)
+{
+  sem_destroy (sem);
+}
+#endif /* GOMP_SEM_H  */
diff --git a/libgomp/configure.tgt b/libgomp/configure.tgt
--- a/libgomp/configure.tgt
+++ b/libgomp/configure.tgt
@@ -129,6 +129,11 @@ case "${target}" in
 	XLDFLAGS="${XLDFLAGS} -lpthread"
 	;;
 
+  alpha*-dec-osf*)
+	# Use Tru64 UNIX-specific sem.h version.
+	config_path="osf posix"
+	;;
+
   mips-sgi-irix6*)
 	# Need to link with -lpthread so libgomp.so is self-contained.
 	XLDFLAGS="${XLDFLAGS} -lpthread"


-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


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