This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2] SH FDPIC backend support


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.

> +  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 ...

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)


> +@item --enable-fdpic
> +On SH Linux systems, generate ELF FDPIC code.

It should be "GNU/Linux" as far as I know.

> 
> 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.

> - 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.

> - 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.

Cheers,
Oleg



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]