diff --git a/gas/ChangeLog b/gas/ChangeLog index b0e1b24eb5..c41372948e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -116,6 +116,13 @@ * config/tc-cris.c (md_apply_fix3): Cast value, not pointer, in val assignment. +2001-11-16 Michael Snyder + + * stabs.c (stabs_generate_asm_lineno): Remember file and line number + from one call to the next, and eliminate consecutive duplicates + (thereby emitting only one line symbol per source line). + * dwarf2dbg.c (dwarf2_gen_line_info): Ditto. + 2001-11-16 Alan Modra * config/tc-m68k.c (md_apply_fix3): Change val back to a signed type. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 9807e5eed8..6e62206703 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -230,11 +230,20 @@ dwarf2_gen_line_info (ofs, loc) { struct line_subseg *ss; struct line_entry *e; + static unsigned int line = -1; + static unsigned int filenum = -1; /* Early out for as-yet incomplete location information. */ if (loc->filenum == 0 || loc->line == 0) return; + /* Don't emit sequences of line symbols for the same line. */ + if (line == loc->line && filenum == loc->filenum) + return; + + line = loc->line; + filenum = loc->filenum; + e = (struct line_entry *) xmalloc (sizeof (*e)); e->next = NULL; e->frag = frag_now; diff --git a/gas/stabs.c b/gas/stabs.c index cd5a705ff2..60b03c4994 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -580,10 +580,9 @@ stabs_generate_asm_lineno () unsigned int lineno; char *buf; char sym[30]; - - /* Let the world know that we are in the middle of generating a - piece of stabs line debugging information. */ - outputting_stabs_line_debug = 1; + /* Remember the last file/line and avoid duplicates. */ + static unsigned int prev_lineno = -1; + static char *prev_file = NULL; /* Rather than try to do this in some efficient fashion, we just generate a string and then parse it again. That lets us use the @@ -594,6 +593,34 @@ stabs_generate_asm_lineno () as_where (&file, &lineno); + /* Don't emit sequences of stabs for the same line. */ + if (prev_file == NULL) + { + /* First time thru. */ + prev_file = xstrdup (file); + prev_lineno = lineno; + } + else if (lineno == prev_lineno + && strcmp (file, prev_file) == 0) + { + /* Same file/line as last time. */ + return; + } + else + { + /* Remember file/line for next time. */ + prev_lineno = lineno; + if (strcmp (file, prev_file) != 0) + { + free (prev_file); + prev_file = xstrdup (file); + } + } + + /* Let the world know that we are in the middle of generating a + piece of stabs line debugging information. */ + outputting_stabs_line_debug = 1; + generate_asm_file (N_SOL, file); sprintf (sym, "%sL%d", FAKE_LABEL_NAME, label_count);