aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2015-08-06 15:57:36 +0000
committerJiong Wang <jiwang@gcc.gnu.org>2015-08-06 15:57:36 +0000
commitb60d63cbaee16a95790c09dd6c23e346639ee180 (patch)
tree16f181e588d7fcb32f7b08a951bff9bb47e12447 /gcc
parentc1153c1987ba906a8763a0c0de49fe2e6b3937f0 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64-protos.h1
-rw-r--r--gcc/config/aarch64/aarch64.c18
-rw-r--r--gcc/config/aarch64/aarch64.md6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/noplt_1.c15
-rw-r--r--gcc/testsuite/gcc.target/aarch64/noplt_2.c18
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 } } } */