On 06/03/2015 11:38 AM, Sriraman Tallam wrote: > + { "no_plt", 0, 0, true, false, false, > + handle_no_plt_attribute, false },
Call it noplt. We don't add the underscore for noinline, noclone, etc. > Index: config/i386/i386.c > =================================================================== > --- config/i386/i386.c (revision 223720) > +++ config/i386/i386.c (working copy) > @@ -5479,7 +5479,10 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) > && !TARGET_64BIT > && flag_pic > && flag_plt > - && decl && !targetm.binds_local_p (decl)) > + && decl > + && (TREE_CODE (decl) != FUNCTION_DECL > + || !lookup_attribute ("no_plt", DECL_ATTRIBUTES (decl))) > + && !targetm.binds_local_p (decl)) > return false; > > /* If we need to align the outgoing stack, then sibcalling would Is this really necessary? I'd expect DECL to be NULL in this case, since the non-use of the PLT will mean that the (sib)call is indirect. > @@ -25497,13 +25500,19 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx call > } > else > { > - /* Static functions and indirect calls don't need the pic register. */ > + /* Static functions and indirect calls don't need the pic register. > Also, > + check if PLT was explicitly avoided via no-plt or "no_plt" attribute, > making > + it an indirect call. */ > 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))) > + && !SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)) > + && flag_plt > + && (TREE_CODE (SYMBOL_REF_DECL (XEXP(fnaddr, 0))) != FUNCTION_DECL > + || !lookup_attribute ("no_plt", > + DECL_ATTRIBUTES (SYMBOL_REF_DECL (XEXP(fnaddr, 0)))))) > { > use_reg (&use, gen_rtx_REG (Pmode, REAL_PIC_OFFSET_TABLE_REGNUM)); > if (ix86_use_pseudo_pic_reg ()) Why are you testing FUNCTION_DECL? Even if, somehow, the user were producing a function call to a data symbol, why do you think that lookup_attribute would produce incorrect results? Similarly in ix86_nopic_no_plt_attribute_p. r~