Commit b60d63cb by Jiong Wang Committed by Jiong Wang

[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
parent c1153c19
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> 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com>
* tree-vect-patterns.c (vect_recog_mult_pattern): New function * tree-vect-patterns.c (vect_recog_mult_pattern): New function
......
...@@ -258,6 +258,7 @@ bool aarch64_handle_option (struct gcc_options *, struct gcc_options *, ...@@ -258,6 +258,7 @@ bool aarch64_handle_option (struct gcc_options *, struct gcc_options *,
const struct cl_decoded_option *, location_t); const struct cl_decoded_option *, location_t);
bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx); bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx);
bool aarch64_is_long_call_p (rtx); bool aarch64_is_long_call_p (rtx);
bool aarch64_is_noplt_call_p (rtx);
bool aarch64_label_mentioned_p (rtx); bool aarch64_label_mentioned_p (rtx);
void aarch64_declare_function_name (FILE *, const char*, tree); void aarch64_declare_function_name (FILE *, const char*, tree);
bool aarch64_legitimate_pic_operand_p (rtx); bool aarch64_legitimate_pic_operand_p (rtx);
......
...@@ -744,6 +744,24 @@ aarch64_is_long_call_p (rtx sym) ...@@ -744,6 +744,24 @@ aarch64_is_long_call_p (rtx sym)
return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (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 /* Return true if the offsets to a zero/sign-extract operation
represent an expression that matches an extend operation. The represent an expression that matches an extend operation. The
operands represent the paramters from operands represent the paramters from
......
...@@ -603,7 +603,8 @@ ...@@ -603,7 +603,8 @@
(use (match_operand 2 "" "")) (use (match_operand 2 "" ""))
(clobber (reg:DI LR_REGNUM))] (clobber (reg:DI LR_REGNUM))]
"GET_CODE (operands[0]) == SYMBOL_REF "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" "bl\\t%a0"
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
...@@ -665,7 +666,8 @@ ...@@ -665,7 +666,8 @@
(use (match_operand 3 "" "")) (use (match_operand 3 "" ""))
(clobber (reg:DI LR_REGNUM))] (clobber (reg:DI LR_REGNUM))]
"GET_CODE (operands[1]) == SYMBOL_REF "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" "bl\\t%a1"
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
......
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> 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com>
* gcc.dg/vect/vect-mult-pattern-1.c: New test. * gcc.dg/vect/vect-mult-pattern-1.c: New test.
......
/* { 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 } } } */
/* { 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 } } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment