This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC][PATCH][X86_64] Eliminate PLT stubs for specified external functions via -fno-plt=
- From: Sriraman Tallam <tmsriram at google dot com>
- To: ramrad01 at arm dot com
- Cc: Jan Hubicka <hubicka at ucw dot cz>, "H.J. Lu" <hjl dot tools at gmail dot com>, Pedro Alves <palves at redhat dot com>, Michael Matz <matz at suse dot de>, David Li <davidxl at google dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 29 May 2015 16:36:04 -0700
- Subject: Re: [RFC][PATCH][X86_64] Eliminate PLT stubs for specified external functions via -fno-plt=
- Authentication-results: sourceware.org; auth=none
- References: <CAMe9rOrCh++A=jLOcDVXGM+UOyn31kuJ+R5ZmZkw8E_eHmCTHQ at mail dot gmail dot com> <CAAs8Hmyd1+8k2t=4OD+FHRiomcfg-S_s_nA71+95--pw9L73Lg at mail dot gmail dot com> <CAMe9rOpcWnZv7yqyG6TeL_RtDochw6_ar_=7RKoAqv1ZzkTwLA at mail dot gmail dot com> <CAAs8Hmy0ymq=396N9i5=Z6u8B4+9d5u07nk=D14MwJMXNxCuCA at mail dot gmail dot com> <CAMe9rOpsMtTL-muZpND3DiS60bLXsCVgeTW6sF4a0DHmNE83+g at mail dot gmail dot com> <CAAs8HmzRQ2PtOXyV3_5XBr2ASPqZUnnDj4xEX8OqhuPB3L4HxA at mail dot gmail dot com> <CAMe9rOog3XBDjP9FAiLFCP7A-ir9LxBWmpcyG07+-h9hp7EjNQ at mail dot gmail dot com> <CAAs8HmzkXkP261DGZiBGpwobSDaeBHZ-oosz_k3OXD4ycjGVJA at mail dot gmail dot com> <CAMe9rOqVHuFbddkdKrkn1zaA9ASvT76sTn3enKcYo6K_4_Z77Q at mail dot gmail dot com> <CAAs8HmzRztBefZKx7KoB2LwvVWydRXDDdrw5FnexcphvXPR7gQ at mail dot gmail dot com> <20150529193552 dot GA52215 at kam dot mff dot cuni dot cz> <CAAs8Hmxg2a77HdJuedSkO8EkfROvSx_V2VOcZtWUAEiXLC3G6g at mail dot gmail dot com> <CAJA7tRYsMiq7rx34c=z6KwRdwYxxaeP6Z6qzA4XEwnJSMT7z=Q at mail dot gmail dot com>
On Fri, May 29, 2015 at 3:24 PM, Ramana Radhakrishnan
<ramana.gcc@googlemail.com> wrote:
>
>
> On Friday, 29 May 2015, Sriraman Tallam <tmsriram@google.com> wrote:
>>
>> On Fri, May 29, 2015 at 12:35 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> >> * config/i386/i386.c (avoid_plt_to_call): New function.
>> >> (ix86_output_call_insn): Generate indirect call for functions
>> >> marked with "noplt" attribute.
>> >> (attribute_spec ix86_attribute_): Define new attribute "noplt".
>> >> * doc/extend.texi: Document new attribute "noplt".
>> >> * gcc.target/i386/noplt-1.c: New testcase.
>> >> * gcc.target/i386/noplt-2.c: New testcase.
>> >>
>> >> Index: config/i386/i386.c
>> >> ===================================================================
>> >> --- config/i386/i386.c (revision 223720)
>> >> +++ config/i386/i386.c (working copy)
>> >> @@ -25599,6 +25599,24 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx
>> >> call
>> >> return call;
>> >> }
>> >>
>> >> +/* Return true if the function being called was marked with attribute
>> >> + "noplt". If this function is defined, this should return false.
>> >> */
>> >> +static bool
>> >> +avoid_plt_to_call (rtx call_op)
>> >> +{
>> >> + if (SYMBOL_REF_LOCAL_P (call_op))
>> >> + return false;
>> >> +
>> >> + tree symbol_decl = SYMBOL_REF_DECL (call_op);
>> >> +
>> >> + if (symbol_decl != NULL_TREE
>> >> + && TREE_CODE (symbol_decl) == FUNCTION_DECL
>> >> + && lookup_attribute ("noplt", DECL_ATTRIBUTES (symbol_decl)))
>> >> + return true;
>> >> +
>> >> + return false;
>> >> +}
>> >
>> > OK, now we have __attribute__ (optimize("noplt")) which binds to the
>> > caller and makes
>> > all calls in the function to skip PLT and __attribute__ ("noplt") which
>> > binds to callee
>> > and makes all calls to function to not use PLT.
>> >
>> > That sort of makes sense to me, but why "noplt" attribute is not
>> > implemented at generic level
>> > just like -fplt? Is it only because every target supporting PLT would
>> > need update in its
>> > call expansion patterns?
>>
>> Yes, that is what I had in mind.
>>
>
>
> Why isn't it just an indirect call in the cases that would require a GOT
> slot and a direct call otherwise ? I'm trying to work out what's so
> different on each target that mandates this to be in the target backend.
> Also it would be better to push the tests into gcc.dg if you can and check
> for the absence of a relocation so that folks at least see these as being
> UNSUPPORTED on their target.
I am not familiar with PLT calls for other targets. I can move the
tests to gcc.dg but what relocation are you suggesting I check for?
Thanks
Sri
>
>
>
> Ramana
>>
>> >
>> > Also I think the PLT calls have EBX in call fusage wich is added by
>> > ix86_expand_call.
>> > else
>> > {
>> > /* Static functions and indirect calls don't need the pic
>> > register. */
>> > if (flag_pic
>> > && (!TARGET_64BIT
>> > || (ix86_cmodel == CM_LARGE_PIC
>> > && DEFAULT_ABI != MS_ABI))
>> > && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
>> > && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
>> > {
>> > use_reg (&use, gen_rtx_REG (Pmode,
>> > REAL_PIC_OFFSET_TABLE_REGNUM));
>> > if (ix86_use_pseudo_pic_reg ())
>> > emit_move_insn (gen_rtx_REG (Pmode,
>> > REAL_PIC_OFFSET_TABLE_REGNUM),
>> > pic_offset_table_rtx);
>> > }
>> >
>> > I think you want to take that away from FUSAGE there just like we do for
>> > local calls
>> > (and in fact the code should already check flag_pic && flag_plt I
>> > suppose.
>>
>> Done that now and patch attached.
>>
>> Thanks
>> Sri
>>
>> >
>> > Honza