Mercurial > hg > CbC > CbC_gcc
diff gcc/except.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/except.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/except.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Implements exception handling. - Copyright (C) 1989-2017 Free Software Foundation, Inc. + Copyright (C) 1989-2018 Free Software Foundation, Inc. Contributed by Mike Stump <mrs@cygnus.com>. This file is part of GCC. @@ -947,7 +947,7 @@ at the rtl level. Emit the code required by the target at a landing pad for the given region. */ -void +static void expand_dw2_landing_pad_for_region (eh_region region) { if (targetm.have_exception_receiver ()) @@ -1003,7 +1003,6 @@ bb = emit_to_new_bb_before (seq, label_rtx (lp->post_landing_pad)); bb->count = bb->next_bb->count; - bb->frequency = bb->next_bb->frequency; make_single_succ_edge (bb, bb->next_bb, e_flags); if (current_loops) { @@ -1511,13 +1510,9 @@ sjlj_build_landing_pads (); else dw2_build_landing_pads (); + break_superblocks (); - if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ - /* Kludge for Alpha (see alpha_gp_save_rtx). */ - || single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun))->insns.r) - commit_edge_insertions (); - /* Redirect all EH edges from the post_landing_pad to the landing pad. */ FOR_EACH_BB_FN (bb, cfun) { @@ -1547,6 +1542,11 @@ : EDGE_ABNORMAL); } } + + if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ + /* Kludge for Alpha (see alpha_gp_save_rtx). */ + || single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun))->insns.r) + commit_edge_insertions (); } /* This section handles removing dead code for flow. */ @@ -2466,14 +2466,6 @@ static rtx_note * emit_note_eh_region_end (rtx_insn *insn) { - rtx_insn *next = NEXT_INSN (insn); - - /* Make sure we do not split a call and its corresponding - CALL_ARG_LOCATION note. */ - if (next && NOTE_P (next) - && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION) - insn = next; - return emit_note_after (NOTE_INSN_EH_REGION_END, insn); } @@ -2948,7 +2940,6 @@ switch_to_section (s); } - /* Output a reference from an exception table to the type_info object TYPE. TT_FORMAT and TT_FORMAT_SIZE describe the DWARF encoding method used for the value. */ @@ -2998,6 +2989,13 @@ dw2_asm_output_encoded_addr_rtx (tt_format, value, is_public, NULL); } +/* Output an exception table for the current function according to SECTION. + + If the function has been partitioned into hot and cold parts, value 0 for + SECTION refers to the table associated with the hot part while value 1 + refers to the table associated with the cold part. If the function has + not been partitioned, value 0 refers to the single exception table. */ + static void output_one_function_exception_table (int section) { @@ -3176,13 +3174,27 @@ } } +/* Output an exception table for the current function according to SECTION, + switching back and forth from the function section appropriately. + + If the function has been partitioned into hot and cold parts, value 0 for + SECTION refers to the table associated with the hot part while value 1 + refers to the table associated with the cold part. If the function has + not been partitioned, value 0 refers to the single exception table. */ + void -output_function_exception_table (const char *fnname) +output_function_exception_table (int section) { + const char *fnname = get_fnname_from_decl (current_function_decl); rtx personality = get_personality_function (current_function_decl); /* Not all functions need anything. */ - if (! crtl->uses_eh_lsda) + if (!crtl->uses_eh_lsda + || targetm_common.except_unwind_info (&global_options) == UI_NONE) + return; + + /* No need to emit any boilerplate stuff for the cold part. */ + if (section == 1 && !crtl->eh.call_site_record_v[1]) return; if (personality) @@ -3198,9 +3210,8 @@ /* If the target wants a label to begin the table, emit it here. */ targetm.asm_out.emit_except_table_label (asm_out_file); - output_one_function_exception_table (0); - if (crtl->eh.call_site_record_v[1]) - output_one_function_exception_table (1); + /* Do the real work. */ + output_one_function_exception_table (section); switch_to_section (current_function_section ()); }