diff mbox

Constify host-side offload data`

Message ID 55A70152.8010702@acm.org
State New
Headers show

Commit Message

Nathan Sidwell July 16, 2015, 12:56 a.m. UTC
This patch constifies the objects involved in describing the host-side 
offloading information.  Probably won't make much difference in executable 
layout because of relocations, but at least allows them to be put into 
.rel.rodata, and makes it clear the objects aren't modified.

ok for trunk?

nathan

Comments

Ilya Verbin July 16, 2015, 11:41 a.m. UTC | #1
On Wed, Jul 15, 2015 at 20:56:50 -0400, Nathan Sidwell wrote:
> Index: gcc/config/nvptx/mkoffload.c
> ===================================================================
> -  fprintf (out, "extern void *__OFFLOAD_TABLE__[];\n\n");
> +  fprintf (out, "extern const void *conat __OFFLOAD_TABLE__[];\n\n");

Here is a typo.

  -- Ilya
Nathan Sidwell July 16, 2015, 12:20 p.m. UTC | #2
On 07/16/15 07:41, Ilya Verbin wrote:
> On Wed, Jul 15, 2015 at 20:56:50 -0400, Nathan Sidwell wrote:
>> Index: gcc/config/nvptx/mkoffload.c
>> ===================================================================
>> -  fprintf (out, "extern void *__OFFLOAD_TABLE__[];\n\n");
>> +  fprintf (out, "extern const void *conat __OFFLOAD_TABLE__[];\n\n");
>
> Here is a typo.

Thanks, caught that myself too.  testing shows the patch ok for x86-linux/ptx

nathan
Jakub Jelinek July 17, 2015, 2:42 p.m. UTC | #3
On Thu, Jul 16, 2015 at 08:20:53AM -0400, Nathan Sidwell wrote:
> On 07/16/15 07:41, Ilya Verbin wrote:
> >On Wed, Jul 15, 2015 at 20:56:50 -0400, Nathan Sidwell wrote:
> >>Index: gcc/config/nvptx/mkoffload.c
> >>===================================================================
> >>-  fprintf (out, "extern void *__OFFLOAD_TABLE__[];\n\n");
> >>+  fprintf (out, "extern const void *conat __OFFLOAD_TABLE__[];\n\n");
> >
> >Here is a typo.
> 
> Thanks, caught that myself too.  testing shows the patch ok for x86-linux/ptx

Ok for trunk with that change.

	Jakub
Ilya Verbin Oct. 21, 2015, 5:33 p.m. UTC | #4
Hi!

On Wed, Jul 15, 2015 at 20:56:50 -0400, Nathan Sidwell wrote:
> --- libgcc/offloadstuff.c	(revision 225851)
> +++ libgcc/offloadstuff.c	(working copy)
> ...
> -void *__offload_func_table[0]
> +const void *const __offload_func_table[0]
> ...
> -void *__offload_var_table[0]
> +const void *const __offload_var_table[0]

I've just noticed that this patch + similar change in intelmic-mkoffload.c
<https://gcc.gnu.org/ml/gcc-patches/2015-07/msg01452.html> bumps up the filesize
of "helloworld" with offloading to MIC from 17KB to 4MB!

This happens because .gnu.offload_{funcs,vars} sections in
crtoffload{begin,end}.o now doesn't have WRITE flag, but the same sections
produced by omp_finish_file has it.  When linker joins writable + nonwritable
sections from several objects, it inserts some weird 2MB offset into the final
binary.  I.e. now there are 2 such offsets: one in the host binary and one in
the MIC target image, hence 4MB.  I haven't investigated how it happens, because
I thing it's bad idea to join sections with different flags.

But we can't make .gnu.offload_{funcs,vars} in omp_finish_file also readonly,
because in case of shared libraries there are R_X86_64_RELATIVE relocations,
which make these sections writable.  So, I guess we need to remove all consts to
make these sections writable in all objects.

H.J.,
Maybe linker should print some warning about joining writable + nonwritable
sections?  Here is a simple testcase:

$ cat t1.s
.section ".AAA", "a"
.long 0x12345678
$ cat t2.s
.section ".AAA", "wa"
.long 0x12345678
$ as t1.s -o t1.o
$ as t2.s -o t2.o
$ ld -shared t1.o t2.o
$ ls -lh a.out
2.1M a.out

  -- Ilya
H.J. Lu Oct. 21, 2015, 5:38 p.m. UTC | #5
On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> Hi!
>
> On Wed, Jul 15, 2015 at 20:56:50 -0400, Nathan Sidwell wrote:
>> --- libgcc/offloadstuff.c     (revision 225851)
>> +++ libgcc/offloadstuff.c     (working copy)
>> ...
>> -void *__offload_func_table[0]
>> +const void *const __offload_func_table[0]
>> ...
>> -void *__offload_var_table[0]
>> +const void *const __offload_var_table[0]
>
> I've just noticed that this patch + similar change in intelmic-mkoffload.c
> <https://gcc.gnu.org/ml/gcc-patches/2015-07/msg01452.html> bumps up the filesize
> of "helloworld" with offloading to MIC from 17KB to 4MB!
>
> This happens because .gnu.offload_{funcs,vars} sections in
> crtoffload{begin,end}.o now doesn't have WRITE flag, but the same sections
> produced by omp_finish_file has it.  When linker joins writable + nonwritable
> sections from several objects, it inserts some weird 2MB offset into the final
> binary.  I.e. now there are 2 such offsets: one in the host binary and one in
> the MIC target image, hence 4MB.  I haven't investigated how it happens, because
> I thing it's bad idea to join sections with different flags.
>
> But we can't make .gnu.offload_{funcs,vars} in omp_finish_file also readonly,
> because in case of shared libraries there are R_X86_64_RELATIVE relocations,
> which make these sections writable.  So, I guess we need to remove all consts to
> make these sections writable in all objects.
>
> H.J.,
> Maybe linker should print some warning about joining writable + nonwritable
> sections?  Here is a simple testcase:
>
> $ cat t1.s
> .section ".AAA", "a"
> .long 0x12345678
> $ cat t2.s
> .section ".AAA", "wa"
> .long 0x12345678
> $ as t1.s -o t1.o
> $ as t2.s -o t2.o
> $ ld -shared t1.o t2.o
> $ ls -lh a.out
> 2.1M a.out
>

Does linker make AAA  writable? If yes, linker does what it
is told.
Ilya Verbin Oct. 21, 2015, 5:42 p.m. UTC | #6
On Wed, Oct 21, 2015 at 10:38:10 -0700, H.J. Lu wrote:
> On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> > H.J.,
> > Maybe linker should print some warning about joining writable + nonwritable
> > sections?  Here is a simple testcase:
> >
> > $ cat t1.s
> > .section ".AAA", "a"
> > .long 0x12345678
> > $ cat t2.s
> > .section ".AAA", "wa"
> > .long 0x12345678
> > $ as t1.s -o t1.o
> > $ as t2.s -o t2.o
> > $ ld -shared t1.o t2.o
> > $ ls -lh a.out
> > 2.1M a.out
> >
> 
> Does linker make AAA  writable? If yes, linker does what it
> is told.

Yes, it makes it writable, but why it also makes this?

  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .hash             HASH             00000000000000b0  000000b0
       0000000000000028  0000000000000004   A       2     0     8
  [ 2] .dynsym           DYNSYM           00000000000000d8  000000d8
       0000000000000078  0000000000000018   A       3     2     8
  [ 3] .dynstr           STRTAB           0000000000000150  00000150
       0000000000000019  0000000000000000   A       0     0     1
  [ 4] .AAA              PROGBITS         0000000000000169  00000169
       0000000000000008  0000000000000000  WA       0     0     1
  [ 5] .eh_frame         PROGBITS         0000000000000178  00000178
       0000000000000000  0000000000000000   A       0     0     8
  [ 6] .dynamic          DYNAMIC          0000000000200178  00200178  <-- ???
       00000000000000b0  0000000000000010  WA       3     0     8
  [ 7] .shstrtab         STRTAB           0000000000000000  00200380
       0000000000000049  0000000000000000           0     0     1
  [ 8] .symtab           SYMTAB           0000000000000000  00200228
       0000000000000120  0000000000000018           9     9     8
  [ 9] .strtab           STRTAB           0000000000000000  00200348
       0000000000000038  0000000000000000           0     0     1

  -- Ilya
H.J. Lu Oct. 21, 2015, 5:44 p.m. UTC | #7
On Wed, Oct 21, 2015 at 10:42 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> On Wed, Oct 21, 2015 at 10:38:10 -0700, H.J. Lu wrote:
>> On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
>> > H.J.,
>> > Maybe linker should print some warning about joining writable + nonwritable
>> > sections?  Here is a simple testcase:
>> >
>> > $ cat t1.s
>> > .section ".AAA", "a"
>> > .long 0x12345678
>> > $ cat t2.s
>> > .section ".AAA", "wa"
>> > .long 0x12345678
>> > $ as t1.s -o t1.o
>> > $ as t2.s -o t2.o
>> > $ ld -shared t1.o t2.o
>> > $ ls -lh a.out
>> > 2.1M a.out
>> >
>>
>> Does linker make AAA  writable? If yes, linker does what it
>> is told.
>
> Yes, it makes it writable, but why it also makes this?
>
>   [Nr] Name              Type             Address           Offset
>        Size              EntSize          Flags  Link  Info  Align
>   [ 0]                   NULL             0000000000000000  00000000
>        0000000000000000  0000000000000000           0     0     0
>   [ 1] .hash             HASH             00000000000000b0  000000b0
>        0000000000000028  0000000000000004   A       2     0     8
>   [ 2] .dynsym           DYNSYM           00000000000000d8  000000d8
>        0000000000000078  0000000000000018   A       3     2     8
>   [ 3] .dynstr           STRTAB           0000000000000150  00000150
>        0000000000000019  0000000000000000   A       0     0     1
>   [ 4] .AAA              PROGBITS         0000000000000169  00000169
>        0000000000000008  0000000000000000  WA       0     0     1
>   [ 5] .eh_frame         PROGBITS         0000000000000178  00000178
>        0000000000000000  0000000000000000   A       0     0     8
>   [ 6] .dynamic          DYNAMIC          0000000000200178  00200178  <-- ???
>        00000000000000b0  0000000000000010  WA       3     0     8
>   [ 7] .shstrtab         STRTAB           0000000000000000  00200380
>        0000000000000049  0000000000000000           0     0     1
>   [ 8] .symtab           SYMTAB           0000000000000000  00200228
>        0000000000000120  0000000000000018           9     9     8
>   [ 9] .strtab           STRTAB           0000000000000000  00200348
>        0000000000000038  0000000000000000           0     0     1
>

Linker groups input sections by section name and ors section
flags.
Nathan Sidwell Oct. 21, 2015, 5:45 p.m. UTC | #8
On 10/21/15 13:33, Ilya Verbin wrote:
> Hi!

> This happens because .gnu.offload_{funcs,vars} sections in
> crtoffload{begin,end}.o now doesn't have WRITE flag, but the same sections
> produced by omp_finish_file has it.  When linker joins writable + nonwritable
> sections from several objects, it inserts some weird 2MB offset into the final
> binary.  I.e. now there are 2 such offsets: one in the host binary and one in
> the MIC target image, hence 4MB.  I haven't investigated how it happens, because
> I thing it's bad idea to join sections with different flags.

That is a strange insertion of padding.  Joining sections with different flags, 
is IIUC, perfectly fine.

> But we can't make .gnu.offload_{funcs,vars} in omp_finish_file also readonly,
> because in case of shared libraries there are R_X86_64_RELATIVE relocations,

Um, I thought they had absolute relocs, and thus were relro, but ICBW.

> which make these sections writable.  So, I guess we need to remove all consts to
> make these sections writable in all objects.

That seems like the prudent path.

nathan
Ilya Verbin Oct. 22, 2015, 2:11 p.m. UTC | #9
On Wed, Oct 21, 2015 at 10:44:56 -0700, H.J. Lu wrote:
> On Wed, Oct 21, 2015 at 10:42 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> > On Wed, Oct 21, 2015 at 10:38:10 -0700, H.J. Lu wrote:
> >> On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> >> > H.J.,
> >> > Maybe linker should print some warning about joining writable + nonwritable
> >> > sections?  Here is a simple testcase:
> >> >
> >> > $ cat t1.s
> >> > .section ".AAA", "a"
> >> > .long 0x12345678
> >> > $ cat t2.s
> >> > .section ".AAA", "wa"
> >> > .long 0x12345678
> >> > $ as t1.s -o t1.o
> >> > $ as t2.s -o t2.o
> >> > $ ld -shared t1.o t2.o
> >> > $ ls -lh a.out
> >> > 2.1M a.out
> >> >
> >>
> >> Does linker make AAA  writable? If yes, linker does what it
> >> is told.
> >
> > Yes, it makes it writable, but why it also makes this?
> >
> >   [Nr] Name              Type             Address           Offset
> >        Size              EntSize          Flags  Link  Info  Align
> >   [ 0]                   NULL             0000000000000000  00000000
> >        0000000000000000  0000000000000000           0     0     0
> >   [ 1] .hash             HASH             00000000000000b0  000000b0
> >        0000000000000028  0000000000000004   A       2     0     8
> >   [ 2] .dynsym           DYNSYM           00000000000000d8  000000d8
> >        0000000000000078  0000000000000018   A       3     2     8
> >   [ 3] .dynstr           STRTAB           0000000000000150  00000150
> >        0000000000000019  0000000000000000   A       0     0     1
> >   [ 4] .AAA              PROGBITS         0000000000000169  00000169
> >        0000000000000008  0000000000000000  WA       0     0     1
> >   [ 5] .eh_frame         PROGBITS         0000000000000178  00000178
> >        0000000000000000  0000000000000000   A       0     0     8
> >   [ 6] .dynamic          DYNAMIC          0000000000200178  00200178  <-- ???
> >        00000000000000b0  0000000000000010  WA       3     0     8
> >   [ 7] .shstrtab         STRTAB           0000000000000000  00200380
> >        0000000000000049  0000000000000000           0     0     1
> >   [ 8] .symtab           SYMTAB           0000000000000000  00200228
> >        0000000000000120  0000000000000018           9     9     8
> >   [ 9] .strtab           STRTAB           0000000000000000  00200348
> >        0000000000000038  0000000000000000           0     0     1
> >
> 
> Linker groups input sections by section name and ors section
> flags.

Could you please help figure out how this number 0x200178 is calculated?
ld -verbose doesn't show anything helpful.  It seems that something goes wrong
during section-to-segment mapping, because when both .AAA have "wa" flags, we
got small binary with 2 LOAD segments:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x00000000000001a8 0x00000000000001a8  R      200000
  LOAD           0x00000000000001a8 0x00000000002001a8 0x00000000002001a8
                 0x00000000000000b8 0x00000000000000b8  RW     200000

But when one .AAA has "a" flag, and another .AAA has "wa" flag, we got huge
binary with only one big LOAD segment:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000200228 0x0000000000200228  RW     200000

BTW, gold produces small binary in both cases.

Thanks,
  -- Ilya
H.J. Lu Oct. 22, 2015, 2:35 p.m. UTC | #10
On Thu, Oct 22, 2015 at 7:11 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> On Wed, Oct 21, 2015 at 10:44:56 -0700, H.J. Lu wrote:
>> On Wed, Oct 21, 2015 at 10:42 AM, Ilya Verbin <iverbin@gmail.com> wrote:
>> > On Wed, Oct 21, 2015 at 10:38:10 -0700, H.J. Lu wrote:
>> >> On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
>> >> > H.J.,
>> >> > Maybe linker should print some warning about joining writable + nonwritable
>> >> > sections?  Here is a simple testcase:
>> >> >
>> >> > $ cat t1.s
>> >> > .section ".AAA", "a"
>> >> > .long 0x12345678
>> >> > $ cat t2.s
>> >> > .section ".AAA", "wa"
>> >> > .long 0x12345678
>> >> > $ as t1.s -o t1.o
>> >> > $ as t2.s -o t2.o
>> >> > $ ld -shared t1.o t2.o
>> >> > $ ls -lh a.out
>> >> > 2.1M a.out
>> >> >
>> >>
>> >> Does linker make AAA  writable? If yes, linker does what it
>> >> is told.
>> >
>> > Yes, it makes it writable, but why it also makes this?
>> >
>> >   [Nr] Name              Type             Address           Offset
>> >        Size              EntSize          Flags  Link  Info  Align
>> >   [ 0]                   NULL             0000000000000000  00000000
>> >        0000000000000000  0000000000000000           0     0     0
>> >   [ 1] .hash             HASH             00000000000000b0  000000b0
>> >        0000000000000028  0000000000000004   A       2     0     8
>> >   [ 2] .dynsym           DYNSYM           00000000000000d8  000000d8
>> >        0000000000000078  0000000000000018   A       3     2     8
>> >   [ 3] .dynstr           STRTAB           0000000000000150  00000150
>> >        0000000000000019  0000000000000000   A       0     0     1
>> >   [ 4] .AAA              PROGBITS         0000000000000169  00000169
>> >        0000000000000008  0000000000000000  WA       0     0     1
>> >   [ 5] .eh_frame         PROGBITS         0000000000000178  00000178
>> >        0000000000000000  0000000000000000   A       0     0     8
>> >   [ 6] .dynamic          DYNAMIC          0000000000200178  00200178  <-- ???
>> >        00000000000000b0  0000000000000010  WA       3     0     8
>> >   [ 7] .shstrtab         STRTAB           0000000000000000  00200380
>> >        0000000000000049  0000000000000000           0     0     1
>> >   [ 8] .symtab           SYMTAB           0000000000000000  00200228
>> >        0000000000000120  0000000000000018           9     9     8
>> >   [ 9] .strtab           STRTAB           0000000000000000  00200348
>> >        0000000000000038  0000000000000000           0     0     1
>> >
>>
>> Linker groups input sections by section name and ors section
>> flags.
>
> Could you please help figure out how this number 0x200178 is calculated?
> ld -verbose doesn't show anything helpful.  It seems that something goes wrong
> during section-to-segment mapping, because when both .AAA have "wa" flags, we
> got small binary with 2 LOAD segments:
>   Type           Offset             VirtAddr           PhysAddr
>                  FileSiz            MemSiz              Flags  Align
>   LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
>                  0x00000000000001a8 0x00000000000001a8  R      200000
>   LOAD           0x00000000000001a8 0x00000000002001a8 0x00000000002001a8
>                  0x00000000000000b8 0x00000000000000b8  RW     200000
>
> But when one .AAA has "a" flag, and another .AAA has "wa" flag, we got huge
> binary with only one big LOAD segment:
>   Type           Offset             VirtAddr           PhysAddr
>                  FileSiz            MemSiz              Flags  Align
>   LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
>                  0x0000000000200228 0x0000000000200228  RW     200000
>
> BTW, gold produces small binary in both cases.
>

Please open a binutils bug with a testcase.
Ilya Verbin Oct. 22, 2015, 3:08 p.m. UTC | #11
On Thu, Oct 22, 2015 at 07:35:55 -0700, H.J. Lu wrote:
> On Thu, Oct 22, 2015 at 7:11 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> > On Wed, Oct 21, 2015 at 10:44:56 -0700, H.J. Lu wrote:
> >> On Wed, Oct 21, 2015 at 10:42 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> >> > On Wed, Oct 21, 2015 at 10:38:10 -0700, H.J. Lu wrote:
> >> >> On Wed, Oct 21, 2015 at 10:33 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> >> >> > H.J.,
> >> >> > Maybe linker should print some warning about joining writable + nonwritable
> >> >> > sections?  Here is a simple testcase:
> >> >> >
> >> >> > $ cat t1.s
> >> >> > .section ".AAA", "a"
> >> >> > .long 0x12345678
> >> >> > $ cat t2.s
> >> >> > .section ".AAA", "wa"
> >> >> > .long 0x12345678
> >> >> > $ as t1.s -o t1.o
> >> >> > $ as t2.s -o t2.o
> >> >> > $ ld -shared t1.o t2.o
> >> >> > $ ls -lh a.out
> >> >> > 2.1M a.out
> >> >> >
> >> >>
> >> >> Does linker make AAA  writable? If yes, linker does what it
> >> >> is told.
> >> >
> >> > Yes, it makes it writable, but why it also makes this?
> >> >
> >> >   [Nr] Name              Type             Address           Offset
> >> >        Size              EntSize          Flags  Link  Info  Align
> >> >   [ 0]                   NULL             0000000000000000  00000000
> >> >        0000000000000000  0000000000000000           0     0     0
> >> >   [ 1] .hash             HASH             00000000000000b0  000000b0
> >> >        0000000000000028  0000000000000004   A       2     0     8
> >> >   [ 2] .dynsym           DYNSYM           00000000000000d8  000000d8
> >> >        0000000000000078  0000000000000018   A       3     2     8
> >> >   [ 3] .dynstr           STRTAB           0000000000000150  00000150
> >> >        0000000000000019  0000000000000000   A       0     0     1
> >> >   [ 4] .AAA              PROGBITS         0000000000000169  00000169
> >> >        0000000000000008  0000000000000000  WA       0     0     1
> >> >   [ 5] .eh_frame         PROGBITS         0000000000000178  00000178
> >> >        0000000000000000  0000000000000000   A       0     0     8
> >> >   [ 6] .dynamic          DYNAMIC          0000000000200178  00200178  <-- ???
> >> >        00000000000000b0  0000000000000010  WA       3     0     8
> >> >   [ 7] .shstrtab         STRTAB           0000000000000000  00200380
> >> >        0000000000000049  0000000000000000           0     0     1
> >> >   [ 8] .symtab           SYMTAB           0000000000000000  00200228
> >> >        0000000000000120  0000000000000018           9     9     8
> >> >   [ 9] .strtab           STRTAB           0000000000000000  00200348
> >> >        0000000000000038  0000000000000000           0     0     1
> >> >
> >>
> >> Linker groups input sections by section name and ors section
> >> flags.
> >
> > Could you please help figure out how this number 0x200178 is calculated?
> > ld -verbose doesn't show anything helpful.  It seems that something goes wrong
> > during section-to-segment mapping, because when both .AAA have "wa" flags, we
> > got small binary with 2 LOAD segments:
> >   Type           Offset             VirtAddr           PhysAddr
> >                  FileSiz            MemSiz              Flags  Align
> >   LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
> >                  0x00000000000001a8 0x00000000000001a8  R      200000
> >   LOAD           0x00000000000001a8 0x00000000002001a8 0x00000000002001a8
> >                  0x00000000000000b8 0x00000000000000b8  RW     200000
> >
> > But when one .AAA has "a" flag, and another .AAA has "wa" flag, we got huge
> > binary with only one big LOAD segment:
> >   Type           Offset             VirtAddr           PhysAddr
> >                  FileSiz            MemSiz              Flags  Align
> >   LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
> >                  0x0000000000200228 0x0000000000200228  RW     200000
> >
> > BTW, gold produces small binary in both cases.
> >
> 
> Please open a binutils bug with a testcase.

Done: https://sourceware.org/bugzilla/show_bug.cgi?id=19162

  -- Ilya
diff mbox

Patch

2015-07-15  Nathan Sidwell  <nathan@codesourcery.com>

	gcc/
	* config/nvptx/mkoffload.c (process): Constify host data.
	* config/i386/intelmic-mkoffload.c (generate_target_descr_file):
	Constify host data.
	(generate_host_descr_file): Likewise.

	libgomp/
	* target.c (struct_offload_image_descr): Constify host_table.
	(gomp_offload_image_to_device): Likewise.
	(GOMP_offload_register, GOMP_offload_unregister): Likewise.

	libgcc/
	* offloadstuff.c: Constify host data.

Index: gcc/config/nvptx/mkoffload.c
===================================================================
--- gcc/config/nvptx/mkoffload.c	(revision 225851)
+++ gcc/config/nvptx/mkoffload.c	(working copy)
@@ -870,12 +870,13 @@  process (FILE *in, FILE *out)
   fprintf (out, "#ifdef __cplusplus\n"
 	   "extern \"C\" {\n"
 	   "#endif\n");
-  fprintf (out, "extern void GOMP_offload_register (void *, int, void *);\n");
+  fprintf (out, "extern void GOMP_offload_register"
+	   " (const void *, int, void *);\n");
   fprintf (out, "#ifdef __cplusplus\n"
 	   "}\n"
 	   "#endif\n");
 
-  fprintf (out, "extern void *__OFFLOAD_TABLE__[];\n\n");
+  fprintf (out, "extern const void *conat __OFFLOAD_TABLE__[];\n\n");
   fprintf (out, "static __attribute__((constructor)) void init (void)\n{\n");
   fprintf (out, "  GOMP_offload_register (__OFFLOAD_TABLE__, %d,\n",
 	   GOMP_DEVICE_NVIDIA_PTX);
Index: gcc/config/i386/intelmic-mkoffload.c
===================================================================
--- gcc/config/i386/intelmic-mkoffload.c	(revision 225851)
+++ gcc/config/i386/intelmic-mkoffload.c	(working copy)
@@ -252,7 +252,7 @@  generate_target_descr_file (const char *
 	   "__attribute__ ((__used__, visibility (\"hidden\"),\n"
 	   "section (\".gnu.offload_vars\"))) = { };\n\n"
 
-	   "void *__OFFLOAD_TARGET_TABLE__[]\n"
+	   "void const *const __OFFLOAD_TARGET_TABLE__[]\n"
 	   "__attribute__ ((__used__, visibility (\"hidden\"))) = {\n"
 	   "  &__offload_func_table, &__offload_funcs_end,\n"
 	   "  &__offload_var_table, &__offload_vars_end\n"
@@ -338,7 +338,7 @@  generate_host_descr_file (const char *ho
     fatal_error (input_location, "cannot open '%s'", src_filename);
 
   fprintf (src_file,
-	   "extern void *__OFFLOAD_TABLE__;\n"
+	   "extern const void *const __OFFLOAD_TABLE__[];\n"
 	   "extern void *__offload_image_intelmic_start;\n"
 	   "extern void *__offload_image_intelmic_end;\n\n"
 
@@ -350,11 +350,11 @@  generate_host_descr_file (const char *ho
 	   "#ifdef __cplusplus\n"
 	   "extern \"C\"\n"
 	   "#endif\n"
-	   "void GOMP_offload_register (void *, int, void *);\n"
+	   "void GOMP_offload_register (const void *, int, void *);\n"
 	   "#ifdef __cplusplus\n"
 	   "extern \"C\"\n"
 	   "#endif\n"
-	   "void GOMP_offload_unregister (void *, int, void *);\n\n"
+	   "void GOMP_offload_unregister (const void *, int, void *);\n\n"
 
 	   "__attribute__((constructor))\n"
 	   "static void\n"
Index: libgomp/target.c
===================================================================
--- libgomp/target.c	(revision 225851)
+++ libgomp/target.c	(working copy)
@@ -57,7 +57,7 @@  static gomp_mutex_t register_lock;
    pointer to target data.  */
 struct offload_image_descr {
   enum offload_target_type type;
-  void *host_table;
+  const void *host_table;
   void *target_data;
 };
 
@@ -642,7 +642,7 @@  gomp_update (struct gomp_device_descr *d
 
 static void
 gomp_offload_image_to_device (struct gomp_device_descr *devicep,
-			      void *host_table, void *target_data,
+			      const void *host_table, void *target_data,
 			      bool is_register_lock)
 {
   void **host_func_table = ((void ***) host_table)[0];
@@ -730,7 +730,8 @@  gomp_offload_image_to_device (struct gom
    the target, and TARGET_DATA needed by target plugin.  */
 
 void
-GOMP_offload_register (void *host_table, enum offload_target_type target_type,
+GOMP_offload_register (const void *host_table,
+		       enum offload_target_type target_type,
 		       void *target_data)
 {
   int i;
@@ -764,7 +765,8 @@  GOMP_offload_register (void *host_table,
    the target, and TARGET_DATA needed by target plugin.  */
 
 void
-GOMP_offload_unregister (void *host_table, enum offload_target_type target_type,
+GOMP_offload_unregister (const void *host_table,
+			 enum offload_target_type target_type,
 			 void *target_data)
 {
   void **host_func_table = ((void ***) host_table)[0];
Index: libgcc/offloadstuff.c
===================================================================
--- libgcc/offloadstuff.c	(revision 225851)
+++ libgcc/offloadstuff.c	(working copy)
@@ -46,10 +46,10 @@  see the files COPYING3 and COPYING.RUNTI
 #ifdef CRT_BEGIN
 
 #if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
-void *__offload_func_table[0]
+const void *const __offload_func_table[0]
   __attribute__ ((__used__, visibility ("hidden"),
 		  section (OFFLOAD_FUNC_TABLE_SECTION_NAME))) = { };
-void *__offload_var_table[0]
+const void *const __offload_var_table[0]
   __attribute__ ((__used__, visibility ("hidden"),
 		  section (OFFLOAD_VAR_TABLE_SECTION_NAME))) = { };
 #endif
@@ -57,17 +57,17 @@  void *__offload_var_table[0]
 #elif defined CRT_END
 
 #if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
-void *__offload_funcs_end[0]
+const void *const __offload_funcs_end[0]
   __attribute__ ((__used__, visibility ("hidden"),
 		  section (OFFLOAD_FUNC_TABLE_SECTION_NAME))) = { };
-void *__offload_vars_end[0]
+const void *const __offload_vars_end[0]
   __attribute__ ((__used__, visibility ("hidden"),
 		  section (OFFLOAD_VAR_TABLE_SECTION_NAME))) = { };
 
-extern void *__offload_func_table[];
-extern void *__offload_var_table[];
+extern const void *const __offload_func_table[];
+extern const void *const __offload_var_table[];
 
-void *__OFFLOAD_TABLE__[]
+const void *const __OFFLOAD_TABLE__[]
   __attribute__ ((__visibility__ ("hidden"))) =
 {
   &__offload_func_table, &__offload_funcs_end,