]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR71951: Fix unwinding with -fomit-frame-pointer
authorWilco Dijkstra <wdijkstr@arm.com>
Thu, 21 Sep 2017 12:21:18 +0000 (12:21 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Thu, 21 Sep 2017 12:21:18 +0000 (12:21 +0000)
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: r253064

gcc/ChangeLog
gcc/config/aarch64/aarch64.h

index f3e9e35560a1ea3aa7511f3105eb69bfc44243dd..df3d9bac4082b661a1b5c0d0ee438f5f66d4c433 100644 (file)
@@ -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-19  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (fold_builtin_cpu): Add M_AMDFAM17H
index cbce5732f465da2aef8fd867c157322edcb58714..24defeb13282675712457ca637ca11c2bc736eab 100644 (file)
@@ -935,4 +935,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 */