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: [RFC][PATCH][X86_64] Eliminate PLT stubs for specified external functions via -fno-plt=


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.

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

Attachment: noplt_attrib_patch.txt
Description: Text document


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