This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PR libgomp/64625] Remove __OFFLOAD_TABLE__ variable/formal parameter (was: Merge current set of OpenACC changes from gomp-4_0-branch)
- From: Jack Howarth <howarth dot at dot gcc at gmail dot com>
- To: Thomas Schwinge <thomas at codesourcery dot com>
- Cc: jakub at gcc dot gnu dot org, GCC Patches <gcc-patches at gcc dot gnu dot org>, howarth at bromo dot med dot uc dot edu, Dominique d'HumiÃres <dominiq at lps dot ens dot fr>, Andrey Turetskiy <andrey dot turetskiy at gmail dot com>, bernds at gcc dot gnu dot org, Ilya Verbin <iverbin at gmail dot com>, kyukhin at gcc dot gnu dot org
- Date: Fri, 16 Jan 2015 21:43:50 -0500
- Subject: Re: [PR libgomp/64625] Remove __OFFLOAD_TABLE__ variable/formal parameter (was: Merge current set of OpenACC changes from gomp-4_0-branch)
- Authentication-results: sourceware.org; auth=none
- References: <87egqvu77s dot fsf at schwinge dot name> <87r3uuzcqg dot fsf at kepler dot schwinge dot homeip dot net>
Confirmed that this patch eliminates
[Bug libgomp/64625] ___OFFLOAD_TABLE__ symbol not produced on x86_64 darwin
and thus exposes
[Bug libgomp/64635] New: darwin produces
libgomp-plugin-host_nonshm.1.dylib but tries to load
libgomp-plugin-host_nonshm.so.1
The additional hack (which should be fixed with configure/Makefile.
changes to detect SHLIBEXT)...
@@ -1055,7 +1054,7 @@ static void
gomp_target_init (void)
{
const char *prefix ="libgomp-plugin-";
- const char *suffix = ".so.1";
+ const char *suffix = ".1.dylib";
const char *cur, *next;
char *plugin_name;
to target.c in libgomp eliminates the second bug.
Native configuration is x86_64-apple-darwin14.1.0
=== libgomp tests ===
Schedule of variations:
unix/-m32
unix/-m64
Running target unix/-m32
Using /sw/share/dejagnu/baseboards/unix.exp as board description file
for target.
Using /sw/share/dejagnu/config/unix.exp as generic interface file for target.
Using /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/config/default.exp
as tool-and-target-specific interface file.
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.c/c.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.c++/c++.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.fortran/fortran.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.graphite/graphite.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-c/c.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-c++/c++.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
...
=== libgomp Summary for unix/-m32 ===
# of expected passes 5715
# of unsupported tests 281
Running target unix/-m64
Using /sw/share/dejagnu/baseboards/unix.exp as board description file
for target.
Using /sw/share/dejagnu/config/unix.exp as generic interface file for target.
Using /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/config/default.exp
as tool-and-target-specific interface file.
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.c/c.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.c++/c++.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.fortran/fortran.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.graphite/graphite.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-c/c.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-c++/c++.exp
...
Running /sw/src/fink.build/gcc50-5.0.0-1000/gcc-5-20150116/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
...
=== libgomp Summary for unix/-m64 ===
# of expected passes 5715
# of unsupported tests 281
=== libgomp Summary ===
# of expected passes 11430
# of unsupported tests 562
On Fri, Jan 16, 2015 at 3:34 PM, Thomas Schwinge
<thomas@codesourcery.com> wrote:
> Hi!
>
> On Thu, 15 Jan 2015 21:20:07 +0100, I wrote:
>> In r219682, I have committed to trunk our current set of OpenACC changes,
>
> Here is a patch to remove the __OFFLOAD_SYMBOL__ variable/formal
> parameter, as discussed in <https://gcc.gnu.org/PR64625>.
>
> But -- I now wonder whether that's actually the issue that has been
> reported in the PR; doesn't that more look like a problem with the
> __OFFLOAD_TABLE__ symbol defined in libgcc/offloadstuff.c, and used in
> the mkoffload tools (such as gcc/config/i386/intelmic-mkoffload.c)? Can
> anyone guess what's going on?
>
> Anyway, as discussed in <https://gcc.gnu.org/PR64625>, I'd like to commit
> this patch either way, OK?
>
> commit 4409d0129118479c1cd1adbcfa96316ac4e734b0
> Author: Thomas Schwinge <thomas@codesourcery.com>
> Date: Fri Jan 16 20:12:12 2015 +0100
>
> [PR libgomp/64625] Remove __OFFLOAD_TABLE__ variable/formal parameter.
>
> gcc/
> * omp-low.c (offload_symbol_decl): Remove variable.
> (get_offload_symbol_decl): Remove function.
> (expand_omp_target): For BUILT_IN_GOMP_TARGET,
> BUILT_IN_GOMP_TARGET_DATA, BUILT_IN_GOMP_TARGET_UPDATE pass NULL
> instead of &__OFFLOAD_TABLE__, for BUILT_IN_GOACC_DATA_START,
> BUILT_IN_GOACC_ENTER_EXIT_DATA, BUILT_IN_GOACC_PARALLEL,
> BUILT_IN_GOACC_UPDATE don't pass it at all.
> libgomp/
> * libgomp_g.h (GOACC_data_start, GOACC_enter_exit_data)
> (GOACC_parallel, GOACC_update): Remove const_void *offload_table
> formal parameter. Update all users.
> * target.c (GOMP_target, GOMP_target_data, GOMP_target_update):
> Document unused formal parameter.
> ---
> gcc/omp-low.c | 45 ++++++++++++++++++---------------------------
> libgomp/libgomp_g.h | 10 +++++-----
> libgomp/oacc-parallel.c | 8 ++++----
> libgomp/target.c | 11 +++++------
> 4 files changed, 32 insertions(+), 42 deletions(-)
>
> diff --git gcc/omp-low.c gcc/omp-low.c
> index b7bf338..1589310 100644
> --- gcc/omp-low.c
> +++ gcc/omp-low.c
> @@ -340,30 +340,6 @@ oacc_max_threads (omp_context *ctx)
> /* Holds offload tables with decls. */
> vec<tree, va_gc> *offload_funcs, *offload_vars;
>
> -/* Holds a decl for __OFFLOAD_TABLE__. */
> -static GTY(()) tree offload_symbol_decl;
> -
> -/* Get the __OFFLOAD_TABLE__ symbol. */
> -static tree
> -get_offload_symbol_decl (void)
> -{
> - if (!offload_symbol_decl)
> - {
> - tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL,
> - get_identifier ("__OFFLOAD_TABLE__"),
> - ptr_type_node);
> - TREE_ADDRESSABLE (decl) = 1;
> - TREE_PUBLIC (decl) = 1;
> - DECL_EXTERNAL (decl) = 1;
> - DECL_WEAK (decl) = 1;
> - DECL_ATTRIBUTES (decl)
> - = tree_cons (get_identifier ("weak"),
> - NULL_TREE, DECL_ATTRIBUTES (decl));
> - offload_symbol_decl = decl;
> - }
> - return offload_symbol_decl;
> -}
> -
> /* Convenience function for calling scan_omp_1_op on tree operands. */
>
> static inline tree
> @@ -9119,16 +9095,31 @@ expand_omp_target (struct omp_region *region)
> }
>
> gimple g;
> - tree offload_table = get_offload_symbol_decl ();
> vec<tree> *args;
> /* The maximum number used by any start_ix, without varargs. */
> - unsigned int argcnt = 12;
> + unsigned int argcnt = 11;
>
> vec_alloc (args, argcnt);
> args->quick_push (device);
> if (offloaded)
> args->quick_push (build_fold_addr_expr (child_fn));
> - args->quick_push (build_fold_addr_expr (offload_table));
> + switch (start_ix)
> + {
> + case BUILT_IN_GOMP_TARGET:
> + case BUILT_IN_GOMP_TARGET_DATA:
> + case BUILT_IN_GOMP_TARGET_UPDATE:
> + /* This const void * is part of the current ABI, but we're not actually
> + using it. */
> + args->quick_push (build_zero_cst (ptr_type_node));
> + break;
> + case BUILT_IN_GOACC_DATA_START:
> + case BUILT_IN_GOACC_ENTER_EXIT_DATA:
> + case BUILT_IN_GOACC_PARALLEL:
> + case BUILT_IN_GOACC_UPDATE:
> + break;
> + default:
> + gcc_unreachable ();
> + }
> args->quick_push (t1);
> args->quick_push (t2);
> args->quick_push (t3);
> diff --git libgomp/libgomp_g.h libgomp/libgomp_g.h
> index c1e4e63..5e88d45 100644
> --- libgomp/libgomp_g.h
> +++ libgomp/libgomp_g.h
> @@ -217,15 +217,15 @@ extern void GOMP_teams (unsigned int, unsigned int);
>
> /* oacc-parallel.c */
>
> -extern void GOACC_data_start (int, const void *,
> - size_t, void **, size_t *, unsigned short *);
> +extern void GOACC_data_start (int, size_t, void **, size_t *,
> + unsigned short *);
> extern void GOACC_data_end (void);
> -extern void GOACC_enter_exit_data (int, const void *, size_t, void **,
> +extern void GOACC_enter_exit_data (int, size_t, void **,
> size_t *, unsigned short *, int, int, ...);
> -extern void GOACC_parallel (int, void (*) (void *), const void *, size_t,
> +extern void GOACC_parallel (int, void (*) (void *), size_t,
> void **, size_t *, unsigned short *, int, int, int,
> int, int, ...);
> -extern void GOACC_update (int, const void *, size_t, void **, size_t *,
> +extern void GOACC_update (int, size_t, void **, size_t *,
> unsigned short *, int, int, ...);
> extern void GOACC_wait (int, int, ...);
> extern int GOACC_get_num_threads (void);
> diff --git libgomp/oacc-parallel.c libgomp/oacc-parallel.c
> index b5e8060..a300742 100644
> --- libgomp/oacc-parallel.c
> +++ libgomp/oacc-parallel.c
> @@ -75,7 +75,7 @@ select_acc_device (int device_type)
> static void goacc_wait (int async, int num_waits, va_list ap);
>
> void
> -GOACC_parallel (int device, void (*fn) (void *), const void *offload_table,
> +GOACC_parallel (int device, void (*fn) (void *),
> size_t mapnum, void **hostaddrs, size_t *sizes,
> unsigned short *kinds,
> int num_gangs, int num_workers, int vector_length,
> @@ -172,7 +172,7 @@ GOACC_parallel (int device, void (*fn) (void *), const void *offload_table,
> }
>
> void
> -GOACC_data_start (int device, const void *offload_table, size_t mapnum,
> +GOACC_data_start (int device, size_t mapnum,
> void **hostaddrs, size_t *sizes, unsigned short *kinds)
> {
> bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK;
> @@ -218,7 +218,7 @@ GOACC_data_end (void)
> }
>
> void
> -GOACC_enter_exit_data (int device, const void *offload_table, size_t mapnum,
> +GOACC_enter_exit_data (int device, size_t mapnum,
> void **hostaddrs, size_t *sizes, unsigned short *kinds,
> int async, int num_waits, ...)
> {
> @@ -408,7 +408,7 @@ goacc_wait (int async, int num_waits, va_list ap)
> }
>
> void
> -GOACC_update (int device, const void *offload_table, size_t mapnum,
> +GOACC_update (int device, size_t mapnum,
> void **hostaddrs, size_t *sizes, unsigned short *kinds,
> int async, int num_waits, ...)
> {
> diff --git libgomp/target.c libgomp/target.c
> index 72d64fc..ebff55e 100644
> --- libgomp/target.c
> +++ libgomp/target.c
> @@ -738,15 +738,14 @@ gomp_fini_device (struct gomp_device_descr *devicep)
> is GOMP_DEVICE_ICV, it means use device-var ICV. If it is
> GOMP_DEVICE_HOST_FALLBACK (or any value
> larger than last available hw device), use host fallback.
> - FN is address of host code, OFFLOAD_TABLE contains value of the
> - __OFFLOAD_TABLE__ symbol in the shared library or binary that invokes
> - GOMP_target. HOSTADDRS, SIZES and KINDS are arrays
> + FN is address of host code, UNUSED is part of the current ABI, but
> + we're not actually using it. HOSTADDRS, SIZES and KINDS are arrays
> with MAPNUM entries, with addresses of the host objects,
> sizes of the host objects (resp. for pointer kind pointer bias
> and assumed sizeof (void *) size) and kinds. */
>
> void
> -GOMP_target (int device, void (*fn) (void *), const void *offload_table,
> +GOMP_target (int device, void (*fn) (void *), const void *unused,
> size_t mapnum, void **hostaddrs, size_t *sizes,
> unsigned char *kinds)
> {
> @@ -817,7 +816,7 @@ GOMP_target (int device, void (*fn) (void *), const void *offload_table,
> }
>
> void
> -GOMP_target_data (int device, const void *offload_table, size_t mapnum,
> +GOMP_target_data (int device, const void *unused, size_t mapnum,
> void **hostaddrs, size_t *sizes, unsigned char *kinds)
> {
> struct gomp_device_descr *devicep = resolve_device (device);
> @@ -873,7 +872,7 @@ GOMP_target_end_data (void)
> }
>
> void
> -GOMP_target_update (int device, const void *offload_table, size_t mapnum,
> +GOMP_target_update (int device, const void *unused, size_t mapnum,
> void **hostaddrs, size_t *sizes, unsigned char *kinds)
> {
> struct gomp_device_descr *devicep = resolve_device (device);
>
>
> GrÃÃe,
> Thomas