/* Generic stabs parsing for gas.
- Copyright (C) 1989, 90, 91, 93, 94, 95, 96, 97, 98, 99, 2000
+ Copyright 1989, 1990, 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
#include "aout/stab_gnu.h"
+/* Holds whether the assembler is generating stabs line debugging
+ information or not. Potentially used by md_cleanup function. */
+
+int outputting_stabs_line_debug = 0;
+
static void s_stab_generic PARAMS ((int, char *, char *));
static void generate_asm_file PARAMS ((int, char *));
char *stabstr_secname;
{
long longint;
- char *string;
+ char *string, *saved_string_obstack_end;
int type;
int other;
int desc;
'd' indicating which type of .stab this is. */
if (what != 's')
- string = "";
+ {
+ string = "";
+ saved_string_obstack_end = 0;
+ }
else
{
int length;
string = demand_copy_C_string (&length);
+ /* FIXME: We should probably find some other temporary storage
+ for string, rather than leaking memory if someone else
+ happens to use the notes obstack. */
+ saved_string_obstack_end = notes.next_free;
SKIP_WHITESPACE ();
if (*input_line_pointer == ',')
input_line_pointer++;
stroff = get_stab_string_offset (string, stabstr_secname);
if (what == 's')
{
- /* release the string */
- obstack_free (¬es, string);
+ /* Release the string, if nobody else has used the obstack. */
+ if (saved_string_obstack_end == notes.next_free)
+ obstack_free (¬es, string);
}
/* At least for now, stabs in a special stab section are always
char *tmp = file;
char *endp = file + strlen (file);
char *bufp = buf;
-
+
if (last_file != NULL
&& strcmp (last_file, file) == 0)
return;
-
+
/* 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
existing stabs hook, which expect to see a string, rather than
doubled up backslashes), the symbol name, and the other characters
that make up a stabs file directive. */
bufp = buf = xmalloc (2 * strlen (file) + strlen (sym) + 12);
-
+
*bufp++ = '"';
while (tmp < endp)
{
char *bslash = strchr (tmp, '\\');
int len = (bslash ? (bslash - tmp + 1) : strlen (tmp));
-
+
/* Double all backslashes, since demand_copy_C_string (used by
s_stab to extract the part in quotes) will try to replace them as
escape sequences. backslash may appear in a filespec. */
strncpy (bufp, tmp, len);
-
+
tmp += len;
bufp += len;
if (last_file != NULL)
free (last_file);
last_file = xstrdup (file);
-
+
free (buf);
input_line_pointer = hold;
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;
+
/* 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
existing stabs hook, which expect to see a string, rather than
colon (sym);
input_line_pointer = hold;
+ outputting_stabs_line_debug = 0;
}
/* Emit a function stab.