aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/aarch64/aarch64-bti-insert.c32
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr94697.c19
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;
+}