other = longint;
desc = get_absolute_expression ();
+
+ if ((desc > 0xffff) || (desc < -0x8000))
+ /* This could happen for example with a source file with a huge
+ number of lines. The only cure is to use a different debug
+ format, probably DWARF. */
+ as_warn (_(".stab%c: description field '%x' too big, try a different debug format"),
+ what, desc);
+
if (what == 's' || what == 'n')
{
if (*input_line_pointer != ',')
if (what == 's')
{
/* Release the string, if nobody else has used the obstack. */
- if (saved_string_obstack_end == notes.next_free)
+ if (saved_string_obstack_end == notes.next_free)
obstack_free (¬es, string);
}
}
else
{
- const char *fake;
symbolS *symbol;
expressionS exp;
/* Arrange for a value representing the current location. */
- fake = FAKE_LABEL_NAME;
- symbol = symbol_new (fake, saved_seg, dot, saved_frag);
+ symbol = symbol_temp_new (saved_seg, dot, saved_frag);
exp.X_op = O_symbol;
exp.X_add_symbol = symbol;
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
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);