Hi HJ, Is this ok to commit?
Thanks Sri On Thu, May 28, 2015 at 11:03 PM, Sriraman Tallam <tmsri...@google.com> wrote: > On Thu, May 28, 2015 at 5:05 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Thu, May 28, 2015 at 4:54 PM, Sriraman Tallam <tmsri...@google.com> wrote: >>> On Thu, May 28, 2015 at 2:52 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Thu, May 28, 2015 at 2:27 PM, Sriraman Tallam <tmsri...@google.com> >>>> wrote: >>>>> On Thu, May 28, 2015 at 2:01 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>> On Thu, May 28, 2015 at 1:54 PM, Sriraman Tallam <tmsri...@google.com> >>>>>> wrote: >>>>>>> On Thu, May 28, 2015 at 12:05 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>> On Thu, May 28, 2015 at 11:50 AM, Sriraman Tallam >>>>>>>> <tmsri...@google.com> wrote: >>>>>>>>> On Thu, May 28, 2015 at 11:42 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>>>> On Thu, May 28, 2015 at 11:34 AM, Sriraman Tallam >>>>>>>>>> <tmsri...@google.com> wrote: >>>>>>>>>>> I have attached a patch that adds the new attribute "noplt". >>>>>>>>>>> Please review. >>>>>>>>>>> >>>>>>>>>>> * 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. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2 comments: >>>>>>>>>> >>>>>>>>>> 1. Don't remove "%!" prefix before call/jmp. It is needed for MPX. >>>>>>>>>> 2. Don't you need to check >>>>>>>>>> >>>>>>>>>> && !TARGET_MACHO >>>>>>>>>> && !TARGET_SEH >>>>>>>>>> && !TARGET_PECOFF >>>>>>>>>> >>>>>>>>>> since it only works for ELF. >>>>>>>>> >>>>>>>>> Ok, I will make this change. OTOH, is it just better to piggy-back on >>>>>>>>> existing -fno-plt change by Alex in calls.c >>>>>>>>> and do this: >>>>>>>>> >>>>>>>>> Index: calls.c >>>>>>>>> =================================================================== >>>>>>>>> --- calls.c (revision 223720) >>>>>>>>> +++ calls.c (working copy) >>>>>>>>> @@ -226,9 +226,11 @@ prepare_call_address (tree fndecl_or_type, rtx >>>>>>>>> fun >>>>>>>>> && targetm.small_register_classes_for_mode_p (FUNCTION_MODE)) >>>>>>>>> ? force_not_mem (memory_address (FUNCTION_MODE, funexp)) >>>>>>>>> : memory_address (FUNCTION_MODE, funexp)); >>>>>>>>> - else if (flag_pic && !flag_plt && fndecl_or_type >>>>>>>>> + else if (fndecl_or_type >>>>>>>>> && TREE_CODE (fndecl_or_type) == FUNCTION_DECL >>>>>>>>> - && !targetm.binds_local_p (fndecl_or_type)) >>>>>>>>> + && !targetm.binds_local_p (fndecl_or_type) >>>>>>>>> + && ((flag_pic && !flag_plt) >>>>>>>>> + || (lookup_attribute ("noplt", >>>>>>>>> DECL_ATTRIBUTES(fndecl_or_type))))) >>>>>>>>> { >>>>>>>>> funexp = force_reg (Pmode, funexp); >>>>>>>>> } >>>>>>>>> >>>>>>>> >>>>>>>> Does it work on non-PIC calls? >>>>>>> >>>>>>> You are right, it doesnt work. I have attached the patch with the >>>>>>> changes you mentioned. >>>>>>> >>>>>> >>>>>> Since direct_p is true, do wee need >>>>>> >>>>>> + if (GET_CODE (call_op) != SYMBOL_REF >>>>>> + || SYMBOL_REF_LOCAL_P (call_op)) >>>>>> + return false; >>>>> >>>>> We do need it right because for this case below, I do not want an >>>>> indirect call: >>>>> >>>>> __attribute__((noplt)) >>>>> int foo() { >>>>> return 0; >>>>> } >>>>> >>>>> int main() >>>>> { >>>>> return foo(); >>>>> } >>>>> >>>>> Assuming foo is not inlined, if I remove the lines you mentioned, I >>>>> will get an indirect call which is unnecessary. >>>>> >>>> >>>> I meant the "GET_CODE (call_op) != SYMBOL_REF" part isn't >>>> needed. >>> >>> I should have realized that :), sorry. Patch fixed. >>> >> >> --- testsuite/gcc.target/i386/noplt-1.c (revision 0) >> +++ testsuite/gcc.target/i386/noplt-1.c (working copy) >> @@ -0,0 +1,13 @@ >> +/* { dg-do compile { target x86_64-*-* } } */ >> ... >> +/* { dg-final { scan-assembler "call\[ >> \t\]\\*.*foo.*@GOTPCREL\\(%rip\\)" } } */ >> >> The test will fail on Windows and Darwin. > > Changed to use x86_64-*-linux* target. > >> >> >> -- >> H.J.