diff options
author | Jiong Wang <jiong.wang@arm.com> | 2015-08-06 15:57:36 +0000 |
---|---|---|
committer | Jiong Wang <jiwang@gcc.gnu.org> | 2015-08-06 15:57:36 +0000 |
commit | b60d63cbaee16a95790c09dd6c23e346639ee180 (patch) | |
tree | 16f181e588d7fcb32f7b08a951bff9bb47e12447 /gcc | |
parent | c1153c1987ba906a8763a0c0de49fe2e6b3937f0 (diff) | |
download | gcc-b60d63cbaee16a95790c09dd6c23e346639ee180.zip gcc-b60d63cbaee16a95790c09dd6c23e346639ee180.tar.gz gcc-b60d63cbaee16a95790c09dd6c23e346639ee180.tar.bz2 |
[AArch64] Tighten direct call pattern to repair -fno-plt
2015-08-06 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): Likewise.
gcc/testsuite/
* gcc.target/aarch64/noplt_1.c: New testcase.
* gcc.target/aarch64/noplt_2.c: Likewise.
From-SVN: r226681
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 18 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/noplt_1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/noplt_2.c | 18 |
7 files changed, 68 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 43df172..2b364ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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. + (call_symbol): Likewise. + 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com> * tree-vect-patterns.c (vect_recog_mult_pattern): New function diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 5d8902f..32b5d09 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -258,6 +258,7 @@ bool aarch64_handle_option (struct gcc_options *, struct gcc_options *, const struct cl_decoded_option *, location_t); bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx); bool aarch64_is_long_call_p (rtx); +bool aarch64_is_noplt_call_p (rtx); bool aarch64_label_mentioned_p (rtx); void aarch64_declare_function_name (FILE *, const char*, tree); bool aarch64_legitimate_pic_operand_p (rtx); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 1394ed7..e991a49 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -744,6 +744,24 @@ aarch64_is_long_call_p (rtx sym) return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (sym)); } +/* Return true if calls to symbol-ref SYM should not go through + plt stubs. */ + +bool +aarch64_is_noplt_call_p (rtx sym) +{ + const_tree decl = SYMBOL_REF_DECL (sym); + + if (flag_pic + && decl + && (!flag_plt + || lookup_attribute ("noplt", DECL_ATTRIBUTES (decl))) + && !targetm.binds_local_p (decl)) + return true; + + return false; +} + /* Return true if the offsets to a zero/sign-extract operation represent an expression that matches an extend operation. The operands represent the paramters from diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index b7b04c4..7f99753 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -603,7 +603,8 @@ (use (match_operand 2 "" "")) (clobber (reg:DI LR_REGNUM))] "GET_CODE (operands[0]) == SYMBOL_REF - && !aarch64_is_long_call_p (operands[0])" + && !aarch64_is_long_call_p (operands[0]) + && !aarch64_is_noplt_call_p (operands[0])" "bl\\t%a0" [(set_attr "type" "call")] ) @@ -665,7 +666,8 @@ (use (match_operand 3 "" "")) (clobber (reg:DI LR_REGNUM))] "GET_CODE (operands[1]) == SYMBOL_REF - && !aarch64_is_long_call_p (operands[1])" + && !aarch64_is_long_call_p (operands[1]) + && !aarch64_is_noplt_call_p (operands[1])" "bl\\t%a1" [(set_attr "type" "call")] ) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76afd8e..fb3bf07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-06 Jiong Wang <jiong.wang@arm.com> + + * gcc.target/aarch64/noplt_1.c: New testcase. + * gcc.target/aarch64/noplt_2.c: Likewise. + 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com> * gcc.dg/vect/vect-mult-pattern-1.c: New test. diff --git a/gcc/testsuite/gcc.target/aarch64/noplt_1.c b/gcc/testsuite/gcc.target/aarch64/noplt_1.c new file mode 100644 index 0000000..4e9bb62 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/noplt_1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fpic -fno-plt" } */ +/* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* } { "-mcmodel=large" } { "" } } */ + +int* bar (void) ; + +int +foo (int a) +{ + int *b = bar (); + return b[a]; +} + +/* { dg-final { scan-assembler "#:got:" { target { aarch64_tiny || aarch64_small } } } } */ +/* { dg-final { scan-assembler "#:got_lo12:" { target aarch64_small } } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/noplt_2.c b/gcc/testsuite/gcc.target/aarch64/noplt_2.c new file mode 100644 index 0000000..718999b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/noplt_2.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fpic" } */ +/* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* } { "-mcmodel=large" } { "" } } */ + +__attribute__ ((noplt)) +int* bar0 (void) ; +int* bar1 (void) ; + +int +foo (int a) +{ + int *b0 = bar0 (); + int *b1 = bar1 (); + return b0[a] + b1[a]; +} + +/* { dg-final { scan-assembler-times "#:got:" 1 { target { aarch64_tiny || aarch64_small } } } } */ +/* { dg-final { scan-assembler-times "#:got_lo12:" 1 { target aarch64_small } } } */ |