diff mbox

[PR,libgomp/64625] Remove __OFFLOAD_TABLE__ variable/formal parameter (was: Merge current set of OpenACC changes from gomp-4_0-branch)

Message ID 87r3uuzcqg.fsf@kepler.schwinge.homeip.net
State New
Headers show

Commit Message

Thomas Schwinge Jan. 16, 2015, 8:34 p.m. UTC
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(-)



Grüße,
 Thomas

Comments

Ilya Verbin Jan. 16, 2015, 10:40 p.m. UTC | #1
On 16 Jan 21:34, Thomas Schwinge wrote:
> On Thu, 15 Jan 2015 21:20:07 +0100, I wrote:
> 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?

Why do you think so?  __OFFLOAD_TABLE__ symbol lives in libgcc/offloadstuff.c
since November without regressions.

  -- Ilya
Jack Howarth Jan. 16, 2015, 11:22 p.m. UTC | #2
On 86_64 Fedora 15, current gcc trunk only produces…

nm libgcc_s.so.1 | grep OFF
0000000000215478 d _GLOBAL_OFFSET_TABLE_

and not __OFFLOAD_TABLE__,  The  libgcc_s.so.1 built on
x86_64-apple-darwin14 doesn't even contain the _GLOBAL_OFFSET_TABLE_
symbol.

On Fri, Jan 16, 2015 at 5:40 PM, Ilya Verbin <iverbin@gmail.com> wrote:
> On 16 Jan 21:34, Thomas Schwinge wrote:
>> On Thu, 15 Jan 2015 21:20:07 +0100, I wrote:
>> 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?
>
> Why do you think so?  __OFFLOAD_TABLE__ symbol lives in libgcc/offloadstuff.c
> since November without regressions.
>
>   -- Ilya
Ilya Verbin Jan. 16, 2015, 11:30 p.m. UTC | #3
On 16 Jan 18:22, Jack Howarth wrote:
> On 86_64 Fedora 15, current gcc trunk only produces…
> 
> nm libgcc_s.so.1 | grep OFF
> 0000000000215478 d _GLOBAL_OFFSET_TABLE_
> 
> and not __OFFLOAD_TABLE__,  The  libgcc_s.so.1 built on
> x86_64-apple-darwin14 doesn't even contain the _GLOBAL_OFFSET_TABLE_
> symbol.
> 
> On Fri, Jan 16, 2015 at 5:40 PM, Ilya Verbin <iverbin@gmail.com> wrote:
> > Why do you think so?  __OFFLOAD_TABLE__ symbol lives in libgcc/offloadstuff.c
> > since November without regressions.

That's correct.
1. offloadstuff.c isn't linked into libgcc_s.so.1
2. __OFFLOAD_TABLE__ is guarded with ENABLE_OFFLOADING, which is disabled in
default configuration.

  -- Ilya
Jack Howarth Jan. 17, 2015, 12:23 a.m. UTC | #4
As I read https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64625#c3, the
requirement for  __OFFLOAD_TABLE__ was not longer present and the
residual usages of it just had to be removed. The weak symbol on
darwin is fragile and seems to trip up on the existing code which
produces undefined symbols for ___OFFLOAD_TABLE__...

# nm e.50.1.o | grep OFF
         U ___OFFLOAD_TABLE__

rather than

$ nm e.50.1.o | grep OFF
         w __OFFLOAD_TABLE__

for all of the test cases.

On Fri, Jan 16, 2015 at 6:30 PM, Ilya Verbin <iverbin@gmail.com> wrote:
> On 16 Jan 18:22, Jack Howarth wrote:
>> On 86_64 Fedora 15, current gcc trunk only produces…
>>
>> nm libgcc_s.so.1 | grep OFF
>> 0000000000215478 d _GLOBAL_OFFSET_TABLE_
>>
>> and not __OFFLOAD_TABLE__,  The  libgcc_s.so.1 built on
>> x86_64-apple-darwin14 doesn't even contain the _GLOBAL_OFFSET_TABLE_
>> symbol.
>>
>> On Fri, Jan 16, 2015 at 5:40 PM, Ilya Verbin <iverbin@gmail.com> wrote:
>> > Why do you think so?  __OFFLOAD_TABLE__ symbol lives in libgcc/offloadstuff.c
>> > since November without regressions.
>
> That's correct.
> 1. offloadstuff.c isn't linked into libgcc_s.so.1
> 2. __OFFLOAD_TABLE__ is guarded with ENABLE_OFFLOADING, which is disabled in
> default configuration.
>
>   -- Ilya
Ilya Verbin Jan. 17, 2015, 12:34 a.m. UTC | #5
On 16 Jan 19:23, Jack Howarth wrote:
> As I read https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64625#c3, the
> requirement for  __OFFLOAD_TABLE__ was not longer present and the
> residual usages of it just had to be removed. The weak symbol on
> darwin is fragile and seems to trip up on the existing code which
> produces undefined symbols for ___OFFLOAD_TABLE__...
> 
> # nm e.50.1.o | grep OFF
>          U ___OFFLOAD_TABLE__
> 
> rather than
> 
> $ nm e.50.1.o | grep OFF
>          w __OFFLOAD_TABLE__
> 
> for all of the test cases.

I believe that the initial patch, which removes get_offload_symbol_decl, will
fix this.

  -- Ilya
Jack Howarth Jan. 17, 2015, 2:43 a.m. UTC | #6
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
diff mbox

Patch

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);