From 55fc9e87b216e43ae8cc1f2b97c799c41e3f8f09 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 2 Nov 2006 18:40:54 +0000 Subject: [PATCH] re PR other/29639 (ext/bitmap_allocator/check_allocate_max_size.cc execution test) PR other/29639 * except.c (switch_to_exception_section): Do not cache the section if named sections are supported and HAVE_LD_EH_GC_SECTIONS is defined and flag_function_sections is set. From-SVN: r118422 --- gcc/ChangeLog | 7 +++++ gcc/except.c | 20 ++++++++++---- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.dg/eh/gcsec1.C | 45 ++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/eh/gcsec1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74b905f131c..92b9048f937 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-11-02 Eric Botcazou + + PR other/29639 + * except.c (switch_to_exception_section): Do not cache the section + if named sections are supported and HAVE_LD_EH_GC_SECTIONS is defined + and flag_function_sections is set. + 2006-11-01 Kaveh R. Ghazi PR middle-end/29335 diff --git a/gcc/except.c b/gcc/except.c index 306916968e8..39827c9b68d 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -3522,8 +3522,14 @@ sjlj_output_call_site_table (void) static void switch_to_exception_section (const char * ARG_UNUSED (fnname)) { - if (exception_section == 0) + section *s; + + if (exception_section) + s = exception_section; + else { + /* Compute the section and cache it into exception_section, + unless it depends on the function name. */ if (targetm.have_named_sections) { int flags; @@ -3539,22 +3545,26 @@ switch_to_exception_section (const char * ARG_UNUSED (fnname)) } else flags = SECTION_WRITE; + #ifdef HAVE_LD_EH_GC_SECTIONS if (flag_function_sections) { char *section_name = xmalloc (strlen (fnname) + 32); sprintf (section_name, ".gcc_except_table.%s", fnname); - exception_section = get_section (section_name, flags, NULL); + s = get_section (section_name, flags, NULL); free (section_name); } else #endif - exception_section = get_section (".gcc_except_table", flags, NULL); + exception_section + = s = get_section (".gcc_except_table", flags, NULL); } else - exception_section = flag_pic ? data_section : readonly_data_section; + exception_section + = s = flag_pic ? data_section : readonly_data_section; } - switch_to_section (exception_section); + + switch_to_section (s); } #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c332b7179e..59e983281a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-11-02 Eric Botcazou + + * g++.dg/eh/gcsec1.C: New test. + 2006-11-01 Kaveh R. Ghazi * gcc.dg/torture/builtin-math-3.c: Fix semicolons. diff --git a/gcc/testsuite/g++.dg/eh/gcsec1.C b/gcc/testsuite/g++.dg/eh/gcsec1.C new file mode 100644 index 00000000000..5dfe02a6b9e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/gcsec1.C @@ -0,0 +1,45 @@ +/* PR other/29639 */ +/* AIX gld supports garbage collection. But AIX gcc does not support + -ffunction-sections or -fdata-sections. */ +/* { dg-do run { xfail rs6000-*-aix* powerpc*-*-aix* } } */ +/* { dg-require-gc-sections "" } */ +/* { dg-options "-ffunction-sections -Wl,--gc-sections" } */ + +extern "C" void abort (void); + +int g = 0; + +void raise_exception() +{ + throw 1; +} + +void used() +{ + try { + raise_exception (); + } + catch (int) { + g = 1; + } +} + +void unused() +{ + try { + raise_exception (); + } + catch (int) { + g = 1; + } +} + +int main() +{ + used (); + + if (g != 1) + abort (); + + return 0; +} -- 2.30.2