diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-bti-insert.c | 32 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr94697.c | 19 |
4 files changed, 46 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e427c0..c806e5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-04-23 Szabolcs Nagy <szabolcs.nagy@arm.com> + + PR target/94697 + * config/aarch64/aarch64-bti-insert.c (rest_of_insert_bti): Swap + bti c and bti j handling. + 2020-04-23 Andrew Stubbs <ams@codesourcery.com> Thomas Schwinge <thomas@codesourcery.com> diff --git a/gcc/config/aarch64/aarch64-bti-insert.c b/gcc/config/aarch64/aarch64-bti-insert.c index 295d18a..aa091c3 100644 --- a/gcc/config/aarch64/aarch64-bti-insert.c +++ b/gcc/config/aarch64/aarch64-bti-insert.c @@ -132,22 +132,6 @@ rest_of_insert_bti (void) rtx_insn *insn; basic_block bb; - /* Since a Branch Target Exception can only be triggered by an indirect call, - we exempt function that are only called directly. We also exempt - functions that are already protected by Return Address Signing (PACIASP/ - PACIBSP). For all other cases insert a BTI C at the beginning of the - function. */ - if (!cgraph_node::get (cfun->decl)->only_called_directly_p ()) - { - bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; - insn = BB_HEAD (bb); - if (!aarch64_pac_insn_p (get_first_nonnote_insn ())) - { - bti_insn = gen_bti_c (); - emit_insn_before (bti_insn, insn); - } - } - bb = 0; FOR_EACH_BB_FN (bb, cfun) { @@ -203,6 +187,22 @@ rest_of_insert_bti (void) } } + /* Since a Branch Target Exception can only be triggered by an indirect call, + we exempt function that are only called directly. We also exempt + functions that are already protected by Return Address Signing (PACIASP/ + PACIBSP). For all other cases insert a BTI C at the beginning of the + function. */ + if (!cgraph_node::get (cfun->decl)->only_called_directly_p ()) + { + bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; + insn = BB_HEAD (bb); + if (!aarch64_pac_insn_p (get_first_nonnote_insn ())) + { + bti_insn = gen_bti_c (); + emit_insn_before (bti_insn, insn); + } + } + timevar_pop (TV_MACH_DEP); return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f5f020..15e7d9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-23 Szabolcs Nagy <szabolcs.nagy@arm.com> + + PR target/94697 + * gcc.target/aarch64/pr94697.c: New test. + 2020-04-23 Felix Yang <felix.yang@huawei.com> PR target/94678 diff --git a/gcc/testsuite/gcc.target/aarch64/pr94697.c b/gcc/testsuite/gcc.target/aarch64/pr94697.c new file mode 100644 index 0000000..e6069d2 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr94697.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbranch-protection=standard" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +void bar (int *); +void *addr; + +/* +** foo: +** hint (25|34|38) // (paciasp|bti c|bti jc) +** ... +*/ +int foo (int x) +{ +label: + addr = &&label; + bar (&x); + return x; +} |