On Tue, Oct 06, 2015 at 09:39:20PM +0900, Oleg Endo wrote:
> On Mon, 2015-10-05 at 23:15 -0400, Rich Felker wrote:
> > Attached is the initial version of the patch against trunk. I've fixed
> > the functional issues I'm aware of from the previous version: ICE in
> > generating the plain-SH2 libgcc-based shifts, missing
> > sh_legitimate_constant_p changes, and bad asm spec that broke
> > non-FDPIC. Cosmetic/style changes have not been made yet.
> 
> OK, I've got a few other points.

Thanks!

> > +  if (TARGET_FDPIC)
> > +    {
> > +      rtx a = force_reg (Pmode, plus_constant (Pmode, XEXP (tramp_mem, 0), 
> > 8));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 0), a);
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 4), 
> > OUR_FDPIC_REG);
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 8),
> > +                 gen_int_mode (TARGET_LITTLE_ENDIAN ? 0xd203d302 : 
> > 0xd302d203,
> > +                               SImode));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 12),
> > +                 gen_int_mode (TARGET_LITTLE_ENDIAN ? 0x5c216122 : 
> > 0x61225c21,
> > +                               SImode));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 16),
> > +                 gen_int_mode (TARGET_LITTLE_ENDIAN ? 0x0009412b : 
> > 0x412b0009,
> > +                               SImode));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 20), cxt);
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 24), fnaddr);
> > +    }
> > +  else
> > +    {
> > +      emit_move_insn (change_address (tramp_mem, SImode, NULL_RTX),
> > +                 gen_int_mode (TARGET_LITTLE_ENDIAN ? 0xd301d202 : 
> > 0xd202d301,
> > +                               SImode));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 4),
> > +                 gen_int_mode (TARGET_LITTLE_ENDIAN ? 0x0009422b : 
> > 0x422b0009,
> > +                               SImode));
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 8), cxt);
> > +      emit_move_insn (adjust_address (tramp_mem, SImode, 12), fnaddr);
> > +    }
> 
> I think this hunk really needs a comment.  It copies machine code from
> somewhere to somewhere via constant loads... but what exactly are the
> instructions ...

This is generating trampolines for nested functions. This portion of
the patch applied without modification from the old patch, so I didn't
read into it in any more detail; it seems to be the following, which
makes sense:

0:      .long 1f
        .long gotval
1:      mov.l 3f,r3
        mov.l 2f,r2
        mov.l @r2,r1
        mov.l @(4,r2),r12
        jmp @r1
        nop
3:      .long cxt
2:      .long fnaddr

The corresponding non-FDPIC version is:

        mov.l 3f,r3
        mov.l 2f,r2
        jmp @r2
        nop
3:      .long cxt
2:      .long fnaddr

Should these go into the source as comments?
        
> In the multiple alternative insn patterns ...
> 
> > -  "jsr     @%1%#"
> > +  "@
> > +   jsr     @%1%#
> > +   bsrf    %1\\n%O2:%#"
> 
> Please use the formatting as in the other parts of sh.md:
> "@
>       jsr     @%1%#
>       bsrf    %1\n%O2:%#"
> 
> (use tabs and I don't think the embedded newline needs double backslash,
> but please check)

I would think it does, but I've found in the RTL files sometimes extra
escaping is silently accepted, and I'm not sure if omitting it would
visibly break. Can I rely on it producing a visible error right away
if removing it is wrong, or do I need to search the gccint
documentation to figure out what the right way is?

> > +@item --enable-fdpic
> > +On SH Linux systems, generate ELF FDPIC code.
> 
> It should be "GNU/Linux" as far as I know.

I don't want to turn this into a political battle so we can go with
whatever is appropriate for upstream gcc. Note however that, at
present, the only targets this code is useful on are completely
non-GNU Linux (musl-based and not using any GNU userspace on the
target). uClibc may also work if someone digs up the old (untouched
since 2011) superh_fdpic branch.

The original patch said "On SH uClinux systems"; I just changed it to
"Linux" because there's no longer anything uClinux-specific about it.

> > A couple specific questions I have:
> > 
> > - Is the use of self specs (see DRIVER_SELF_SPECS in sh.h) an
> >   acceptable way to set the default? I brought this up before but
> >   don't think anyone answered. I find this method more clear and less
> >   invasive (doesn't require #ifdef FDPIC_DEFAULT all over the place)
> >   but if there's a policy reason this can't be done I can rework it.
> 
> This should be fine.  If there's a problem with that it can be changed
> later.  Kaz, do you have any opinion?
> 
> Still, maybe it's better ...
> 
> > mfdpic
> > Target Report Var(TARGET_FDPIC)
> > Generate ELF FDPIC code
> 
> .... to add an Init(0) to this new option.  Just in case.

By "better" you mean leaving the self-specs approach in-place but
explicitly initializing it to 0 with Init(0)? That sounds good to me.

> > - For the udiv_qrnnd inline asm, the current patch duplicates the asm
> >   with a minor change to dereference the function descriptor and get a
> >   code address. This could be done outside the asm (via type punning
> >   the function pointer) to slightly improve the resulting code and
> >   avoid duplicating the asm (a macro would be used to load the code
> >   address from the function pointer; this is identity macro on
> >   non-FDPIC and would do the type punning on FDPIC) but if this
> >   approach would be preferable I need some advice on the form of type
> >   punning that would be acceptable in GCC.
> 
> I think this is fine as it is.  udiv_qrnnd is probably not used very
> often, so most likely the compiler will generate the same code to do a
> constant pool load before the asm block.  If more such functions are
> introduced it might be worth doing it.

It can't generate the same code either way because, with the patch as
submitted, there's an extra load inside the asm. I would prefer
switching to an approach that avoids that (mainly to avoid the ugly
near-duplication of the asm block, but also to save a couple
instructions) but short of feedback on acceptable ways to do the
punning in the C++ I'll just leave it in the asm for now.

> > - For the Changelog, should I just edit the one from the original
> >   patch (https://gcc.gnu.org/ml/gcc-patches/2010-08/txt00148.txt)
> >   submitted against 4.5 and add myself to the list of patch authors?
> 
> I think a new ChangeLog entry is better, since the patch most likely
> will look quite different from the original.  You can use the original
> text as a source for inspiration.  Giving credit to the original authors
> would be nice I think.

OK. Actually I think the patch is a lot closer to the old one than you
think, or at least that's how it feels to me. But I don't mind working
through the whole new patch to make a better ChangeLog entry and just
using the old one as "source for inspiration".

Rich

Reply via email to