diff options
author | Christophe Lyon <christophe.lyon@linaro.org> | 2016-04-25 11:19:07 +0200 |
---|---|---|
committer | Christophe Lyon <christophe.lyon@linaro.org> | 2016-04-25 11:19:12 +0200 |
commit | 2fe52b5924049fba56cf1a65d2a6739cbbd9b5d5 (patch) | |
tree | ff3c36e4dfd8848a49677255fea914d2fd7afa44 | |
parent | 967a12aad35cefeabb313a5b43027302b05eac28 (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.c | 2 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr70044.c | 14 |
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," } } */ |