This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[COMMITTED][AArch64][sibcall]Tighten direct call pattern to repair -fno-plt
- From: Jiong Wang <jiong dot wang at arm dot com>
- To: James Greenhalgh <james dot greenhalgh at arm dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>, Alexander Monakov <amonakov at ispras dot ru>
- Date: Thu, 06 Aug 2015 17:16:33 +0100
- Subject: [COMMITTED][AArch64][sibcall]Tighten direct call pattern to repair -fno-plt
- Authentication-results: sourceware.org; auth=none
- References: <1430757479-14241-1-git-send-email-amonakov at ispras dot ru> <1430757479-14241-6-git-send-email-amonakov at ispras dot ru> <55882EEB dot 7060207 at arm dot com> <alpine dot LNX dot 2 dot 11 dot 1506221927270 dot 5505 at monopod dot intra dot ispras dot ru> <CAJA7tRZ8zcTz_WjghszxVe7ZPCTA1G0xMP5oakM4iGGik=PJzg at mail dot gmail dot com> <55895E77 dot 6080305 at redhat dot com> <n99twt4h01d dot fsf at arm dot com> <alpine dot LNX dot 2 dot 20 dot 1507161335370 dot 26652 at monopod dot intra dot ispras dot ru> <n99si8ogzb2 dot fsf at arm dot com> <n997fpthe4g dot fsf at arm dot com> <20150804095033 dot GC12175 at arm dot com>
James Greenhalgh writes:
> On Tue, Jul 21, 2015 at 01:42:35PM +0100, Jiong Wang wrote:
>>
>> Jiong Wang writes:
>>
>> > Alexander Monakov writes:
>> >
>> >>> Attachment is the patch which repair -fno-plt support for AArch64.
>> >>>
>> >>> aarch64_is_noplt_call_p will only be true if:
>> >>>
>> >>> * gcc is generating position independent code.
>> >>> * function symbol has declaration.
>> >>> * either -fno-plt or "(no_plt)" attribute specified.
>> >>> * it's a external function.
>> >>>
>> >>> OK for trunk?
>> >>>
>> >>> 2015-07-16 Jiong Wang <jiong.wang@arm.com>
>> >>>
>> >>> gcc/
>> >>> * config/aarch64/aarch64-protos.h (aarch64_is_noplt_call_p): New
>> >>> declaration.
>> >>> * config/aarch64/aarch64.c (aarch64_is_noplt_call_p): New function.
>> >>> * config/aarch64/aarch64.md (call_value_symbol): Check noplt
>> >>> scenarios.
>> >>> (call_symbol): Ditto.
>> >>
>> >> Shouldn't the same treatment be applied to tailcall (sibcall_{,value_}symbol)
>> >> patterns? I guess it could be done as a followup patch, but would be nice if
>> >> that isn't forgotten.
>> >
>> > Thanks for the remaind, that will be done as a followup patch.
>>
>> Patch attached.
>>
>> Added one more restriction to "Usf" constraint which is used by sibcall
>> pattern when matching direct call.
>>
>> given example like
>>
>> void
>> cal_novalue (int a)
>> {
>> dec (a);
>> }
>>
>> when -fpic -fno-plt specified we now generate:
>>
>> cal:
>> adrp x1, :got:dec
>> ldr x1, [x1, #:got_lo12:dec]
>> br x1
>>
>> instead of:
>>
>> cal:
>> b dec
>
> OK.
>
> Thanks,
> James
>
Committed the following patch which done minor adjustments so the
testcases can work well on any of tiny, small, large model.
Thanks.
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog (revision 226681)
+++ gcc/ChangeLog (working copy)
@@ -1,5 +1,10 @@
2015-08-06 Jiong Wang <jiong.wang@arm.com>
+ * config/aarch64/constraints.md (Usf): Add the test of
+ aarch64_is_noplt_call_p.
+
+2015-08-06 Jiong Wang <jiong.wang@arm.com>
+
* config/aarch64/aarch64-protos.h (aarch64_is_noplt_call_p): New declaration.
* config/aarch64/aarch64.c (aarch64_is_noplt_call_p): New function.
* config/aarch64/aarch64.md (call_value_symbol): Check noplt scenarios.
Index: gcc/config/aarch64/constraints.md
===================================================================
--- gcc/config/aarch64/constraints.md (revision 226680)
+++ gcc/config/aarch64/constraints.md (working copy)
@@ -101,8 +101,9 @@
(match_test "(unsigned HOST_WIDE_INT) ival < 64")))
(define_constraint "Usf"
- "@internal Usf is a symbol reference."
- (match_code "symbol_ref"))
+ "@internal Usf is a symbol reference under the context where plt stub allowed."
+ (and (match_code "symbol_ref")
+ (match_test "!aarch64_is_noplt_call_p (op)")))
(define_constraint "UsM"
"@internal
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (revision 226681)
+++ gcc/testsuite/ChangeLog (working copy)
@@ -1,5 +1,9 @@
2015-08-06 Jiong Wang <jiong.wang@arm.com>
+ * gcc.target/aarch64/noplt_3.c: New testcase.
+
+2015-08-06 Jiong Wang <jiong.wang@arm.com>
+
* gcc.target/aarch64/noplt_1.c: New testcase.
* gcc.target/aarch64/noplt_2.c: Likewise.
Index: gcc/testsuite/gcc.target/aarch64/noplt_3.c
===================================================================
--- gcc/testsuite/gcc.target/aarch64/noplt_3.c (revision 0)
+++ gcc/testsuite/gcc.target/aarch64/noplt_3.c (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic -fno-plt" } */
+/* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* } { "-mcmodel=large" } { "" } } */
+
+int dec (int);
+
+int
+cal (int a)
+{
+ return dec (a);
+}
+
+void
+cal_novalue (int a)
+{
+ dec (a);
+}
+
+/* { dg-final { scan-assembler-times "#:got:" 2 { target { aarch64_tiny || aarch64_small } } } } */
+/* { dg-final { scan-assembler-times "#:got_lo12:" 2 { target aarch64_small } } } */