[libgomp, nvptx] Fix libgomp.c/target-5.c compilation
authorTom de Vries <tdevries@suse.de>
Thu, 13 Dec 2018 18:04:05 +0000 (18:04 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 13 Dec 2018 18:04:05 +0000 (18:04 +0000)
Libgomp test-case libgomp.c/target-5.c is failing to compile when building for
x86_64 with nvptx accelerator due to missing:
- getpid
- gethostname
- isatty (pulled in by fwrite)
in the nvptx newlib.

This patch fixes the build failure by:
- adding a function gomp_print_string which limits the use of fwrite to a single
  location (in affinity-fmt.c), and
- creating an nvptx version of affinity-fmt.c, which:
  - overrides the configure test results HAVE_GETPID and HAVE_GETHOSTNAME, and
  - implements fwrite using write.

Build and reg-tested on x86_64 with nvptx accelerator.

2018-12-13  Tom de Vries  <tdevries@suse.de>

* affinity-fmt.c (gomp_print_string): New function, factored out of ...
(omp_display_affinity, gomp_display_affinity_thread): ... here, and ...
* fortran.c (omp_display_affinity_): ... here.
* libgomp.h (gomp_print_string): Declare.
* config/nvptx/affinity-fmt.c: New file.  Include affinity-fmt.c,
undefining HAVE_GETPID and HAVE_GETHOSTNAME, and mapping fwrite to
write.

From-SVN: r267100

libgomp/ChangeLog
libgomp/affinity-fmt.c
libgomp/config/nvptx/affinity-fmt.c [new file with mode: 0644]
libgomp/fortran.c
libgomp/libgomp.h

index 3a50f39876d46bc57360da6c22406bb4fff17ee8..7b42e87f50a6f8f794cbcf8b0d7a2a696df00193 100644 (file)
@@ -1,3 +1,13 @@
+2018-12-13  Tom de Vries  <tdevries@suse.de>
+
+       * affinity-fmt.c (gomp_print_string): New function, factored out of ...
+       (omp_display_affinity, gomp_display_affinity_thread): ... here, and ...
+       * fortran.c (omp_display_affinity_): ... here.
+       * libgomp.h (gomp_print_string): Declare.
+       * config/nvptx/affinity-fmt.c: New file.  Include affinity-fmt.c,
+       undefining HAVE_GETPID and HAVE_GETHOSTNAME, and mapping fwrite to
+       write.
+
 2018-12-13  Jakub Jelinek  <jakub@redhat.com>
 
        PR libgomp/88460
index 9e5c5f754eb490682a832b232b9924e0337225e8..1447597e7f7490c27d1b544eb6e6d05f4c7c0632 100644 (file)
 #include <sys/utsname.h>
 #endif
 
+void
+gomp_print_string (const char *str, size_t len)
+{
+  fwrite (str, 1, len, stderr);
+}
+
 void
 gomp_set_affinity_format (const char *format, size_t len)
 {
@@ -456,13 +462,13 @@ omp_display_affinity (const char *format)
   if (ret < sizeof buf)
     {
       buf[ret] = '\n';
-      fwrite (buf, 1, ret + 1, stderr);
+      gomp_print_string (buf, ret + 1);
       return;
     }
   b = gomp_malloc (ret + 1);
   ialias_call (omp_capture_affinity) (b, ret + 1, format);
   b[ret] = '\n';
-  fwrite (b, 1, ret + 1, stderr);
+  gomp_print_string (b, ret + 1);
   free (b);
 }
 
@@ -477,13 +483,13 @@ gomp_display_affinity_thread (gomp_thread_handle handle,
   if (ret < sizeof buf)
     {
       buf[ret] = '\n';
-      fwrite (buf, 1, ret + 1, stderr);
+      gomp_print_string (buf, ret + 1);
       return;
     }
   b = gomp_malloc (ret + 1);
   gomp_display_affinity (b, ret + 1, gomp_affinity_format_var,
                         handle, ts, place);
   b[ret] = '\n';
-  fwrite (b, 1, ret + 1, stderr);
+  gomp_print_string (b, ret + 1);
   free (b);
 }
diff --git a/libgomp/config/nvptx/affinity-fmt.c b/libgomp/config/nvptx/affinity-fmt.c
new file mode 100644 (file)
index 0000000..5e4a3fb
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This file is part of the GNU Offloading and Multi Processing 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/>.  */
+
+#include "libgomp.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>  /* For PRIx64.  */
+#endif
+#ifdef HAVE_UNAME
+#include <sys/utsname.h>
+#endif
+
+/* The HAVE_GETPID and HAVE_GETHOSTNAME configure tests are passing for nvptx,
+   while the nvptx newlib implementation does not support those functions.
+   Override the configure test results here.  */
+#undef HAVE_GETPID
+#undef HAVE_GETHOSTNAME
+
+/* The nvptx newlib implementation does not support fwrite, but it does support
+   write.  Map fwrite to write.  */
+#undef fwrite
+#define fwrite(ptr, size, nmemb, stream) write (1, (ptr), (nmemb) * (size))
+
+#include "../../affinity-fmt.c"
+
index 0157baec648dbdb18ec2ac662d624c15ef909766..328bf9c8450cdd02b658f95f9b33903f66ef0d0b 100644 (file)
@@ -626,7 +626,7 @@ omp_display_affinity_ (const char *format, size_t format_len)
   if (ret < sizeof buf)
     {
       buf[ret] = '\n';
-      fwrite (buf, 1, ret + 1, stderr);
+      gomp_print_string (buf, ret + 1);
     }
   else
     {
@@ -635,7 +635,7 @@ omp_display_affinity_ (const char *format, size_t format_len)
                             format_len ? fmt : gomp_affinity_format_var,
                             gomp_thread_self (), &thr->ts, thr->place);
       b[ret] = '\n';
-      fwrite (b, 1, ret + 1, stderr);
+      gomp_print_string (b, ret + 1);
       free (b);
     }
   if (fmt && fmt != fmt_buf)
index 7eacb45db66e89443b837b49e1afcb5f123b15e0..8105e640e32d4d644f3e7685ef3fa9fb7f2abefb 100644 (file)
@@ -751,6 +751,7 @@ extern void gomp_display_affinity_place (char *, size_t, size_t *, int);
 
 /* affinity-fmt.c */
 
+extern void gomp_print_string (const char *str, size_t len);
 extern void gomp_set_affinity_format (const char *, size_t);
 extern void gomp_display_string (char *, size_t, size_t *, const char *,
                                 size_t);