aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2017-09-21 12:08:12 +0000
committerWilco Dijkstra <wilco@gcc.gnu.org>2017-09-21 12:08:12 +0000
commit817221cc87b78034dd750f6dc94ab336d7e802be (patch)
treedd49b44efa5124c2054da2431dcc0ab086c6079d /gcc
parent73d1c65029e56f95bfb3d83e2bb9a403f3f69de4 (diff)
downloadgcc-817221cc87b78034dd750f6dc94ab336d7e802be.zip
gcc-817221cc87b78034dd750f6dc94ab336d7e802be.tar.gz
gcc-817221cc87b78034dd750f6dc94ab336d7e802be.tar.bz2
PR71951: Fix unwinding with -fomit-frame-pointer
As described in PR71951, if libgcc is built with -fomit-frame-pointer, unwinding crashes, for example while doing a backtrace. The underlying reason is the Dwarf unwinder does not setup the frame pointer register in the initialization code. When later unwinding a function that uses the frame pointer, it tries to read FP using _Unwind_GetGR, and this crashes if has never restored FP. To unwind correctly the first frame must save and restore FP (it is unwound in a special way so that it uses SP instead of FP). This is done by adding -fno-omit-frame-pointer. gcc/ PR target/71951 * config/aarch64/aarch64.h (LIBGCC2_UNWIND_ATTRIBUTE): Define. From-SVN: r253061
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/aarch64/aarch64.h8
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 08d5620..c706500 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-21 Wilco Dijkstra <wdijkstr@arm.com>
+
+ PR target/71951
+ * config/aarch64/aarch64.h (LIBGCC2_UNWIND_ATTRIBUTE): Define.
+
2017-09-21 Richard Biener <rguenther@suse.de>
* graphite-isl-ast-to-gimple.c (graphite_regenerate_ast_isl):
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 128006d..fe3dd43 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -954,4 +954,12 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
extern tree aarch64_fp16_type_node;
extern tree aarch64_fp16_ptr_type_node;
+/* The generic unwind code in libgcc does not initialize the frame pointer.
+ So in order to unwind a function using a frame pointer, the very first
+ function that is unwound must save the frame pointer. That way the frame
+ pointer is restored and its value is now valid - otherwise _Unwind_GetGR
+ crashes. Libgcc can now be safely built with -fomit-frame-pointer. */
+#define LIBGCC2_UNWIND_ATTRIBUTE \
+ __attribute__((optimize ("no-omit-frame-pointer")))
+
#endif /* GCC_AARCH64_H */