From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 51938 invoked by alias); 29 May 2015 17:20:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 51916 invoked by uid 89); 29 May 2015 17:20:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mail-vn0-f53.google.com Received: from mail-vn0-f53.google.com (HELO mail-vn0-f53.google.com) (209.85.216.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 29 May 2015 17:20:26 +0000 Received: by vnbf1 with SMTP id f1so8953504vnb.6 for ; Fri, 29 May 2015 10:20:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=Wx9myxFLoZk4qQDasIlCtN6Bl7pFzQclotdZ5vqicbs=; b=KULYQfNSTve9WFN+TN2O7RwBb8Sc/9thL5xhpOePmRY1decWgLmPGx+2jjAxhm0zCW DpJIW4F0Blww56/2Ksl9EMomghbm1BWlznnlsD/U+fiiyCssGN2BK0goDJ0eMfOVmb/I bAgSyEFgTpsq9LT+3/VzaNKFov1X81/PP7aMIx4qSjcIRzQAAlXbRqh5wBjOadYFWLpj Iquzv1sQyijdSsUqg8LfmAMKcNXaW8k0ZmQ87nuzX6qd/7brS5sfvu2OBGPLDHIykouh 5B2tUdDgY8hPpGNKvtC2f2KbEnQWLlibNUkr3UCLv/ibZQUpyToLyyHykGytNQWrikb7 cGyQ== X-Gm-Message-State: ALoCoQkhqt/+qUiGJjrjtnyhllbdCyKdZuAkTv1A5DpfVT7lX0AUejhXiDE2BCrkYAWetnW8FNBL MIME-Version: 1.0 X-Received: by 10.52.231.102 with SMTP id tf6mr8060177vdc.47.1432920023236; Fri, 29 May 2015 10:20:23 -0700 (PDT) Received: by 10.52.229.196 with HTTP; Fri, 29 May 2015 10:20:22 -0700 (PDT) In-Reply-To: References: <555E5376.3060706@redhat.com> <555EF018.2050309@redhat.com> Date: Fri, 29 May 2015 17:36:00 -0000 Message-ID: Subject: Re: [RFC][PATCH][X86_64] Eliminate PLT stubs for specified external functions via -fno-plt= From: Sriraman Tallam To: "H.J. Lu" Cc: Pedro Alves , Michael Matz , David Li , GCC Patches , Jan Hubicka Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2015-05/txt/msg02809.txt.bz2 Hi HJ, Is this ok to commit? Thanks Sri On Thu, May 28, 2015 at 11:03 PM, Sriraman Tallam wrote: > On Thu, May 28, 2015 at 5:05 PM, H.J. Lu wrote: >> On Thu, May 28, 2015 at 4:54 PM, Sriraman Tallam wrote: >>> On Thu, May 28, 2015 at 2:52 PM, H.J. Lu wrote: >>>> On Thu, May 28, 2015 at 2:27 PM, Sriraman Tallam wrote: >>>>> On Thu, May 28, 2015 at 2:01 PM, H.J. Lu wrote: >>>>>> On Thu, May 28, 2015 at 1:54 PM, Sriraman Tallam wrote: >>>>>>> On Thu, May 28, 2015 at 12:05 PM, H.J. Lu wrote: >>>>>>>> On Thu, May 28, 2015 at 11:50 AM, Sriraman Tallam wrote: >>>>>>>>> On Thu, May 28, 2015 at 11:42 AM, H.J. Lu wrote: >>>>>>>>>> On Thu, May 28, 2015 at 11:34 AM, Sriraman Tallam 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.