diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-24 00:05:57 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-24 00:05:57 +0000 |
commit | 32201e9aeb52a4eef9ba61c156399f0090a98023 (patch) | |
tree | 19aa53b591348882b9111f4982435cf750d2b3f5 /gcc/cfglayout.c | |
parent | 8c4b1b28a0bc2a3a7a41d19a7b0780e3e3daa679 (diff) | |
download | gcc-32201e9aeb52a4eef9ba61c156399f0090a98023.tar.gz |
Revert:
2007-04-23 Jan Hubicka <jh@suse.cz>
* function.c (init_function_start): Don't init line number info.
(expand_function_end): Update.
(reset_block_changes, record_block_change, finalize_block_changes,
check_block_change, free_block_changes): Kill.
* function.h (reset_block_changes, record_block_change,
finalize_block_changes, check_block_change, free_block_changes): Remove
prototypes.
(struct function): Remove ib_boundaries_block.
* emit-rtl.c (make_insn_raw, make_jump_insn_raw, make_call_insn_raw):
Use curr_insn_locator to initialize locator.
(emit_line_note): Remove.
* cfgexpand.c (expand_gimple_cond_expr): Update.
(construct_exit_block): Likewise.
(tree_expand_cfg): Initialize/finalize locators.
* expr.c (expand_expr_real): Update.
* cfglayout.c (line_locators_locs, line_locators_lines,
file_locators_locs, file_locators_files): Remove.
(set_block_levels): Move to cfgexpand.c.
(insn_locators_initialize): Remove.
(pass_insn_locators_initialize): Remove.
(locations_locators_locs, locations_locators_vals): New static vars.
(curr_location, last_location, curr_block, last_block, curr_rtl_loc):
Likewise.
(insn_locators_alloc, insn_locators_finalize,
set_curr_insn_source_location, set_curr_insn_block, curr_insn_locator):
New functions.
(locator_location): New.
(locator_line, locator_file): Rewrite.
* rtl.h (emit_line_note): Kill.
(insn_locators_alloc, insn_locators_finalize,
set_curr_insn_source_location, set_curr_insn_block, curr_insn_locator):
Declare.
* tree-inline.c (initialize_cfun): Do not initialize
ib_boundaries_block.
* passes.c (pass_insn_locators_initialize): Remove.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124094 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfglayout.c')
-rw-r--r-- | gcc/cfglayout.c | 249 |
1 files changed, 142 insertions, 107 deletions
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c index c4ad2a8e10e..01784319c19 100644 --- a/gcc/cfglayout.c +++ b/gcc/cfglayout.c @@ -48,6 +48,7 @@ static void record_effective_endpoints (void); static rtx label_for_bb (basic_block); static void fixup_reorder_chain (void); +static void set_block_levels (tree, int); static void change_scope (rtx, tree, tree); void verify_insn_chain (void); @@ -231,106 +232,121 @@ record_effective_endpoints (void) than the following one. Similarly for the other properties. */ static VEC(int,heap) *block_locators_locs; static GTY(()) VEC(tree,gc) *block_locators_blocks; -static VEC(int,heap) *locations_locators_locs; -DEF_VEC_O(location_t); -DEF_VEC_ALLOC_O(location_t,heap); -static VEC(location_t,heap) *locations_locators_vals; +static VEC(int,heap) *line_locators_locs; +static VEC(int,heap) *line_locators_lines; +static VEC(int,heap) *file_locators_locs; +static GTY(()) varray_type file_locators_files; int prologue_locator; int epilogue_locator; -/* Hold current location information and last location information, so the - datastructures are built lazilly only when some instructions in given - place are needed. */ -location_t curr_location, last_location; -static tree curr_block, last_block; -static int curr_rtl_loc = -1; +/* During the RTL expansion the lexical blocks and line numbers are + represented via INSN_NOTEs. Replace them by representation using + INSN_LOCATORs. */ -/* Allocate insn locator datastructure. */ -void -insn_locators_alloc (void) +unsigned int +insn_locators_initialize (void) { + tree block = NULL; + tree last_block = NULL; + rtx insn, next; + int loc = 0; + int line_number = 0, last_line_number = 0; + const char *file_name = NULL, *last_file_name = NULL; + prologue_locator = epilogue_locator = 0; block_locators_locs = VEC_alloc (int, heap, 32); block_locators_blocks = VEC_alloc (tree, gc, 32); - locations_locators_locs = VEC_alloc (int, heap, 32); - locations_locators_vals = VEC_alloc (location_t, heap, 32); - -#ifdef USE_MAPPED_LOCATION - last_location = -1; - curr_location = -1; -#else - last_location.line = -1; - curr_location.line = -1; -#endif - curr_block = NULL; - last_block = NULL; - curr_rtl_loc = 0; -} + line_locators_locs = VEC_alloc (int, heap, 32); + line_locators_lines = VEC_alloc (int, heap, 32); + file_locators_locs = VEC_alloc (int, heap, 32); + VARRAY_CHAR_PTR_INIT (file_locators_files, 32, "file_locators_files"); -/* At the end of emit stage, clear current location. */ -void -insn_locators_finalize (void) -{ - if (curr_rtl_loc >= 0) - epilogue_locator = curr_insn_locator (); - curr_rtl_loc = -1; -} + for (insn = get_insns (); insn; insn = next) + { + int active = 0; -/* Set current location. */ -void -set_curr_insn_source_location (location_t location) -{ - gcc_assert (curr_rtl_loc >= 0); -#ifdef USE_MAPPED_LOCATION - if (location == last_location) - return; -#else - if (location.file && last_location.file - && !strcmp (location.file, last_location.file) - && location.line == last_location.line) - return; -#endif - curr_location = location; -} + next = NEXT_INSN (insn); -/* Set current scope block. */ -void -set_curr_insn_block (tree b) -{ - gcc_assert (curr_rtl_loc >= 0); - if (b) - curr_block = b; -} + if (NOTE_P (insn)) + { + gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_BLOCK_BEG + && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BLOCK_END); + if (NOTE_LINE_NUMBER (insn) > 0) + { + expanded_location xloc; + NOTE_EXPANDED_LOCATION (xloc, insn); + line_number = xloc.line; + file_name = xloc.file; + delete_insn (insn); + } + } + else + active = (active_insn_p (insn) + && GET_CODE (PATTERN (insn)) != ADDR_VEC + && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC); -/* Return current insn locator. */ -int -curr_insn_locator (void) -{ - if (curr_rtl_loc == -1) - return 0; - if (last_block != curr_block) - { - curr_rtl_loc++; - VEC_safe_push (int, heap, block_locators_locs, curr_rtl_loc); - VEC_safe_push (tree, gc, block_locators_blocks, curr_block); - last_block = curr_block; - } -#ifdef USE_MAPPED_LOCATION - if (last_location != curr_location) -#else - if (last_location.file != curr_location.file - || last_location.line != curr_location.line) -#endif - { - curr_rtl_loc++; - VEC_safe_push (int, heap, locations_locators_locs, curr_rtl_loc); - VEC_safe_push (location_t, heap, locations_locators_vals, &curr_location); - last_location = curr_location; + check_block_change (insn, &block); + + if (active + || !next + || (!prologue_locator && file_name)) + { + if (last_block != block) + { + loc++; + VEC_safe_push (int, heap, block_locators_locs, loc); + VEC_safe_push (tree, gc, block_locators_blocks, block); + last_block = block; + } + if (last_line_number != line_number) + { + loc++; + VEC_safe_push (int, heap, line_locators_locs, loc); + VEC_safe_push (int, heap, line_locators_lines, line_number); + last_line_number = line_number; + } + if (last_file_name != file_name) + { + loc++; + VEC_safe_push (int, heap, file_locators_locs, loc); + VARRAY_PUSH_CHAR_PTR (file_locators_files, (char *) file_name); + last_file_name = file_name; + } + if (!prologue_locator && file_name) + prologue_locator = loc; + if (!next) + epilogue_locator = loc; + if (active) + INSN_LOCATOR (insn) = loc; + } } - return curr_rtl_loc; + + /* Tag the blocks with a depth number so that change_scope can find + the common parent easily. */ + set_block_levels (DECL_INITIAL (cfun->decl), 0); + + free_block_changes (); + return 0; } +struct tree_opt_pass pass_insn_locators_initialize = +{ + "locators", /* name */ + NULL, /* gate */ + insn_locators_initialize, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + 0, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func, /* todo_flags_finish */ + 0 /* letter */ +}; + static unsigned int into_cfg_layout_mode (void) { @@ -385,6 +401,20 @@ struct tree_opt_pass pass_outof_cfg_layout_mode = TODO_dump_func, /* todo_flags_finish */ 0 /* letter */ }; + +/* For each lexical block, set BLOCK_NUMBER to the depth at which it is + found in the block tree. */ + +static void +set_block_levels (tree block, int level) +{ + while (block) + { + BLOCK_NUMBER (block) = level; + set_block_levels (BLOCK_SUBBLOCKS (block), level + 1); + block = BLOCK_CHAIN (block); + } +} /* Return sope resulting from combination of S1 and S2. */ static tree @@ -484,16 +514,18 @@ insn_scope (rtx insn) } /* Return line number of the statement specified by the locator. */ -static location_t -locator_location (int loc) +int +locator_line (int loc) { - int max = VEC_length (int, locations_locators_locs); + int max = VEC_length (int, line_locators_locs); int min = 0; + if (!max || !loc) + return 0; while (1) { int pos = (min + max) / 2; - int tmp = VEC_index (int, locations_locators_locs, pos); + int tmp = VEC_index (int, line_locators_locs, pos); if (tmp <= loc && min != pos) min = pos; @@ -505,19 +537,7 @@ locator_location (int loc) break; } } - return *VEC_index (location_t, locations_locators_vals, min); -} - -/* Return source line of the statement that produced this insn. */ -int -locator_line (int loc) -{ - expanded_location xloc; - if (!loc) - return 0; - else - xloc = expand_location (locator_location (loc)); - return xloc.line; + return VEC_index (int, line_locators_lines, min); } /* Return line number of the statement that produced this insn. */ @@ -531,12 +551,27 @@ insn_line (rtx insn) const char * locator_file (int loc) { - expanded_location xloc; - if (!loc) - return 0; - else - xloc = expand_location (locator_location (loc)); - return xloc.file; + int max = VEC_length (int, file_locators_locs); + int min = 0; + + if (!max || !loc) + return NULL; + while (1) + { + int pos = (min + max) / 2; + int tmp = VEC_index (int, file_locators_locs, pos); + + if (tmp <= loc && min != pos) + min = pos; + else if (tmp > loc && max != pos) + max = pos; + else + { + min = pos; + break; + } + } + return VARRAY_CHAR_PTR (file_locators_files, min); } /* Return source file of the statement that produced this insn. */ |