summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog18
-rw-r--r--gcc/emit-rtl.c74
-rw-r--r--gcc/final.c1
-rw-r--r--gcc/function.c16
-rw-r--r--gcc/function.h4
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/stmt.c12
-rw-r--r--gcc/tree-pass.h1
9 files changed, 29 insertions, 99 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 157a550c1bb..613fb840487 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,21 @@
+2006-03-20 Steven Bosscher <stevenb.gcc@gmail.com>
+
+ * function.h (struct function) <x_tail_recursion_reentry>:
+ Rename to x_stack_check_probe_note.
+ (tail_recursion_reentry): Rename to stack_check_probe_note.
+ * function.c: Replace tail_recursion_reentry with
+ stack_check_probe_note everywhere.
+ (expand_function_start): Only emit a note for
+ stack_check_probe_note with -fstack-protect.
+ * stmt.c (expand_case): Don't emit NOTE_INSN_DELETED notes.
+
+ * emit-rtl.c (remove_unnecessary_notes): Remove.
+ (pass_remove_unnecessary_notes): Remove.
+ * rtl.h (remove_unnecessary_notes): Remove prototype.
+ * final.c (final_start_function): Don't call remove_unnecessary_notes.
+ * tree-pass.h (pass_remove_unnecessary_notes): Remove.
+ * passes.c (pass_remove_unnecessary_notes): Don't run it.
+
2006-03-20 Andrew Pinski <pinskia@physics.uc.edu>
PR tree-opt/26629
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 06721c6c467..eabf88f646d 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -3677,80 +3677,6 @@ find_line_note (rtx insn)
return insn;
}
-/* Remove unnecessary notes from the instruction stream. */
-
-unsigned int
-remove_unnecessary_notes (void)
-{
- rtx eh_stack = NULL_RTX;
- rtx insn;
- rtx next;
- rtx tmp;
-
- /* We must not remove the first instruction in the function because
- the compiler depends on the first instruction being a note. */
- for (insn = NEXT_INSN (get_insns ()); insn; insn = next)
- {
- /* Remember what's next. */
- next = NEXT_INSN (insn);
-
- /* We're only interested in notes. */
- if (!NOTE_P (insn))
- continue;
-
- switch (NOTE_LINE_NUMBER (insn))
- {
- case NOTE_INSN_DELETED:
- remove_insn (insn);
- break;
-
- case NOTE_INSN_EH_REGION_BEG:
- eh_stack = alloc_INSN_LIST (insn, eh_stack);
- break;
-
- case NOTE_INSN_EH_REGION_END:
- /* Too many end notes. */
- gcc_assert (eh_stack);
- /* Mismatched nesting. */
- gcc_assert (NOTE_EH_HANDLER (XEXP (eh_stack, 0))
- == NOTE_EH_HANDLER (insn));
- tmp = eh_stack;
- eh_stack = XEXP (eh_stack, 1);
- free_INSN_LIST_node (tmp);
- break;
-
- case NOTE_INSN_BLOCK_BEG:
- case NOTE_INSN_BLOCK_END:
- /* BLOCK_END and BLOCK_BEG notes only exist in the `final' pass. */
- gcc_unreachable ();
-
- default:
- break;
- }
- }
-
- /* Too many EH_REGION_BEG notes. */
- gcc_assert (!eh_stack);
- return 0;
-}
-
-struct tree_opt_pass pass_remove_unnecessary_notes =
-{
- "eunotes", /* name */
- NULL, /* gate */
- remove_unnecessary_notes, /* 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 */
-};
-
/* Emit insn(s) of given code and pattern
at a specified place within the doubly-linked list.
diff --git a/gcc/final.c b/gcc/final.c
index f233f12219a..4a5fd1815d8 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -1417,7 +1417,6 @@ final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file,
function. */
if (write_symbols)
{
- remove_unnecessary_notes ();
reemit_insn_block_notes ();
number_blocks (current_function_decl);
/* We never actually put out begin/end notes for the top-level
diff --git a/gcc/function.c b/gcc/function.c
index 988d613c4d7..2e9aec05c82 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -331,7 +331,7 @@ free_after_compilation (struct function *f)
f->x_return_label = NULL;
f->x_naked_return_label = NULL;
f->x_stack_slot_list = NULL;
- f->x_tail_recursion_reentry = NULL;
+ f->x_stack_check_probe_note = NULL;
f->x_arg_pointer_save_area = NULL;
f->x_parm_birth_insn = NULL;
f->original_arg_vector = NULL;
@@ -4224,8 +4224,8 @@ expand_function_start (tree subr)
as opposed to parm setup. */
emit_note (NOTE_INSN_FUNCTION_BEG);
- if (!NOTE_P (get_last_insn ()))
- emit_note (NOTE_INSN_DELETED);
+ gcc_assert (NOTE_P (get_last_insn ()));
+
parm_birth_insn = get_last_insn ();
if (current_function_profile)
@@ -4235,10 +4235,10 @@ expand_function_start (tree subr)
#endif
}
- /* After the display initializations is where the tail-recursion label
- should go, if we end up needing one. Ensure we have a NOTE here
- since some things (like trampolines) get placed before this. */
- tail_recursion_reentry = emit_note (NOTE_INSN_DELETED);
+ /* After the display initializations is where the stack checking
+ probe should go. */
+ if(flag_stack_check)
+ stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
/* Make sure there is a line number after the function entry setup code. */
force_next_line_note ();
@@ -4364,7 +4364,7 @@ expand_function_end (void)
GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
seq = get_insns ();
end_sequence ();
- emit_insn_before (seq, tail_recursion_reentry);
+ emit_insn_before (seq, stack_check_probe_note);
break;
}
}
diff --git a/gcc/function.h b/gcc/function.h
index 1b2484e4522..4a60eb2d705 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -239,7 +239,7 @@ struct function GTY(())
rtx x_stack_slot_list;
/* Place after which to insert the tail_recursion_label if we need one. */
- rtx x_tail_recursion_reentry;
+ rtx x_stack_check_probe_note;
/* Location at which to save the argument pointer if it will need to be
referenced. There are two cases where this is done: if nonlocal gotos
@@ -503,7 +503,7 @@ extern int trampolines_created;
#define stack_slot_list (cfun->x_stack_slot_list)
#define parm_birth_insn (cfun->x_parm_birth_insn)
#define frame_offset (cfun->x_frame_offset)
-#define tail_recursion_reentry (cfun->x_tail_recursion_reentry)
+#define stack_check_probe_note (cfun->x_stack_check_probe_note)
#define arg_pointer_save_area (cfun->x_arg_pointer_save_area)
#define used_temp_slots (cfun->x_used_temp_slots)
#define avail_temp_slots (cfun->x_avail_temp_slots)
diff --git a/gcc/passes.c b/gcc/passes.c
index 85bfefaf95d..4dd4ac8d8d8 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -622,7 +622,6 @@ init_optimization_passes (void)
*p = NULL;
p = &pass_rest_of_compilation.sub;
- NEXT_PASS (pass_remove_unnecessary_notes);
NEXT_PASS (pass_init_function);
NEXT_PASS (pass_jump);
NEXT_PASS (pass_insn_locators_initialize);
diff --git a/gcc/rtl.h b/gcc/rtl.h
index cad48cbc6f9..989bea8dc55 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2065,7 +2065,6 @@ extern void remove_insn (rtx);
extern void emit_insn_after_with_line_notes (rtx, rtx, rtx);
extern rtx emit (rtx);
extern void renumber_insns (void);
-extern unsigned int remove_unnecessary_notes (void);
extern rtx delete_insn (rtx);
extern rtx entry_of_function (void);
extern void delete_insn_chain (rtx, rtx);
diff --git a/gcc/stmt.c b/gcc/stmt.c
index a3e3db3b3b6..be3e876f589 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2364,19 +2364,9 @@ expand_case (tree exp)
}
- /* Make sure start points to something that won't need any
- transformation before the end of this function. */
- start = get_last_insn ();
- if (! NOTE_P (start))
- {
- emit_note (NOTE_INSN_DELETED);
- start = get_last_insn ();
- }
-
+ before_case = start = get_last_insn ();
default_label = label_rtx (default_label_decl);
- before_case = get_last_insn ();
-
/* Get upper and lower bounds of case values. */
uniq = 0;
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 7f05d3c2ee1..5e0b9233e1c 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -322,7 +322,6 @@ extern struct tree_opt_pass pass_free_datastructures;
extern struct tree_opt_pass pass_init_datastructures;
extern struct tree_opt_pass pass_fixup_cfg;
-extern struct tree_opt_pass pass_remove_unnecessary_notes;
extern struct tree_opt_pass pass_init_function;
extern struct tree_opt_pass pass_jump;
extern struct tree_opt_pass pass_insn_locators_initialize;
OpenPOWER on IntegriCloud