diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-17 21:08:39 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-17 21:08:39 +0000 |
commit | 23a070f3288838226d6b9fa688ccce70de8d4d9a (patch) | |
tree | 1716ec5f5eb641fe82e493441959f78d3212142b /gcc/final.c | |
parent | aedb7bf8a9ee16ca0326af295b8888a85c367ccf (diff) | |
download | ppe42-gcc-23a070f3288838226d6b9fa688ccce70de8d4d9a.tar.gz ppe42-gcc-23a070f3288838226d6b9fa688ccce70de8d4d9a.zip |
2012-06-17 Steven Bosscher <steven@gcc.gnu.org>
* cfglayout.h: Remove.
* cfglayout.c: Remove.
* function.h (struct function): Remove x_last_location field.
* function.c: Do not include cfglayout.h.
(expand_function_start): Do not call no-op force_next_line_note.
(expand_function_end): Likewise.
* cfgrtl.c: Do not include cfglayout.h. Include gt-cfgrtl.h.
(unlink_insn_chain): Moved here from cfglayout.c.
(skip_insns_after_block, label_for_bb, record_effective_endpoints,
into_cfg_layout_mode, outof_cfg_layout_mode,
pass_into_cfg_layout_mode, pass_outof_cfg_layout_mode,
relink_block_chain, fixup_reorder_chain, verify_insn_chain,
fixup_fallthru_exit_predecessor, force_one_exit_fallthru,
cfg_layout_can_duplicate_bb_p, duplicate_insn_chain,
cfg_layout_duplicate_bb, cfg_layout_initialize, break_superblocks,
cfg_layout_finalize): Likewise.
(rtl_can_remove_branch_p): Likewise.
* rtl.h (insn_scope): Move prototype from cfglayout.h here.
(duplicate_insn_chain): Likewise.
(force_next_line_note): Remove prototype.
* emit-rtl.c: Do not include tree-flow.h, egad. Include vecprim.h.
(last_location): Remove #define to emit.x_last_location.
(force_next_line_note): Remove no-op function.
(init_emit): Don't set x_last_location.
(block_locators_locs, block_locators_blocks, locations_locators_locs,
locations_locators_vals, prologue_locator, epilogue_locator,
curr_location, last_location, curr_block, last_block, curr_rtl_loc):
Move POD to here from cfglayout.c.
(insn_locators_alloc, insn_locators_finalize, insn_locators_free,
set_curr_insn_source_location, get_curr_insn_source_location,
set_curr_insn_block, get_curr_insn_block, curr_insn_locator,
locator_scope, insn_scope, locator_location, locator_line, insn_line,
locator_file, insn_file, locator_eq): Move to here from cfglayout.c.
* cfghooks.h: Remove double-include protection.
(can_copy_bbs_p, copy_bbs): Move prototypes from cfglayout.h to here.
* cfghooks.c (can_copy_bbs_p, copy_bbs): Move to here from cfglayout.c.
* final.c: Do not include cfglayout.h.
(choose_inner_scope, change_scope): Move to here from cfglayout.c.
(reemit_insn_block_notes): Likewise. Make static.
* tree-flow.h (tree_could_trap_p, operation_could_trap_helper_p,
operation_could_trap_p, tree_could_throw_p): Move from here...
* tree.h: ... to here.
* gengtype.c (open_base_files): Remove cfglayout.h from the list.
* profile.c: Do not include cfghooks.h.
* cfgloopmanip.c: Do not include cfglayout.h and cfghooks.h.
* modulo-sched.c: Likewise.
* loop-unswitch.c: Do not include cfglayout.h.
* sched-ebb.c: Likewise.
* tracer.c: Likewise.
* ddg.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* loop-init.c: Likewise.
* dwarf2out.c: Likewise.
* hw-doloop.c: Likewise.
* loop-unroll.c: Likewise.
* cfgcleanup.c: Likewise.
* bb-reorder.c: Likewise.
* sched-rgn.c: Likewise.
* tree-cfg.c: Likewise.
* config/alpha/alpha.c: Likewise.
* config/spu/spu.c: Likewise.
* config/sparc/sparc.c: Likewise.
* config/sh/sh.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/score/score.c: Likewise.
* config/mips/mips.c: Likewise.
* config/bfin/bfin.c: Likewise.
* Makefile.in (CFGAYOUT_H): Remove, and fixup users.
* config/rs6000/t-rs6000 (rs6000.o): Do not depend on cfglayout.h.
* config/spu/t-spu-elf (spu.o: $): Likewise.
* config/sparc/t-sparc (sparc.o): Do not depend on CFGLAYOUT_H.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188712 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/final.c')
-rw-r--r-- | gcc/final.c | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/gcc/final.c b/gcc/final.c index fe1add226cb..f940b641bc1 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -72,7 +72,6 @@ along with GCC; see the file COPYING3. If not see #include "targhooks.h" #include "debug.h" #include "expr.h" -#include "cfglayout.h" /* for reemit_insn_block_notes */ #include "tree-pass.h" #include "tree-flow.h" #include "timevar.h" @@ -1515,6 +1514,114 @@ dwarf2_debug_info_emitted_p (tree decl) return true; } +/* Return scope resulting from combination of S1 and S2. */ +static tree +choose_inner_scope (tree s1, tree s2) +{ + if (!s1) + return s2; + if (!s2) + return s1; + if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2)) + return s1; + return s2; +} + +/* Emit lexical block notes needed to change scope from S1 to S2. */ + +static void +change_scope (rtx orig_insn, tree s1, tree s2) +{ + rtx insn = orig_insn; + tree com = NULL_TREE; + tree ts1 = s1, ts2 = s2; + tree s; + + while (ts1 != ts2) + { + gcc_assert (ts1 && ts2); + if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2)) + ts1 = BLOCK_SUPERCONTEXT (ts1); + else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2)) + ts2 = BLOCK_SUPERCONTEXT (ts2); + else + { + ts1 = BLOCK_SUPERCONTEXT (ts1); + ts2 = BLOCK_SUPERCONTEXT (ts2); + } + } + com = ts1; + + /* Close scopes. */ + s = s1; + while (s != com) + { + rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn); + NOTE_BLOCK (note) = s; + s = BLOCK_SUPERCONTEXT (s); + } + + /* Open scopes. */ + s = s2; + while (s != com) + { + insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn); + NOTE_BLOCK (insn) = s; + s = BLOCK_SUPERCONTEXT (s); + } +} + +/* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based + on the scope tree and the newly reordered instructions. */ + +static void +reemit_insn_block_notes (void) +{ + tree cur_block = DECL_INITIAL (cfun->decl); + rtx insn, note; + + insn = get_insns (); + if (!active_insn_p (insn)) + insn = next_active_insn (insn); + for (; insn; insn = next_active_insn (insn)) + { + tree this_block; + + /* Avoid putting scope notes between jump table and its label. */ + if (JUMP_TABLE_DATA_P (insn)) + continue; + + this_block = insn_scope (insn); + /* For sequences compute scope resulting from merging all scopes + of instructions nested inside. */ + if (GET_CODE (PATTERN (insn)) == SEQUENCE) + { + int i; + rtx body = PATTERN (insn); + + this_block = NULL; + for (i = 0; i < XVECLEN (body, 0); i++) + this_block = choose_inner_scope (this_block, + insn_scope (XVECEXP (body, 0, i))); + } + if (! this_block) + continue; + + if (this_block != cur_block) + { + change_scope (insn, cur_block, this_block); + cur_block = this_block; + } + } + + /* change_scope emits before the insn, not after. */ + note = emit_note (NOTE_INSN_DELETED); + change_scope (note, cur_block, DECL_INITIAL (cfun->decl)); + delete_insn (note); + + reorder_blocks (); +} + /* Output assembler code for the start of a function, and initialize some of the variables in this file for the new function. The label for the function and associated |