Hi! On Fri, 4 Apr 2014 11:30:49 +0200, Bernd Schmidt <[email protected]> wrote: > On 03/21/2014 04:20 PM, Jakub Jelinek wrote: > > On Fri, Mar 21, 2014 at 04:13:45PM +0100, Bernd Schmidt wrote: > >> On 03/20/2014 07:56 PM, Jakub Jelinek wrote: > >>> When we were discussing the design last year, my strong preference was > >>> that > >>> either this lives in some other crt object that mkoffload/linker plugin > >>> adds > >>> to link, or that it would be completely mkoffload synthetized. > >> > >> mkoffload is only concerned with generating target images. These > >> fragments are for the host tables. > >> > >> How's this? It moves everything to ompbegin.o/ompend.o and only > >> links in these files if we have produced at least one target offload > >> image. > > > > I'd call the files crtompbegin.o/crtompend.o instead.
I'd go with crtoffload* (or similar). ;-)
> > Also, supposedly if you've used section names without . in them, the linker
> > itself would provide the symbols automatically and you wouldn't actually
> > need begin/end, but just one object that would reference the linker created
> > symbols. Just use say __gnu_offload_whatever__ or similar section names.
>
> I've checked in the following which should address all this.
Is it a linker bug that I need to add something like the following?
--- libgcc/ompstuff.c
+++ libgcc/ompstuff.c
@@ -40,6 +40,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If
not, see
#include "libgcc_tm.h"
#if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
+# if 1
+/* TODO: Without the following, will get missing symbols for __start_* and
+ __stop_*. Linker bug? */
+static void *_funcs[0] __attribute__ ((section ("__gnu_offload_funcs"))) = { };
+static void *_vars[0] __attribute__ ((section ("__gnu_offload_vars"))) = { };
+# endif
extern void __start___gnu_offload_funcs;
extern void __stop___gnu_offload_funcs;
extern void __start___gnu_offload_vars;
$ ld --version
GNU ld (Sourcery CodeBench 2013.11-17) 2.23.52.20130912
[...]
> --- libgcc/ompstuff.c (revision 0)
> +++ libgcc/ompstuff.c (working copy)
> +extern void __start___gnu_offload_funcs;
> +extern void __stop___gnu_offload_funcs;
> +extern void __start___gnu_offload_vars;
> +extern void __stop___gnu_offload_vars;
> +void *__OPENMP_TARGET__[] __attribute__ ((__visibility__ ("hidden"))) =
> +{
> + &__start___gnu_offload_funcs, &__stop___gnu_offload_funcs,
> + &__start___gnu_offload_vars, &__stop___gnu_offload_vars
> +};
../../../source/libgcc/ompstuff.c:49:3: warning: taking address of
expression of type 'void'
&__start___gnu_offload_funcs, &__stop___gnu_offload_funcs,
^
../../../source/libgcc/ompstuff.c:49:33: warning: taking address of
expression of type 'void'
&__start___gnu_offload_funcs, &__stop___gnu_offload_funcs,
^
../../../source/libgcc/ompstuff.c:50:3: warning: taking address of
expression of type 'void'
&__start___gnu_offload_vars, &__stop___gnu_offload_vars
^
../../../source/libgcc/ompstuff.c:50:32: warning: taking address of
expression of type 'void'
&__start___gnu_offload_vars, &__stop___gnu_offload_vars
^
s%void%char makes this go away.
Grüße,
Thomas
pgpPQxXD1zF2u.pgp
Description: PGP signature
