aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2016-04-25 11:19:07 +0200
committerChristophe Lyon <christophe.lyon@linaro.org>2016-04-25 11:19:12 +0200
commit2fe52b5924049fba56cf1a65d2a6739cbbd9b5d5 (patch)
treeff3c36e4dfd8848a49677255fea914d2fd7afa44
parent967a12aad35cefeabb313a5b43027302b05eac28 (diff)
gcc/
Backport from trunk r234116. 2016-03-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * common/config/aarch64/aarch64-common.c (aarch64_handle_option): Set x_flag_omit_leaf_frame_pointer when handling -momit-leaf-frame-pointer. gcc/ Backport from trunk r234118. 2016-03-10 Nick Clifton <nickc@redhat.com> PR target/7044 * config/aarch64/aarch64.c (aarch64_override_options_after_change_1): When forcing flag_omit_frame_pointer to be true, use a special value that can be detected if this function is called again, thus preventing flag_omit_leaf_frame_pointer from being forced to be false. gcc/testsuite/ Backport from trunk r234118. 2016-03-10 Nick Clifton <nickc@redhat.com> PR target/70044 * gcc.target/aarch64/pr70044.c: New test. Change-Id: I4af239daaa04e1f5eee36e6c9a5cad974dcb9725
-rw-r--r--gcc/common/config/aarch64/aarch64-common.c2
-rw-r--r--gcc/config/aarch64/aarch64.c17
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr70044.c14
3 files changed, 31 insertions, 2 deletions
diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c
index ae34dfa95a1..7bc7073cd51 100644
--- a/gcc/common/config/aarch64/aarch64-common.c
+++ b/gcc/common/config/aarch64/aarch64-common.c
@@ -97,7 +97,7 @@ aarch64_handle_option (struct gcc_options *opts,
return true;
case OPT_momit_leaf_frame_pointer:
- opts->x_flag_omit_frame_pointer = val;
+ opts->x_flag_omit_leaf_frame_pointer = val;
return true;
default:
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 1a20ed2a525..108c6d16229 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -7641,10 +7641,25 @@ aarch64_parse_override_string (const char* input_string,
static void
aarch64_override_options_after_change_1 (struct gcc_options *opts)
{
+ /* The logic here is that if we are disabling all frame pointer generation
+ then we do not need to disable leaf frame pointer generation as a
+ separate operation. But if we are *only* disabling leaf frame pointer
+ generation then we set flag_omit_frame_pointer to true, but in
+ aarch64_frame_pointer_required we return false only for leaf functions.
+
+ PR 70044: We have to be careful about being called multiple times for the
+ same function. Once we have decided to set flag_omit_frame_pointer just
+ so that we can omit leaf frame pointers, we must then not interpret a
+ second call as meaning that all frame pointer generation should be
+ omitted. We do this by setting flag_omit_frame_pointer to a special,
+ non-zero value. */
+ if (opts->x_flag_omit_frame_pointer == 2)
+ opts->x_flag_omit_frame_pointer = 0;
+
if (opts->x_flag_omit_frame_pointer)
opts->x_flag_omit_leaf_frame_pointer = false;
else if (opts->x_flag_omit_leaf_frame_pointer)
- opts->x_flag_omit_frame_pointer = true;
+ opts->x_flag_omit_frame_pointer = 2;
/* If not optimizing for size, set the default
alignment to what the target wants. */
diff --git a/gcc/testsuite/gcc.target/aarch64/pr70044.c b/gcc/testsuite/gcc.target/aarch64/pr70044.c
new file mode 100644
index 00000000000..1a84941dd7e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr70044.c
@@ -0,0 +1,14 @@
+/* { dg-do link } */
+/* { dg-require-effective-target lto } */
+/* { dg-options "-flto -O --save-temps -fno-omit-frame-pointer" } */
+
+extern int atoi (const char *);
+
+int
+main (int argc, char **argv)
+{
+ return atoi (argv[0]) + 1;
+}
+
+/* Check that the frame pointer really is created. */
+/* { dg-final { scan-lto-assembler "add x29, sp," } } */