diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-10 00:20:16 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-10 00:20:16 +0000 |
commit | 2943ce06ec3e9fad4753d65f4663c58f1dc69f88 (patch) | |
tree | 7670fde6cf99d8c4dcfee7a32b97bae2259e7736 /gcc/except.c | |
parent | f9155c66224f7811b6a3998a177d8938b47d397f (diff) | |
download | gcc-2943ce06ec3e9fad4753d65f4663c58f1dc69f88.tar.gz |
* dwarf2out.c (default_eh_frame_section): Delete, moving handling
of EH_FRAME_SECTION_NAME into...
(switch_to_eh_frame_section): ...here. Try to set eh_frame_section
if it is still null.
* except.c (default_exception_section): Delete, moving most
of the code to...
(switch_to_exception_section): ...this new function. Set
exception_section if it is still null, then switch to it.
(output_function_exception_table): Use switch_to_exception_section.
* varasm.c (exception_section, eh_frame_section): Update comments.
(get_section): Hoist use of SECTION_NAMED.
(init_varasm_once): Don't set exception_section and eh_frame_section.
* output.h (default_exception_section): Delete.
(default_eh_frame_section): Delete.
testsuite/
* gcc.dg/20051207-1.c,
* gcc.dg/20051207-2.c,
* gcc.dg/20051207-3.c: New tests.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108336 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/except.c')
-rw-r--r-- | gcc/except.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/gcc/except.c b/gcc/except.c index 782a516abfb..f8aed34c511 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -3425,30 +3425,34 @@ sjlj_output_call_site_table (void) call_site_base += n; } -/* Return the default value of exception_section. */ +/* Switch to the section that should be used for exception tables. */ -section * -default_exception_section (void) +static void +switch_to_exception_section (void) { - if (targetm.have_named_sections) + if (exception_section == 0) { - int flags; - - if (EH_TABLES_CAN_BE_READ_ONLY) + if (targetm.have_named_sections) { - int tt_format = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/1); - - flags = (! flag_pic - || ((tt_format & 0x70) != DW_EH_PE_absptr - && (tt_format & 0x70) != DW_EH_PE_aligned)) - ? 0 : SECTION_WRITE; + int flags; + + if (EH_TABLES_CAN_BE_READ_ONLY) + { + int tt_format = + ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/1); + flags = ((! flag_pic + || ((tt_format & 0x70) != DW_EH_PE_absptr + && (tt_format & 0x70) != DW_EH_PE_aligned)) + ? 0 : SECTION_WRITE); + } + else + flags = SECTION_WRITE; + exception_section = get_section (".gcc_except_table", flags, NULL); } else - flags = SECTION_WRITE; - return get_section (".gcc_except_table", flags, NULL); + exception_section = flag_pic ? data_section : readonly_data_section; } - else - return flag_pic ? data_section : readonly_data_section; + switch_to_section (exception_section); } @@ -3530,7 +3534,7 @@ output_function_exception_table (void) /* Note that varasm still thinks we're in the function's code section. The ".endp" directive that will immediately follow will take us back. */ #else - switch_to_section (exception_section); + switch_to_exception_section (); #endif have_tt_data = (VEC_length (tree, cfun->eh->ttype_data) > 0 |