https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84011

--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 24 Jan 2018, hjl.tools at gmail dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84011
> 
> --- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> ---
> (In reply to Richard Biener from comment #1)
> > Somehow switch-conversion doesn't transform the switch with -f{PIE,PIC}. 
> > Without
> > we get
> > 
> > phy_modes (phy_interface_t interface)
> > {
> >   const char * _1;
> >   const char * _4;
> > 
> >   <bb 2> [local count: 1073741825]:
> >   if (interface_2(D) <= 22)
> >     goto <bb 3>; [50.00%]
> >   else
> >     goto <bb 4>; [50.00%]
> > 
> >   <bb 3> [local count: 536870912]:
> >   _4 = CSWTCH.0[interface_2(D)];
> > 
> >   <bb 4> [local count: 1073741825]:
> >   # _1 = PHI <_4(3), "unknown"(2)>
> >   return _1;
> > 
> > due to
> > 
> > Bailing out - value from a case would need runtime relocations
> > 
> >                   reloc = initializer_constant_valid_p (val, TREE_TYPE
> > (val));
> >                   if ((flag_pic && reloc != null_pointer_node)
> >                       || (!flag_pic && reloc == NULL_TREE))
> >                     {
> >                       if (reloc)
> >                         reason
> >                           = "value from a case would need runtime
> > relocations";
> >                       else
> >                         reason
> >                           = "value from a case is not a valid initializer";
> >                     }
> > 
> > not sure why we need relocations for string constants?
> 
> They do need run-time relocations:
> 
> /export/build/gnu/gcc-test/build-x86_64-linux/gcc/xgcc
> -B/export/build/gnu/gcc-test/build-x86_64-linux/gcc/ -O2  -fpic -S -o f.s f.i
> [hjl@gnu-skl-1 pr82303]$ cat f.s
>         .file   "f.i"
>         .text
>         .section        .rodata.str1.1,"aMS",@progbits,1
> .LC0:
>         .string "unknown"
>         .text
>         .p2align 4,,15
>         .globl  phy_modes
>         .type   phy_modes, @function
> phy_modes:
> .LFB0:
>         .cfi_startproc
>         leaq    .LC0(%rip), %rax
>         cmpl    $22, %edi
>         ja      .L1
>         movl    %edi, %edi
>         leaq    CSWTCH.0(%rip), %rax
>         movq    (%rax,%rdi,8), %rax
> .L1:
>         ret
>         .cfi_endproc
> .LFE0:
>         .size   phy_modes, .-phy_modes
>         .section        .rodata.str1.1
> .LC1:
>         .string ""
> .LC2:
>         .string "internal"
> .LC3:
>         .string "mii"
> .LC4:
>         .string "gmii"
> .LC5:
>         .string "sgmii"
> .LC6:
>         .string "tbi"
> .LC7:
>         .string "rev-mii"
> .LC8:
>         .string "rmii"
> .LC9:
>         .string "rgmii"
> .LC10:
>         .string "rgmii-id"
> .LC11:
>         .string "rgmii-rxid"
> .LC12:
>         .string "rgmii-txid"
> .LC13:
>         .string "rtbi"
> .LC14:
>         .string "smii"
> .LC15:
>         .string "xgmii"
> .LC16:
>         .string "moca"
> .LC17:
>         .string "qsgmii"
> .LC18:
>         .string "trgmii"
> .LC19:
>         .string "1000base-x"
> .LC20:
>         .string "2500base-x"
> .LC21:
>         .string "rxaui"
> .LC22:
>         .string "xaui"
> .LC23:
>         .string "10gbase-kr"
>         .section        .data.rel.ro.local,"aw",@progbits
>         .align 32
>         .type   CSWTCH.0, @object
>         .size   CSWTCH.0, 184
> CSWTCH.0:
>         .quad   .LC1
>         .quad   .LC2
>         .quad   .LC3
>         .quad   .LC4
>         .quad   .LC5
>         .quad   .LC6
>         .quad   .LC7
>         .quad   .LC8
>         .quad   .LC9
>         .quad   .LC10
>         .quad   .LC11
>         .quad   .LC12
>         .quad   .LC13
>         .quad   .LC14
>         .quad   .LC15
>         .quad   .LC16
>         .quad   .LC17
>         .quad   .LC18
>         .quad   .LC19
>         .quad   .LC20
>         .quad   .LC21
>         .quad   .LC22
>         .quad   .LC23
>         .ident  "GCC: (GNU) 8.0.1 20180117 (experimental)"
>         .section        .note.GNU-stack,"",@progbits
> [hjl@gnu-skl-1 pr82303]$ gcc -c f.s
> [hjl@gnu-skl-1 pr82303]$ readelf -rW f.o
> 
> Relocation section '.rela.text' at offset 0x370 contains 2 entries:
>     Offset             Info             Type               Symbol's Value 
> Symbol's Name + Addend
> 0000000000000003  0000000a00000002 R_X86_64_PC32          0000000000000000 
> .LC0
> - 4
> 0000000000000011  0000000700000002 R_X86_64_PC32          0000000000000000
> .data.rel.ro.local - 4
> 
> Relocation section '.rela.data.rel.ro.local' at offset 0x3a0 contains 23
> entries:
>     Offset             Info             Type               Symbol's Value 
> Symbol's Name + Addend
> 0000000000000000  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 8
> 0000000000000008  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 9
> 0000000000000010  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 12
> 0000000000000018  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 16
> 0000000000000020  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 1b
> 0000000000000028  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 21
> 0000000000000030  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 25
> 0000000000000038  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 2d
> 0000000000000040  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 32
> 0000000000000048  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 38
> 0000000000000050  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 41
> 0000000000000058  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 4c
> 0000000000000060  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 57
> 0000000000000068  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 5c
> 0000000000000070  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 61
> 0000000000000078  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 67
> 0000000000000080  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 6c
> 0000000000000088  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 73
> 0000000000000090  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 7a
> 0000000000000098  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 85
> 00000000000000a0  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 90
> 00000000000000a8  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 96
> 00000000000000b0  0000000500000001 R_X86_64_64            0000000000000000
> .rodata.str1.1 + 9b
> 
> Relocation section '.rela.eh_frame' at offset 0x5c8 contains 1 entry:
>     Offset             Info             Type               Symbol's Value 
> Symbol's Name + Addend
> 0000000000000020  0000000200000002 R_X86_64_PC32          0000000000000000
> .text + 0
> [hjl@gnu-skl-1 pr82303]$ 
> 
> The question is why run-time relocations aren't allowed.

Probably added to save binary space?  An optimization would be to
add an indirection by, say, only recording the constant offset
into an "array of strings" in the table, thus effectively

  "case1\0case2\0..."[CSWITCH[i]]

which would require only a relocation to access the single string
constant.  But it would prohibit cases of string merging within
those strings unless we implement that as well for this optimization.
Note this might be profitable unconditionally, not just with -fpie/pic
as the CSWITCH table would be smaller (dependent on the total
size of the merged string).

Richard.

Reply via email to