rs6000: Enable -fasynchronous-unwind-tables by default
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 10 Apr 2018 21:09:30 +0000 (23:09 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 10 Apr 2018 21:09:30 +0000 (23:09 +0200)
To find out where on-entry register values live at any point in a
program, GDB currently tries to parse to parse the executable code.
This does not work very well, for example it gets confused if some
accesses to the stack use the frame pointer (r31) and some use the
stack pointer (r1).  A symptom is that backtraces can be cut short.

This patch enables -fasynchronous-unwind-tables by default for rs6000,
which causes us to emit DWARF unwind tables for all functions, solving
these problems.

This not do anything for sub-targets without DWARF, and only for ELF
sub-targets for now.

It increases executable size, but only modestly, and does not change
memory use, only the disk image.

* common/config/rs6000/rs6000-common.c (rs6000_option_init_struct):
Enable -fasynchronous-unwind-tables by default if OBJECT_FORMAT_ELF.

gcc/testsuite/
* gcc.target/powerpc/dfmode_off.c: Add -fno-asynchronous-unwind-tables.
* gcc.target/powerpc/dimode_off.c: Ditto.
* gcc.target/powerpc/tfmode_off.c: Ditto.
* gcc.target/powerpc/timode_off.c: Ditto.

From-SVN: r259298

gcc/ChangeLog
gcc/common/config/rs6000/rs6000-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/dfmode_off.c
gcc/testsuite/gcc.target/powerpc/dimode_off.c
gcc/testsuite/gcc.target/powerpc/tfmode_off.c
gcc/testsuite/gcc.target/powerpc/timode_off.c

index 68b05491bdafd212db728fd5086663e9308a6564..2031dc79d41b2ef0f04cb7167b87ddf0d4fb4bca 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-10  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * common/config/rs6000/rs6000-common.c (rs6000_option_init_struct):
+       Enable -fasynchronous-unwind-tables by default if OBJECT_FORMAT_ELF.
+
 2018-04-10  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/85321
index 0ddadfd850616745176c1143c0ae9031442e2382..ed348f59dfa6f1128553e02deb5774e5e93594cb 100644 (file)
@@ -49,6 +49,15 @@ rs6000_option_init_struct (struct gcc_options *opts)
   /* Enable section anchors by default.  */
   if (!TARGET_MACHO)
     opts->x_flag_section_anchors = 1;
+
+  /* By default, always emit DWARF-2 unwind info.  This allows debugging
+     without maintaining a stack frame back-chain.  It also allows the
+     debugger to find out where on-entry register values are stored at any
+     point in a function, without having to analyze the executable code (which
+     isn't even possible to do in the general case).  */
+#ifdef OBJECT_FORMAT_ELF
+  opts->x_flag_asynchronous_unwind_tables = 1;
+#endif
 }
 
 /* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
index de5332e5f9cead576501772bfc4c61f164944f23..8de596e4f6ec0ff101079814c97ae6c75dacbbb9 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-10  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * gcc.target/powerpc/dfmode_off.c: Add -fno-asynchronous-unwind-tables.
+       * gcc.target/powerpc/dimode_off.c: Ditto.
+       * gcc.target/powerpc/tfmode_off.c: Ditto.
+       * gcc.target/powerpc/timode_off.c: Ditto.
+
 2018-04-10  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        * gcc.target/powerpc/vec-ldl-1.c: New test.
index 1942f484de97621ba9a89c09bddd327221079722..b5940cbde612f95b890dab387be916ccb7530c09 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do assemble } */
-/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */
+/* { dg-options "-O2 -fno-align-functions -fno-asynchronous-unwind-tables -mtraceback=no -save-temps" } */
 
 void w1 (void *x, double y) { *(double *) (x + 32767) = y; }
 void w2 (void *x, double y) { *(double *) (x + 32766) = y; }
index 77a18630a849ddc9b55eee78d42c5397a30caf85..19ca40c508ba9dd0717cec7d0c4748068e343e35 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do assemble } */
-/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */
+/* { dg-options "-O2 -fno-align-functions -fno-asynchronous-unwind-tables -mtraceback=no -save-temps" } */
 
 void w1 (void *x, long long y) { *(long long *) (x + 32767) = y; }
 void w2 (void *x, long long y) { *(long long *) (x + 32766) = y; }
index cbb3d75b8e1734e3429469bb83ae412c424a2b6a..f19e7592fd417b2b0128c7614b84837bf84f1e76 100644 (file)
@@ -2,7 +2,7 @@
 /* { dg-skip-if "" { powerpc-ibm-aix* } } */
 /* { dg-skip-if "no TFmode" { powerpc-*-eabi* } } */
 /* { dg-require-effective-target longdouble128 } */
-/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */
+/* { dg-options "-O2 -fno-align-functions -fno-asynchronous-unwind-tables -mtraceback=no -save-temps" } */
 
 typedef float TFmode __attribute__ ((mode (TF)));
 
index efeffa7d8d64e04861f3e7d87e3e4df5b5f2e294..b63595347b58ee7ab9c643b0034cd15b43b5068a 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do assemble { target { lp64 } } } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power5" } } */
-/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps -mcpu=power5" } */
+/* { dg-options "-O2 -fno-align-functions -fno-asynchronous-unwind-tables -mtraceback=no -save-temps -mcpu=power5" } */
 
 typedef int TImode __attribute__ ((mode (TI)));