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 <tho...@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 <tho...@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