This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][AArch64] PR71951: Fix unwinding with -fomit-frame-pointer
- From: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, James Greenhalgh <James dot Greenhalgh at arm dot com>
- Cc: nd <nd at arm dot com>
- Date: Mon, 31 Jul 2017 15:57:57 +0000
- Subject: [PATCH][AArch64] PR71951: Fix unwinding with -fomit-frame-pointer
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Wilco dot Dijkstra at arm dot com;
- Nodisclaimer: True
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
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.
OK for commit and backport to GCC6/7?
ChangeLog:
2017-07-31 Wilco Dijkstra <wdijkstr@arm.com>
PR target/71951
* config/aarch64/aarch64.h (LIBGCC2_UNWIND_ATTRIBUTE): Define.
--
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 7f91edb5713d7e8eda2f0a024a0f97b4e111c4b0..03fd93046bdbdb03bd7d0c4573928f504640f7e1 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -971,4 +971,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 */