From: Wilco Dijkstra Date: Thu, 21 Sep 2017 12:08:12 +0000 (+0000) Subject: PR71951: Fix unwinding with -fomit-frame-pointer X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=817221cc87b78034dd750f6dc94ab336d7e802be;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08d56208795..c7065000c7d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-09-21 Wilco Dijkstra + + PR target/71951 + * config/aarch64/aarch64.h (LIBGCC2_UNWIND_ATTRIBUTE): Define. + 2017-09-21 Richard Biener * 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 128006d8b5f..fe3dd43c679 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 */