[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
This commit is contained in:
parent
c1153c1987
commit
b60d63cbae
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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")]
|
||||
)
|
||||
|
@ -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.
|
||||
|
15
gcc/testsuite/gcc.target/aarch64/noplt_1.c
Normal file
15
gcc/testsuite/gcc.target/aarch64/noplt_1.c
Normal file
@ -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 } } } */
|
18
gcc/testsuite/gcc.target/aarch64/noplt_2.c
Normal file
18
gcc/testsuite/gcc.target/aarch64/noplt_2.c
Normal file
@ -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 } } } */
|
Loading…
Reference in New Issue
Block a user