This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[libgomp, nvptx] Fix libgomp.c/target-5.c compilation
[ was: Re: [libgomp, nvptx] Disable
OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support ]
On 12-12-18 14:15, Jakub Jelinek wrote:
> On Wed, Dec 12, 2018 at 02:02:20PM +0100, Tom de Vries wrote:
>> This RFC patch implements that approach for getpid and gethostname (I
>> wonder though whether it's not possible to turn the corresponding
>> configure tests into link tests, which could also fix this for nvptx).
>>
>> Another problem we're running into is missing istty, pulled in by
>> fwrite. The nvptx newlib port does support write, but I'm unsure in what
>> form I should handle this. Add configure tests for fwrite and write? Or
>> special case the files in the config/nvptx dir? Any advice here?
>>
>> Thanks,
>> - Tom
>
>> [RFC][libgomp, nvptx] Fix target-5.c compilation
>>
>> Libgomp test-case libgomp.c/target-5.c is failing to compile with nvptx
>> accelerator due to missing:
>> - getpid
>> - gethostname
>> - isatty (pulled in by fwrite)
>> in the nvptx newlib.
>>
>> This demonstrator patch fixes that by minimally guarding all related locations
>> with ifndef LIBGOMP_OFFLOADED_ONLY, which allows the test-case (and others) to
>> pass.
>
> I guess my preference would be something similar to what
> libgomp/config/mingw32/affinity-fmt.c does now, so override the file,
> define/undefine something in there and include the common affinity-fmt.c.
> Perhaps for the fwrite stuff define introduce a function that does that
> (say
> void
> gomp_print_string (const char *str, size_t len)
> {
> fwrite (str, 1, len, stderr);
> },
> because it is in more than one file, make it hidden in libgomp.h.
> config/nvptx/error.c then has what you could also use in
> config/nvptx/affinity-fmt.c.
> And for hostname/getpid maybe just #undef those with a comment?
Done.
OK for trunk?
Thanks,
- Tom
[libgomp, nvptx] Fix libgomp.c/target-5.c compilation
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 (affinity-fmt.c), and
- creating an nvptx version of affinity-fmt.c, which:
- implements fwrite using write
- overrides the configure test results HAVE_GETPID and HAVE_GETHOSTNAME
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.
---
libgomp/affinity-fmt.c | 14 +++++++---
libgomp/config/nvptx/affinity-fmt.c | 52 +++++++++++++++++++++++++++++++++++++
libgomp/fortran.c | 4 +--
libgomp/libgomp.h | 1 +
4 files changed, 65 insertions(+), 6 deletions(-)
diff --git a/libgomp/affinity-fmt.c b/libgomp/affinity-fmt.c
index 9e5c5f754eb..1447597e7f7 100644
--- a/libgomp/affinity-fmt.c
+++ b/libgomp/affinity-fmt.c
@@ -37,6 +37,12 @@
#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
index 00000000000..ff1cbfcc4f8
--- /dev/null
+++ b/libgomp/config/nvptx/affinity-fmt.c
@@ -0,0 +1,52 @@
+/* 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 for size == 1. */
+#undef fwrite
+#define fwrite(ptr, size, nmemb, stream) \
+ ((size) == 1 ? write (1, (ptr), (nmemb)) : 0)
+
+#include "../../affinity-fmt.c"
+
diff --git a/libgomp/fortran.c b/libgomp/fortran.c
index 0157baec648..328bf9c8450 100644
--- a/libgomp/fortran.c
+++ b/libgomp/fortran.c
@@ -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)
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index 7eacb45db66..8105e640e32 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -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);
- References:
- [libgomp, nvptx] Disable OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support
- Re: [libgomp, nvptx] Disable OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support
- Re: [libgomp, nvptx] Disable OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support
- Re: [libgomp, nvptx] Disable OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support
- Re: [libgomp, nvptx] Disable OMP_{DISPLAY_AFFINITY,AFFINITY_FORMAT} support