aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-05-21 12:45:47 +0200
committerMartin Liska <mliska@suse.cz>2020-05-21 12:46:23 +0200
commit9e02b45ffc60e0078bde3c56a14f00c54b7f8039 (patch)
tree30a5b984ae4b8c782d9a111a889ac13cdfd9c89b /gcc
parent62b5b53e94dc0314d86d9729733b0c65dff3b53e (diff)
downloadgcc-9e02b45ffc60e0078bde3c56a14f00c54b7f8039.zip
gcc-9e02b45ffc60e0078bde3c56a14f00c54b7f8039.tar.gz
gcc-9e02b45ffc60e0078bde3c56a14f00c54b7f8039.tar.bz2
Add outline-atomics to target attribute.
* common/config/aarch64/aarch64-common.c (aarch64_handle_option): Handle OPT_moutline_atomics. * config/aarch64/aarch64.c: Add outline-atomics to aarch64_attributes. * doc/extend.texi: Document the newly added target attribute. * gcc.target/aarch64/target_attr_20.c: New test. * gcc.target/aarch64/target_attr_21.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/common/config/aarch64/aarch64-common.c4
-rw-r--r--gcc/config/aarch64/aarch64.c2
-rw-r--r--gcc/doc/extend.texi6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/target_attr_20.c27
-rw-r--r--gcc/testsuite/gcc.target/aarch64/target_attr_21.c27
7 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b97e8ea..d48fbfc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2020-05-21 Martin Liska <mliska@suse.cz>
+
+ * common/config/aarch64/aarch64-common.c (aarch64_handle_option):
+ Handle OPT_moutline_atomics.
+ * config/aarch64/aarch64.c: Add outline-atomics to
+ aarch64_attributes.
+ * doc/extend.texi: Document the newly added target attribute.
+
2020-05-21 Uroš Bizjak <ubizjak@gmail.com>
PR target/95218
diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c
index 0bddcc8..51bd319 100644
--- a/gcc/common/config/aarch64/aarch64-common.c
+++ b/gcc/common/config/aarch64/aarch64-common.c
@@ -116,6 +116,10 @@ aarch64_handle_option (struct gcc_options *opts,
opts->x_flag_omit_leaf_frame_pointer = val;
return true;
+ case OPT_moutline_atomics:
+ opts->x_aarch64_flag_outline_atomics = val;
+ return true;
+
default:
return true;
}
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 79c016f..78db0a5 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -15266,6 +15266,8 @@ static const struct aarch64_attribute_info aarch64_attributes[] =
aarch64_handle_attr_branch_protection, OPT_mbranch_protection_ },
{ "sign-return-address", aarch64_attr_enum, false, NULL,
OPT_msign_return_address_ },
+ { "outline-atomics", aarch64_attr_bool, true, NULL,
+ OPT_moutline_atomics},
{ NULL, aarch64_attr_custom, false, NULL, OPT____ }
};
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index c80848e..a2ebef8 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -4066,6 +4066,12 @@ Select the function scope on which branch protection will be applied. The
behavior and permissible arguments are the same as for the command-line option
@option{-mbranch-protection=}. The default value is @code{none}.
+@item outline-atomics
+@cindex @code{outline-atomics} function attribute, AArch64
+Enable or disable calls to out-of-line helpers to implement atomic operations.
+This corresponds to the behavior of the command line options
+@option{-moutline-atomics} and @option{-mno-outline-atomics}.
+
@end table
The above target attributes can be specified as follows:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 85f73e4..3940cfd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-21 Martin Liska <mliska@suse.cz>
+
+ * gcc.target/aarch64/target_attr_20.c: New test.
+ * gcc.target/aarch64/target_attr_21.c: New test.
+
2020-05-20 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* g++.dg/warn/Wconversion-null-2.C: Add explicit declarations for l()
diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_20.c b/gcc/testsuite/gcc.target/aarch64/target_attr_20.c
new file mode 100644
index 0000000..509fb03
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/target_attr_20.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv8-a+nolse -moutline-atomics" } */
+
+int b, c, d, e, f, h;
+short g;
+int foo (int) __attribute__ ((__const__));
+
+__attribute__ ((target ("no-outline-atomics")))
+void
+bar (void)
+{
+ while (1)
+ {
+ while (1)
+ {
+ __atomic_load_n (&e, 0);
+ if (foo (2))
+ __sync_val_compare_and_swap (&c, 0, f);
+ b = 1;
+ if (h == e)
+ break;
+ }
+ __sync_val_compare_and_swap (&g, -1, f);
+ }
+}
+
+/* { dg-final { scan-assembler-not "bl.*__aarch64_cas2_acq_rel" } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_21.c b/gcc/testsuite/gcc.target/aarch64/target_attr_21.c
new file mode 100644
index 0000000..acace4c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/target_attr_21.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv8-a+nolse -mno-outline-atomics" } */
+
+int b, c, d, e, f, h;
+short g;
+int foo (int) __attribute__ ((__const__));
+
+__attribute__ ((target ("outline-atomics")))
+void
+bar (void)
+{
+ while (1)
+ {
+ while (1)
+ {
+ __atomic_load_n (&e, 0);
+ if (foo (2))
+ __sync_val_compare_and_swap (&c, 0, f);
+ b = 1;
+ if (h == e)
+ break;
+ }
+ __sync_val_compare_and_swap (&g, -1, f);
+ }
+}
+
+/* { dg-final { scan-assembler-times "bl.*__aarch64_cas2_acq_rel" 1 } } */