summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog40
-rw-r--r--gcc/Makefile.in6
-rw-r--r--gcc/cfglayout.c175
-rw-r--r--gcc/cfglayout.h4
-rw-r--r--gcc/combine.c2
-rw-r--r--gcc/emit-rtl.c42
-rw-r--r--gcc/final.c79
-rw-r--r--gcc/function.c18
-rw-r--r--gcc/ifcvt.c30
-rw-r--r--gcc/integrate.c6
-rw-r--r--gcc/jump.c4
-rw-r--r--gcc/print-rtl.c12
-rw-r--r--gcc/recog.c4
-rw-r--r--gcc/rtl.def6
-rw-r--r--gcc/rtl.h17
-rw-r--r--gcc/toplev.c2
-rw-r--r--gcc/unroll.c6
17 files changed, 324 insertions, 129 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33c4a2304fe..ccf8cccf6cd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,43 @@
+Sun Jun 8 21:27:41 CEST 2003 Jan Hubicka <jh@suse.cz>
+
+ * cfglayout.c (insn_scope): New static function
+ (block_locators_*, line_locators*, file_locators*): New static varrays.
+ (scope_to_insns_initialize): Use them.
+ (insn_line, insn_file): New functions.
+ (scope_to_insns_finalize): Use insn_scope.
+ (prologue_locator, epilogue_locator): New global variables.
+ * emit-rt.c (try_split, make_insn_raw, make_jump_insn_raw,
+ make_call_insn_raw, emit_copy_of_insn_after): Use locators.
+ (emit_insn_after_scope, emit_insn_before_scope
+ emit_jump_insn_after_scope, emit_jump_insn_before_scope
+ emit_call_insn_after_scope, emit_call_insn_before_scope): Rename to...
+ (emit_insn_after_setloc, emit_insn_before_setloc
+ emit_jump_insn_after_setloc, emit_jump_insn_before_setloc
+ emit_call_insn_after_setloc, emit_call_insn_before_setloc): ... these;
+ use locators.
+ * final.c (notice_source_line): Use locators.
+ (final_start_function): Set initial source file and line.
+ (final_scan_insn): Use locators.
+ * ifcvt.c (noce_try_store_flag, noce_try_store_flag_constants,
+ noce_try_addcc, noce_try_store_flag_mask, noce_try_cmove,
+ noce_try_cmove_arith, noce_try_minmax, noce_try_abs,
+ noce_process_if_block, find_cond_trap): Likewise.
+ * integrate.c (copy_insn_list): Likewise.
+ * jump.c (duplicate_loop_exit_test): LIkewise.
+ * print-rtl.c (print_rtx): Print locators.
+ * recog.c (peephole2_optimize): Likewise.
+ * rtl.h (INSN_SCOPE): Remove.
+ (emit_insn_after_scope, emit_insn_before_scope
+ emit_jump_insn_after_scope, emit_jump_insn_before_scope
+ emit_call_insn_after_scope, emit_call_insn_before_scope): Rename to...
+ (emit_insn_after_setloc, emit_insn_before_setloc
+ emit_jump_insn_after_setloc, emit_jump_insn_before_setloc
+ emit_call_insn_after_setloc, emit_call_insn_before_setloc): ... these;
+ (insn_file, insn_line, prologue_locator, epilogue_locator): Declare.
+ * unroll.c (copy_loop_body): Use locators.
+ * function.c (set_insn_locators): New function.
+ (thread_prologue_and_epilogue_insns): Set the locators accordingly.
+
2003-06-08 Kazu Hirata <kazu@cs.umass.edu>
* config/h8300/h8300.h (LONG_LONG_TYPE_SIZE): Set to 64.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 11ab0c24806..535e50f04a2 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1775,7 +1775,7 @@ tracer.o : tracer.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_
$(PARAMS_H) $(COVERAGE_H)
cfglayout.o : cfglayout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(TREE_H) insn-config.h $(BASIC_BLOCK_H) hard-reg-set.h output.h \
- function.h cfglayout.h cfgloop.h $(TARGET_H)
+ function.h cfglayout.h cfgloop.h $(TARGET_H) gt-cfglayout.h $(GGC_H)
timevar.o : timevar.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TIMEVAR_H) flags.h \
intl.h toplev.h
regrename.o : regrename.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
@@ -1995,7 +1995,7 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h $(srcdir)/cpplib.h \
$(srcdir)/fold-const.c $(srcdir)/function.c \
$(srcdir)/gcse.c $(srcdir)/integrate.c $(srcdir)/lists.c $(srcdir)/optabs.c \
$(srcdir)/profile.c $(srcdir)/ra-build.c $(srcdir)/regclass.c \
- $(srcdir)/reg-stack.c \
+ $(srcdir)/reg-stack.c $(srcdir)/cfglayout.c \
$(srcdir)/sdbout.c $(srcdir)/stmt.c $(srcdir)/stor-layout.c \
$(srcdir)/stringpool.c $(srcdir)/tree.c $(srcdir)/varasm.c \
$(out_file) \
@@ -2013,7 +2013,7 @@ gt-lists.h gt-alias.h gt-cselib.h gt-fold-const.h gt-gcse.h \
gt-expr.h gt-sdbout.h gt-optabs.h gt-bitmap.h \
gt-dwarf2out.h gt-ra-build.h gt-reg-stack.h gt-dwarf2asm.h \
gt-dbxout.h gt-c-common.h gt-c-decl.h gt-c-parse.h \
-gt-c-pragma.h gt-c-objc-common.h gtype-c.h gt-input.h \
+gt-c-pragma.h gt-c-objc-common.h gtype-c.h gt-input.h gt-cfglayout.h \
gt-stringpool.h : s-gtype ; @true
gtyp-gen.h: Makefile
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index 83634dd3d3a..5bd3ca05655 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "cfglayout.h"
#include "cfgloop.h"
#include "target.h"
+#include "ggc.h"
/* The contents of the current function definition are allocated
in this obstack, and all are freed at the end of the function. */
@@ -54,6 +55,7 @@ static void cleanup_unconditional_jumps PARAMS ((struct loops *));
static void fixup_fallthru_exit_predecessor PARAMS ((void));
static rtx duplicate_insn_chain PARAMS ((rtx, rtx));
static void break_superblocks PARAMS ((void));
+static tree insn_scope PARAMS ((rtx));
rtx
unlink_insn_chain (first, last)
@@ -212,22 +214,83 @@ record_effective_endpoints ()
cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
}
-/* Build a varray mapping INSN_UID to lexical block. Return it. */
+/* Data structures representing mapping of INSN_LOCATOR into scope blocks, line
+ numbers and files. In order to be GGC friendly we need to use separate
+ varrays. This also slightly improve the memory locality in binary search.
+ The _locs array contains locators where the given property change. The
+ block_locators_blocks contains the scope block that is used for all insn
+ locator greater than corresponding block_locators_locs value and smaller
+ than the following one. Similarly for the other properties. */
+static GTY(()) varray_type block_locators_locs;
+static GTY(()) varray_type block_locators_blocks;
+static GTY(()) varray_type line_locators_locs;
+static GTY(()) varray_type line_locators_lines;
+static GTY(()) varray_type file_locators_locs;
+static GTY(()) varray_type file_locators_files;
+int prologue_locator;
+int epilogue_locator;
+
+/* During the RTL expansion the lexical blocks and line numbers are
+ represented via INSN_NOTEs. Replace them by representation using
+ INSN_LOCATORs. */
void
-scope_to_insns_initialize ()
+insn_locators_initialize ()
{
tree block = NULL;
+ tree last_block = NULL;
rtx insn, next;
+ int loc = 0;
+ int line_number = 0, last_line_number = 0;
+ char *file_name = NULL, *last_file_name = NULL;
+
+ prologue_locator = epilogue_locator = 0;
+
+ VARRAY_INT_INIT (block_locators_locs, 32, "block_locators_locs");
+ VARRAY_TREE_INIT (block_locators_blocks, 32, "block_locators_blocks");
+ VARRAY_INT_INIT (line_locators_locs, 32, "line_locators_locs");
+ VARRAY_INT_INIT (line_locators_lines, 32, "line_locators_lines");
+ VARRAY_INT_INIT (file_locators_locs, 32, "file_locators_locs");
+ VARRAY_CHAR_PTR_INIT (file_locators_files, 32, "file_locators_files");
for (insn = get_insns (); insn; insn = next)
{
next = NEXT_INSN (insn);
- if (active_insn_p (insn)
- && GET_CODE (PATTERN (insn)) != ADDR_VEC
- && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
- INSN_SCOPE (insn) = block;
+ if ((active_insn_p (insn)
+ && GET_CODE (PATTERN (insn)) != ADDR_VEC
+ && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
+ || !NEXT_INSN (insn)
+ || (!prologue_locator && file_name))
+ {
+ if (last_block != block)
+ {
+ loc++;
+ VARRAY_PUSH_INT (block_locators_locs, loc);
+ VARRAY_PUSH_TREE (block_locators_blocks, block);
+ last_block = block;
+ }
+ if (last_line_number != line_number)
+ {
+ loc++;
+ VARRAY_PUSH_INT (line_locators_locs, loc);
+ VARRAY_PUSH_INT (line_locators_lines, line_number);
+ last_line_number = line_number;
+ }
+ if (last_file_name != file_name)
+ {
+ loc++;
+ VARRAY_PUSH_INT (file_locators_locs, loc);
+ VARRAY_PUSH_CHAR_PTR (file_locators_files, file_name);
+ last_file_name = file_name;
+ }
+ }
+ if (!prologue_locator && file_name)
+ prologue_locator = loc;
+ if (!NEXT_INSN (insn))
+ epilogue_locator = loc;
+ if (active_insn_p (insn))
+ INSN_LOCATOR (insn) = loc;
else if (GET_CODE (insn) == NOTE)
{
switch (NOTE_LINE_NUMBER (insn))
@@ -243,6 +306,11 @@ scope_to_insns_initialize ()
delete_insn (insn);
break;
default:
+ if (NOTE_LINE_NUMBER (insn) > 0)
+ {
+ line_number = NOTE_LINE_NUMBER (insn);
+ file_name = (char *)NOTE_SOURCE_FILE (insn);
+ }
break;
}
}
@@ -330,11 +398,98 @@ change_scope (orig_insn, s1, s2)
}
}
+/* Return lexical scope block insn belong to. */
+static tree
+insn_scope (insn)
+ rtx insn;
+{
+ int max = VARRAY_ACTIVE_SIZE (block_locators_locs);
+ int min = 0;
+ int loc = INSN_LOCATOR (insn);
+
+ if (!max || !loc)
+ return NULL;
+ while (1)
+ {
+ int pos = (min + max) / 2;
+ int tmp = VARRAY_INT (block_locators_locs, pos);
+
+ if (tmp <= loc && min != pos)
+ min = pos;
+ else if (tmp > loc && max != pos)
+ max = pos;
+ else
+ {
+ min = pos;
+ break;
+ }
+ }
+ return VARRAY_TREE (block_locators_blocks, min);
+}
+
+/* Return line number of the statement that produced this insn. */
+int
+insn_line (insn)
+ rtx insn;
+{
+ int max = VARRAY_ACTIVE_SIZE (line_locators_locs);
+ int min = 0;
+ int loc = INSN_LOCATOR (insn);
+
+ if (!max || !loc)
+ return 0;
+ while (1)
+ {
+ int pos = (min + max) / 2;
+ int tmp = VARRAY_INT (line_locators_locs, pos);
+
+ if (tmp <= loc && min != pos)
+ min = pos;
+ else if (tmp > loc && max != pos)
+ max = pos;
+ else
+ {
+ min = pos;
+ break;
+ }
+ }
+ return VARRAY_INT (line_locators_lines, min);
+}
+
+/* Return source file of the statement that produced this insn. */
+const char *
+insn_file (insn)
+ rtx insn;
+{
+ int max = VARRAY_ACTIVE_SIZE (file_locators_locs);
+ int min = 0;
+ int loc = INSN_LOCATOR (insn);
+
+ if (!max || !loc)
+ return NULL;
+ while (1)
+ {
+ int pos = (min + max) / 2;
+ int tmp = VARRAY_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);
+}
+
/* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
on the scope tree and the newly reordered instructions. */
void
-scope_to_insns_finalize ()
+reemit_insn_block_notes ()
{
tree cur_block = DECL_INITIAL (cfun->decl);
rtx insn, note;
@@ -346,7 +501,7 @@ scope_to_insns_finalize ()
{
tree this_block;
- this_block = INSN_SCOPE (insn);
+ this_block = insn_scope (insn);
/* For sequences compute scope resulting from merging all scopes
of instructions nested inside. */
if (GET_CODE (PATTERN (insn)) == SEQUENCE)
@@ -357,7 +512,7 @@ scope_to_insns_finalize ()
this_block = NULL;
for (i = 0; i < XVECLEN (body, 0); i++)
this_block = choose_inner_scope (this_block,
- INSN_SCOPE (XVECEXP (body, 0, i)));
+ insn_scope (XVECEXP (body, 0, i)));
}
if (! this_block)
continue;
@@ -1051,3 +1206,5 @@ cfg_layout_finalize ()
verify_flow_info ();
#endif
}
+
+#include "gt-cfglayout.h"
diff --git a/gcc/cfglayout.h b/gcc/cfglayout.h
index 48f11af753b..4ae8b6677c9 100644
--- a/gcc/cfglayout.h
+++ b/gcc/cfglayout.h
@@ -41,5 +41,5 @@ extern void cfg_layout_initialize PARAMS ((struct loops *));
extern void cfg_layout_finalize PARAMS ((void));
extern bool cfg_layout_can_duplicate_bb_p PARAMS ((basic_block));
extern basic_block cfg_layout_duplicate_bb PARAMS ((basic_block, edge));
-extern void scope_to_insns_initialize PARAMS ((void));
-extern void scope_to_insns_finalize PARAMS ((void));
+extern void insn_locators_initialize PARAMS ((void));
+extern void reemit_insn_block_notes PARAMS ((void));
diff --git a/gcc/combine.c b/gcc/combine.c
index 68214e9b198..3e2f089bed9 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1702,7 +1702,7 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
as I2 will not cause a problem. */
i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
- BLOCK_FOR_INSN (i2), INSN_SCOPE (i2),
+ BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
NULL_RTX);
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index de6e94cb550..208af572c6d 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -3586,7 +3586,7 @@ try_split (pat, trial, last)
}
}
- tem = emit_insn_after_scope (seq, trial, INSN_SCOPE (trial));
+ tem = emit_insn_after_setloc (seq, trial, INSN_LOCATOR (trial));
delete_insn (trial);
if (has_barrier)
@@ -3624,7 +3624,7 @@ make_insn_raw (pattern)
INSN_CODE (insn) = -1;
LOG_LINKS (insn) = NULL;
REG_NOTES (insn) = NULL;
- INSN_SCOPE (insn) = NULL;
+ INSN_LOCATOR (insn) = 0;
BLOCK_FOR_INSN (insn) = NULL;
#ifdef ENABLE_RTL_CHECKING
@@ -3658,7 +3658,7 @@ make_jump_insn_raw (pattern)
LOG_LINKS (insn) = NULL;
REG_NOTES (insn) = NULL;
JUMP_LABEL (insn) = NULL;
- INSN_SCOPE (insn) = NULL;
+ INSN_LOCATOR (insn) = 0;
BLOCK_FOR_INSN (insn) = NULL;
return insn;
@@ -3680,7 +3680,7 @@ make_call_insn_raw (pattern)
LOG_LINKS (insn) = NULL;
REG_NOTES (insn) = NULL;
CALL_INSN_FUNCTION_USAGE (insn) = NULL;
- INSN_SCOPE (insn) = NULL;
+ INSN_LOCATOR (insn) = 0;
BLOCK_FOR_INSN (insn) = NULL;
return insn;
@@ -4653,11 +4653,11 @@ emit_line_note_after (file, line, after)
return note;
}
-/* Like emit_insn_after, but set INSN_SCOPE according to SCOPE. */
+/* Like emit_insn_after, but set INSN_LOCATOR according to SCOPE. */
rtx
-emit_insn_after_scope (pattern, after, scope)
+emit_insn_after_setloc (pattern, after, loc)
rtx pattern, after;
- tree scope;
+ int loc;
{
rtx last = emit_insn_after (pattern, after);
@@ -4665,7 +4665,7 @@ emit_insn_after_scope (pattern, after, scope)
while (1)
{
if (active_insn_p (after))
- INSN_SCOPE (after) = scope;
+ INSN_LOCATOR (after) = loc;
if (after == last)
break;
after = NEXT_INSN (after);
@@ -4673,11 +4673,11 @@ emit_insn_after_scope (pattern, after, scope)
return last;
}
-/* Like emit_jump_insn_after, but set INSN_SCOPE according to SCOPE. */
+/* Like emit_jump_insn_after, but set INSN_LOCATOR according to SCOPE. */
rtx
-emit_jump_insn_after_scope (pattern, after, scope)
+emit_jump_insn_after_setloc (pattern, after, loc)
rtx pattern, after;
- tree scope;
+ int loc;
{
rtx last = emit_jump_insn_after (pattern, after);
@@ -4685,7 +4685,7 @@ emit_jump_insn_after_scope (pattern, after, scope)
while (1)
{
if (active_insn_p (after))
- INSN_SCOPE (after) = scope;
+ INSN_LOCATOR (after) = loc;
if (after == last)
break;
after = NEXT_INSN (after);
@@ -4693,11 +4693,11 @@ emit_jump_insn_after_scope (pattern, after, scope)
return last;
}
-/* Like emit_call_insn_after, but set INSN_SCOPE according to SCOPE. */
+/* Like emit_call_insn_after, but set INSN_LOCATOR according to SCOPE. */
rtx
-emit_call_insn_after_scope (pattern, after, scope)
+emit_call_insn_after_setloc (pattern, after, loc)
rtx pattern, after;
- tree scope;
+ int loc;
{
rtx last = emit_call_insn_after (pattern, after);
@@ -4705,7 +4705,7 @@ emit_call_insn_after_scope (pattern, after, scope)
while (1)
{
if (active_insn_p (after))
- INSN_SCOPE (after) = scope;
+ INSN_LOCATOR (after) = loc;
if (after == last)
break;
after = NEXT_INSN (after);
@@ -4713,11 +4713,11 @@ emit_call_insn_after_scope (pattern, after, scope)
return last;
}
-/* Like emit_insn_before, but set INSN_SCOPE according to SCOPE. */
+/* Like emit_insn_before, but set INSN_LOCATOR according to SCOPE. */
rtx
-emit_insn_before_scope (pattern, before, scope)
+emit_insn_before_setloc (pattern, before, loc)
rtx pattern, before;
- tree scope;
+ int loc;
{
rtx first = PREV_INSN (before);
rtx last = emit_insn_before (pattern, before);
@@ -4726,7 +4726,7 @@ emit_insn_before_scope (pattern, before, scope)
while (1)
{
if (active_insn_p (first))
- INSN_SCOPE (first) = scope;
+ INSN_LOCATOR (first) = loc;
if (first == last)
break;
first = NEXT_INSN (first);
@@ -5798,7 +5798,7 @@ emit_copy_of_insn_after (insn, after)
/* Update LABEL_NUSES. */
mark_jump_label (PATTERN (new), new, 0);
- INSN_SCOPE (new) = INSN_SCOPE (insn);
+ INSN_LOCATOR (new) = INSN_LOCATOR (insn);
/* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
make them. */
diff --git a/gcc/final.c b/gcc/final.c
index ab7a635e1e7..dae455d2990 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -205,7 +205,7 @@ static int asm_insn_count PARAMS ((rtx));
#endif
static void profile_function PARAMS ((FILE *));
static void profile_after_prologue PARAMS ((FILE *));
-static void notice_source_line PARAMS ((rtx));
+static bool notice_source_line PARAMS ((rtx));
static rtx walk_alter_subreg PARAMS ((rtx *));
static void output_asm_name PARAMS ((void));
static void output_alternate_entry_point PARAMS ((FILE *, rtx));
@@ -1338,7 +1338,7 @@ asm_insn_count (body)
void
final_start_function (first, file, optimize)
- rtx first;
+ rtx first ATTRIBUTE_UNUSED;
FILE *file;
int optimize ATTRIBUTE_UNUSED;
{
@@ -1359,8 +1359,8 @@ final_start_function (first, file, optimize)
}
#endif
- if (NOTE_LINE_NUMBER (first) != NOTE_INSN_DELETED)
- notice_source_line (first);
+ last_linenum = 0;
+ last_filename = 0;
high_block_linenum = high_function_linenum = last_linenum;
(*debug_hooks->begin_prologue) (last_linenum, last_filename);
@@ -1392,7 +1392,7 @@ final_start_function (first, file, optimize)
if (write_symbols)
{
remove_unnecessary_notes ();
- scope_to_insns_finalize ();
+ reemit_insn_block_notes ();
number_blocks (current_function_decl);
/* We never actually put out begin/end notes for the top-level
block in the function. But, conceptually, that block is
@@ -1821,51 +1821,6 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
default:
if (NOTE_LINE_NUMBER (insn) <= 0)
abort ();
-
- /* This note is a line-number. */
- {
- rtx note;
- int note_after = 0;
-
- /* If there is anything real after this note, output it.
- If another line note follows, omit this one. */
- for (note = NEXT_INSN (insn); note; note = NEXT_INSN (note))
- {
- if (GET_CODE (note) != NOTE && GET_CODE (note) != CODE_LABEL)
- break;
-
- /* These types of notes can be significant
- so make sure the preceding line number stays. */
- else if (GET_CODE (note) == NOTE
- && (NOTE_LINE_NUMBER (note) == NOTE_INSN_BLOCK_BEG
- || NOTE_LINE_NUMBER (note) == NOTE_INSN_BLOCK_END
- || NOTE_LINE_NUMBER (note) == NOTE_INSN_FUNCTION_BEG))
- break;
- else if (GET_CODE (note) == NOTE && NOTE_LINE_NUMBER (note) > 0)
- {
- /* Another line note follows; we can delete this note
- if no intervening line numbers have notes elsewhere. */
- int num;
- for (num = NOTE_LINE_NUMBER (insn) + 1;
- num < NOTE_LINE_NUMBER (note);
- num++)
- if (line_note_exists[num])
- break;
-
- if (num >= NOTE_LINE_NUMBER (note))
- note_after = 1;
- break;
- }
- }
-
- /* Output this line note if it is the first or the last line
- note in a row. */
- if (!note_after)
- {
- notice_source_line (insn);
- (*debug_hooks->source_line) (last_linenum, last_filename);
- }
- }
break;
}
break;
@@ -2091,6 +2046,12 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
break;
}
+ /* Output this line note if it is the first or the last line
+ note in a row. */
+ if (notice_source_line (insn))
+ {
+ (*debug_hooks->source_line) (last_linenum, last_filename);
+ }
if (GET_CODE (body) == ASM_INPUT)
{
@@ -2561,16 +2522,22 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
/* Output debugging info to the assembler file FILE
based on the NOTE-insn INSN, assumed to be a line number. */
-static void
+static bool
notice_source_line (insn)
rtx insn;
{
- const char *filename = NOTE_SOURCE_FILE (insn);
+ const char *filename = insn_file (insn);
+ int linenum = insn_line (insn);
- last_filename = filename;
- last_linenum = NOTE_LINE_NUMBER (insn);
- high_block_linenum = MAX (last_linenum, high_block_linenum);
- high_function_linenum = MAX (last_linenum, high_function_linenum);
+ if (filename && (filename != last_filename || last_linenum != linenum))
+ {
+ last_filename = filename;
+ last_linenum = linenum;
+ high_block_linenum = MAX (last_linenum, high_block_linenum);
+ high_function_linenum = MAX (last_linenum, high_function_linenum);
+ return true;
+ }
+ return false;
}
/* For each operand in INSN, simplify (subreg (reg)) so that it refers
diff --git a/gcc/function.c b/gcc/function.c
index 9924bb589b7..e59bf6a954c 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -300,6 +300,7 @@ static void do_clobber_return_reg PARAMS ((rtx, void *));
static void do_use_return_reg PARAMS ((rtx, void *));
static void instantiate_virtual_regs_lossage PARAMS ((rtx));
static tree split_complex_args (tree);
+static void set_insn_locators (rtx, int);
/* Pointer to chain of `struct function' for containing functions. */
static GTY(()) struct function *outer_function_chain;
@@ -7348,6 +7349,20 @@ record_insns (insns, vecp)
}
}
+/* Set the specified locator to the insn chain. */
+static void
+set_insn_locators (insn, loc)
+ rtx insn;
+ int loc;
+{
+ while (insn != NULL_RTX)
+ {
+ if (INSN_P (insn))
+ INSN_LOCATOR (insn) = loc;
+ insn = NEXT_INSN (insn);
+ }
+}
+
/* Determine how many INSN_UIDs in VEC are part of INSN. Because we can
be running after reorg, SEQUENCE rtl is possible. */
@@ -7754,6 +7769,7 @@ thread_prologue_and_epilogue_insns (f)
seq = get_insns ();
end_sequence ();
+ set_insn_locators (seq, prologue_locator);
/* Can't deal with multiple successors of the entry block
at the moment. Function should always have at least one
@@ -7901,6 +7917,7 @@ thread_prologue_and_epilogue_insns (f)
/* Retain a map of the epilogue insns. */
record_insns (seq, &epilogue);
+ set_insn_locators (seq, epilogue_locator);
seq = get_insns ();
end_sequence ();
@@ -7936,6 +7953,7 @@ epilogue_done:
avoid getting rid of sibcall epilogue insns. Do this before we
actually emit the sequence. */
record_insns (seq, &sibcall_epilogue);
+ set_insn_locators (seq, epilogue_locator);
i = PREV_INSN (insn);
newinsn = emit_insn_before (seq, insn);
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 87479060784..84788f0bd3a 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -718,7 +718,7 @@ noce_try_store_flag (if_info)
seq = get_insns ();
end_sequence ();
- emit_insn_before_scope (seq, if_info->jump, INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
@@ -853,7 +853,7 @@ noce_try_store_flag_constants (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insn_before_scope (seq, if_info->jump, INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
@@ -901,8 +901,8 @@ noce_try_addcc (if_info)
seq = get_insns ();
end_sequence ();
- emit_insn_before_scope (seq, if_info->jump,
- INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump,
+ INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
end_sequence ();
@@ -943,8 +943,8 @@ noce_try_addcc (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insn_before_scope (seq, if_info->jump,
- INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump,
+ INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
@@ -996,8 +996,8 @@ noce_try_store_flag_mask (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insn_before_scope (seq, if_info->jump,
- INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump,
+ INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
@@ -1092,8 +1092,8 @@ noce_try_cmove (if_info)
seq = get_insns ();
end_sequence ();
- emit_insn_before_scope (seq, if_info->jump,
- INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump,
+ INSN_LOCATOR (if_info->insn_a));
return TRUE;
}
else
@@ -1255,7 +1255,7 @@ noce_try_cmove_arith (if_info)
tmp = get_insns ();
end_sequence ();
- emit_insn_before_scope (tmp, if_info->jump, INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (tmp, if_info->jump, INSN_LOCATOR (if_info->insn_a));
return TRUE;
end_seq_and_fail:
@@ -1507,7 +1507,7 @@ noce_try_minmax (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insn_before_scope (seq, if_info->jump, INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1625,7 +1625,7 @@ noce_try_abs (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insn_before_scope (seq, if_info->jump, INSN_SCOPE (if_info->insn_a));
+ emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1945,7 +1945,7 @@ noce_process_if_block (ce_info)
insn_b = get_insns ();
end_sequence ();
- emit_insn_after_scope (insn_b, test_bb->end, INSN_SCOPE (insn_a));
+ emit_insn_after_setloc (insn_b, test_bb->end, INSN_LOCATOR (insn_a));
}
/* Merge the blocks! */
@@ -2548,7 +2548,7 @@ find_cond_trap (test_bb, then_edge, else_edge)
return FALSE;
/* Emit the new insns before cond_earliest. */
- emit_insn_before_scope (seq, cond_earliest, INSN_SCOPE (trap));
+ emit_insn_before_setloc (seq, cond_earliest, INSN_LOCATOR (trap));
/* Delete the trap block if possible. */
remove_edge (trap_bb == then_bb ? then_edge : else_edge);
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 4f31c79fa2d..4152fb27fa4 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -1546,7 +1546,7 @@ copy_insn_list (insns, map, static_chain_value)
#else
try_constants (copy, map);
#endif
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
break;
case JUMP_INSN:
@@ -1567,7 +1567,7 @@ copy_insn_list (insns, map, static_chain_value)
cc0_insn = 0;
#endif
try_constants (copy, map);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
/* If this used to be a conditional jump insn but whose branch
direction is now know, we must do something special. */
@@ -1635,7 +1635,7 @@ copy_insn_list (insns, map, static_chain_value)
SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);
CONST_OR_PURE_CALL_P (copy) = CONST_OR_PURE_CALL_P (insn);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
/* Because the USAGE information potentially contains objects other
than hard registers, we need to copy it. */
diff --git a/gcc/jump.c b/gcc/jump.c
index f15e2abae10..40166b40e31 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -429,7 +429,7 @@ duplicate_loop_exit_test (loop_start)
replace_regs (PATTERN (copy), reg_map, max_reg, 1);
mark_jump_label (PATTERN (copy), copy, 0);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
/* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
make them. */
@@ -455,7 +455,7 @@ duplicate_loop_exit_test (loop_start)
case JUMP_INSN:
copy = emit_jump_insn_before (copy_insn (PATTERN (insn)),
loop_start);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
if (reg_map)
replace_regs (PATTERN (copy), reg_map, max_reg, 1);
mark_jump_label (PATTERN (copy), copy, 0);
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index 3002ccb382b..165db771e35 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -379,7 +379,17 @@ print_rtx (in_rtx)
break;
case 'i':
- if (i == 6 && GET_CODE (in_rtx) == NOTE)
+ if (i == 4 && GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i')
+ {
+#ifndef GENERATOR_FILE
+ /* Pretty-print insn locators. Ignore scoping as it is mostly
+ redundant with line number information and do not print anything
+ when there is no location information available. */
+ if (INSN_LOCATOR (in_rtx) && insn_file (in_rtx))
+ fprintf(outfile, " %s:%i", insn_file (in_rtx), insn_line (in_rtx));
+#endif
+ }
+ else if (i == 6 && GET_CODE (in_rtx) == NOTE)
{
/* This field is only used for NOTE_INSN_DELETED_LABEL, and
other times often contains garbage from INSN->NOTE death. */
diff --git a/gcc/recog.c b/gcc/recog.c
index 6f4a73335e2..8ea1e8d58dc 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -3249,8 +3249,8 @@ peephole2_optimize (dump_file)
REG_EH_REGION, NULL_RTX);
/* Replace the old sequence with the new. */
- try = emit_insn_after_scope (try, peep2_insn_data[i].insn,
- INSN_SCOPE (peep2_insn_data[i].insn));
+ try = emit_insn_after_setloc (try, peep2_insn_data[i].insn,
+ INSN_LOCATOR (peep2_insn_data[i].insn));
before_try = PREV_INSN (insn);
delete_insn_chain (insn, peep2_insn_data[i].insn);
diff --git a/gcc/rtl.def b/gcc/rtl.def
index 6fc29b77ccd..1388b6ffd55 100644
--- a/gcc/rtl.def
+++ b/gcc/rtl.def
@@ -603,18 +603,18 @@ DEF_RTL_EXPR (ATTR_FLAG, "attr_flag", "s", 'x')
---------------------------------------------------------------------- */
/* An instruction that cannot jump. */
-DEF_RTL_EXPR(INSN, "insn", "iuuBteiee", 'i')
+DEF_RTL_EXPR(INSN, "insn", "iuuBieiee", 'i')
/* An instruction that can possibly jump.
Fields ( rtx->fld[] ) have exact same meaning as INSN's. */
-DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "iuuBteiee0", 'i')
+DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "iuuBieiee0", 'i')
/* An instruction that can possibly call a subroutine
but which will not change which instruction comes next
in the current function.
Field ( rtx->fld[9] ) is CALL_INSN_FUNCTION_USAGE.
All other fields ( rtx->fld[] ) have exact same meaning as INSN's. */
-DEF_RTL_EXPR(CALL_INSN, "call_insn", "iuuBteieee", 'i')
+DEF_RTL_EXPR(CALL_INSN, "call_insn", "iuuBieieee", 'i')
/* A marker that indicates that control will not flow through. */
DEF_RTL_EXPR(BARRIER, "barrier", "iuu000000", 'x')
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 3e4a1c02d85..8b2ae092ebb 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -538,7 +538,7 @@ do { \
#define NEXT_INSN(INSN) XEXP (INSN, 2)
#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
-#define INSN_SCOPE(INSN) XTREE (INSN, 4)
+#define INSN_LOCATOR(INSN) XINT (INSN, 4)
/* The body of an insn. */
#define PATTERN(INSN) XEXP (INSN, 5)
@@ -1513,20 +1513,20 @@ extern rtx assign_stack_temp_for_type PARAMS ((enum machine_mode,
extern rtx assign_temp PARAMS ((tree, int, int, int));
/* In emit-rtl.c */
extern rtx emit_insn_before PARAMS ((rtx, rtx));
-extern rtx emit_insn_before_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_insn_before_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_jump_insn_before PARAMS ((rtx, rtx));
-extern rtx emit_jump_insn_before_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_jump_insn_before_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_call_insn_before PARAMS ((rtx, rtx));
-extern rtx emit_call_insn_before_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_call_insn_before_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_barrier_before PARAMS ((rtx));
extern rtx emit_label_before PARAMS ((rtx, rtx));
extern rtx emit_note_before PARAMS ((int, rtx));
extern rtx emit_insn_after PARAMS ((rtx, rtx));
-extern rtx emit_insn_after_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_insn_after_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_jump_insn_after PARAMS ((rtx, rtx));
-extern rtx emit_jump_insn_after_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_jump_insn_after_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_call_insn_after PARAMS ((rtx, rtx));
-extern rtx emit_call_insn_after_scope PARAMS ((rtx, rtx, tree));
+extern rtx emit_call_insn_after_setloc PARAMS ((rtx, rtx, int));
extern rtx emit_barrier_after PARAMS ((rtx));
extern rtx emit_label_after PARAMS ((rtx, rtx));
extern rtx emit_note_after PARAMS ((int, rtx));
@@ -1558,6 +1558,9 @@ extern rtx prev_cc0_setter PARAMS ((rtx));
/* In cfglayout.c */
extern tree choose_inner_scope PARAMS ((tree, tree));
+extern int insn_line PARAMS ((rtx));
+extern const char * insn_file PARAMS ((rtx));
+extern int prologue_locator, epilogue_locator;
/* In jump.c */
extern rtx next_nondeleted_insn PARAMS ((rtx));
diff --git a/gcc/toplev.c b/gcc/toplev.c
index ea9388ca455..85157e7bb0d 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3570,7 +3570,7 @@ rest_of_compilation (tree decl)
timevar_pop (TV_JUMP);
- scope_to_insns_initialize ();
+ insn_locators_initialize ();
/* Complete generation of exception handling code. */
if (doing_eh (0))
{
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 396ec42b93b..43539c34eaf 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -2040,7 +2040,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
copy = emit_insn (pattern);
}
REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
/* If there is a REG_EQUAL note present whose value
is not loop invariant, then delete it, since it
@@ -2094,7 +2094,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
copy = emit_jump_insn (pattern);
REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
if (JUMP_LABEL (insn))
{
@@ -2218,7 +2218,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
copy = emit_call_insn (pattern);
REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
- INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ INSN_LOCATOR (copy) = INSN_LOCATOR (insn);
SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);
CONST_OR_PURE_CALL_P (copy) = CONST_OR_PURE_CALL_P (insn);
OpenPOWER on IntegriCloud