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: Bernhard Reutner-Fischer <rep dot dot dot nop at gmail dot com>
- To: Sriraman Tallam <tmsriram at google dot com>
- Cc: ramrad01 at arm dot com,Ramana Radhakrishnan <ramana dot radhakrishnan at arm dot com>,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: Tue, 02 Jun 2015 23:18:08 +0200
- 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> <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> <CAAs8HmxB9NyJQHRxTLj4gKntDgwFfri0VvwSR6vfA1HDTpFHaQ at mail dot gmail dot com> <556C16B1 dot 5080606 at arm dot com> <CAAs8Hmy3jZDkE1hNmojx9rBBAZ9tjCYHXHevojMTAYHZ5kp8hA at mail dot gmail dot com> <CAJA7tRbHAHi7i1xboTZadrJLE_Ry628pwLot6f3wdK4KzawqCQ at mail dot gmail dot com> <CAAs8Hmy6gFfoKrVWJ2tCWQZ6Lkez2DCikWozVgwFcY-peDtOhw at mail dot gmail dot com> <CAJA7tRYUMvHt04m-+uM9irXRXC57iV9pP0jqQKoj9AJ+rwuo2g at mail dot gmail dot com> <CAAs8HmzcD4-t2bbxVL93PSU-1Mp-AZ=Qd-JN8mmjw6pC1Q+h9g at mail dot gmail dot com> <E7B625BD-C42E-4D36-B243-B49DA1F31FB1 at gmail dot com> <CAAs8HmwVab+rgGYbzCWSzTfJ36Cs9fYpQMPn8NfzZcu9eaOayA at mail dot gmail dot com>
On June 2, 2015 9:59:40 PM GMT+02:00, Sriraman Tallam <tmsriram@google.com> wrote:
>On Tue, Jun 2, 2015 at 12:32 PM, Bernhard Reutner-Fischer
><rep.dot.nop@gmail.com> wrote:
>> On June 2, 2015 8:15:42 PM GMT+02:00, Sriraman Tallam
><tmsriram@google.com> wrote:
>> []
>>
>>>I have now modified this patch.
>>>
>>>This patch does two things:
>>>
>>>1) Adds new generic function attribute "no_plt" that is similar in
>>>functionality to -fno-plt except that it applies only to calls to
>>>functions that are marked with this attribute.
>>>2) For x86_64, it makes -fno-plt(and the attribute) also work for
>>>non-PIC code by directly generating an indirect call via a GOT
>entry.
>>>
>>>For PIC code, no_plt merely shadows the implementation of -fno-plt,
>no
>>>surprises here.
>>>
>>>* c-family/c-common.c (no_plt): New attribute.
>>>(handle_no_plt_attribute): New handler.
>>>* calls.c (prepare_call_address): Check for no_plt
>>>attribute.
>>>* config/i386/i386.c (ix86_function_ok_for_sibcall): Check
>>>for no_plt attribute.
>>>(ix86_expand_call): Ditto.
>>>(nopic_no_plt_attribute): New function.
>>>(ix86_output_call_insn): Output indirect call for non-pic
>>>no plt calls.
>>>* doc/extend.texi (no_plt): Document new attribute.
>>>* testsuite/gcc.target/i386/noplt-1.c: New test.
>>>* testsuite/gcc.target/i386/noplt-2.c: New test.
>>>* testsuite/gcc.target/i386/noplt-3.c: New test.
>>>* testsuite/gcc.target/i386/noplt-4.c: New test.
>>>
>>>
>>>Please review.
>>
>> --- config/i386/i386.c (revision 223720)
>> +++ config/i386/i386.c (working copy)
>> @@ -5479,6 +5479,8 @@ ix86_function_ok_for_sibcall (tree decl, tree
>exp)
>> && !TARGET_64BIT
>> && flag_pic
>> && flag_plt
>> + && (TREE_CODE (decl) != FUNCTION_DECL
>> + || !lookup_attribute ("no_plt", DECL_ATTRIBUTES (decl)))
>> && decl && !targetm.binds_local_p (decl))
>> return false;
>>
>> Wrong order or && decl is redundant. Stopped reading here.
>
>Fixed and new patch
Just reading the diff I do not grok the different conditions in
ix86_function_ok_for_sibcall
ix86_expand_call
especially regarding CM_LARGE_PIC but I take it you've read more context.
- && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
+ && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0))
+ && flag_plt
s/! /!/;# while you touch or maybe that's OK -- check_GNU.sh would know, hopefully.
+/* Return true if the function being called was marked with attribute
+ "no_plt" or using -fno-plt and we are compiling for no-PIC and x86_64.
+ This is currently used only with 64-bit ELF targets to call the function
a function
+ marked "no_plt" indirectly. */
+
+static bool
+nopic_no_plt_attribute (rtx call_op)
IIRC predicates ought to have a _p suffix but maybe that's outdated nowadays?
+{
+ if (flag_pic)
+ return false;
+
+ if (!TARGET_64BIT || TARGET_MACHO|| TARGET_SEH || TARGET_PECOFF)
missing space after ||
We have a contrib/check*.sh style checker for patches in there.
+ return false;
+
+ 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
+ && (!flag_plt
+ || lookup_attribute ("no_plt", DECL_ATTRIBUTES (symbol_decl))))
+ return true;
+
+ return false;
+}
+@item no_plt
+@cindex @code{no_plt} function attribute
+The @code{no_plt} attribute is used to inform the compiler that a calls
Doesn't parse. a call / calls
+to the function should not use the PLT. For example, external functions
would be nice to have an xref to PLT definition for the casual reader, iff we have one or could have one easily.
+defined in shared objects are called from the executable using the PLT.
+This attribute on the function declaration calls these functions indirectly
+rather than going via the PLT. This is similar to @option{-fno-plt} but
+is only applicable to calls to the function marked with this attribute.
+
smallexample (or you-name-it counterpart) for code-avoidance for bonus points, maybe.
Not a conceptual review due to current cellphone-impairedness, but looks somewhat plausible at first glance..
HTH && cheers,