From 58767f002acb70b56e3d342607a2c9789bf761e8 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 25 Nov 2004 18:04:11 -0800 Subject: [PATCH] re PR c++/6764 (Throwing exception causes crash with '-O2 -fomit-frame-pointer') PR c++/6764 * reload1.c (set_initial_eh_label_offset): New. (set_initial_label_offsets): Use it. From-SVN: r91318 --- gcc/ChangeLog | 6 ++++++ gcc/reload1.c | 10 ++++++++++ gcc/testsuite/g++.dg/opt/eh2.C | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/eh2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8358ecf4647..c4f82e3584b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-11-25 Ricahrd Henderson + + PR c++/6764 + * reload1.c (set_initial_eh_label_offset): New. + (set_initial_label_offsets): Use it. + 2004-11-25 Kaz Kojima * config/sh/sh.c (sh_output_mi_thunk): Initialize bitmap obstacks diff --git a/gcc/reload1.c b/gcc/reload1.c index 9ffa798e1cf..c90c8b61eea 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -3316,6 +3316,14 @@ set_initial_elim_offsets (void) num_not_at_initial_offset = 0; } +/* Subroutine of set_initial_label_offsets called via for_each_eh_label. */ + +static void +set_initial_eh_label_offset (rtx label) +{ + set_label_offsets (label, NULL_RTX, 1); +} + /* Initialize the known label offsets. Set a known offset for each forced label to be at the initial offset of each elimination. We do this because we assume that all @@ -3332,6 +3340,8 @@ set_initial_label_offsets (void) for (x = forced_labels; x; x = XEXP (x, 1)) if (XEXP (x, 0)) set_label_offsets (XEXP (x, 0), NULL_RTX, 1); + + for_each_eh_label (set_initial_eh_label_offset); } /* Set all elimination offsets to the known values for the code label given diff --git a/gcc/testsuite/g++.dg/opt/eh2.C b/gcc/testsuite/g++.dg/opt/eh2.C new file mode 100644 index 00000000000..7cb49f00cee --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh2.C @@ -0,0 +1,34 @@ +// PR 6764 +// { dg-do run } +// { dg-options "-O -fomit-frame-pointer" } + +extern "C" void abort (); + +class test +{ + public: + test * const me; + test () : me(this) { } + ~test () { if (me != this) abort (); } +}; + +void x1 () +{ + test w1; + throw 1; +} + +void x2 () +{ + test w2; + x1 (); +} + +int main (void) +{ + try { + x2 (); + } catch (...) { + } + return 0; +} -- 2.30.2