2002-04-20 David S. Miller <davem@redhat.com>
[deliverable/binutils-gdb.git] / gas / stabs.c
index faf3a9c12cc069f9479abc1fa00e48e0fad28346..60b03c49941b3d6613945ee52dd5f94d1c8972ab 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
@@ -185,7 +185,7 @@ s_stab_generic (what, stab_secname, stabstr_secname)
      char *stabstr_secname;
 {
   long longint;
-  char *string;
+  char *string, *saved_string_obstack_end;
   int type;
   int other;
   int desc;
@@ -199,18 +199,25 @@ s_stab_generic (what, stab_secname, stabstr_secname)
      '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++;
       else
        {
-         as_warn (_(".stabs: Missing comma"));
+         as_warn (_(".stab%c: missing comma"), what);
          ignore_rest_of_line ();
          return;
        }
@@ -218,7 +225,7 @@ s_stab_generic (what, stab_secname, stabstr_secname)
 
   if (get_absolute_expression_and_terminator (&longint) != ',')
     {
-      as_warn (_(".stab%c: Missing comma"), what);
+      as_warn (_(".stab%c: missing comma"), what);
       ignore_rest_of_line ();
       return;
     }
@@ -226,7 +233,7 @@ s_stab_generic (what, stab_secname, stabstr_secname)
 
   if (get_absolute_expression_and_terminator (&longint) != ',')
     {
-      as_warn (_(".stab%c: Missing comma"), what);
+      as_warn (_(".stab%c: missing comma"), what);
       ignore_rest_of_line ();
       return;
     }
@@ -237,7 +244,7 @@ s_stab_generic (what, stab_secname, stabstr_secname)
     {
       if (*input_line_pointer != ',')
        {
-         as_warn (_(".stab%c: Missing comma"), what);
+         as_warn (_(".stab%c: missing comma"), what);
          ignore_rest_of_line ();
          return;
        }
@@ -335,8 +342,9 @@ s_stab_generic (what, stab_secname, stabstr_secname)
       stroff = get_stab_string_offset (string, stabstr_secname);
       if (what == 's')
        {
-         /* release the string */
-         obstack_free (&notes, string);
+         /* Release the string, if nobody else has used the obstack.  */
+         if (saved_string_obstack_end == notes.next_free) 
+           obstack_free (&notes, string);
        }
 
       /* At least for now, stabs in a special stab section are always
@@ -461,7 +469,7 @@ s_desc (ignore)
   if (*input_line_pointer != ',')
     {
       *p = 0;
-      as_bad (_("Expected comma after name \"%s\""), name);
+      as_bad (_("expected comma after \"%s\""), name);
       *p = c;
       ignore_rest_of_line ();
     }
@@ -531,7 +539,7 @@ generate_asm_file (type, file)
   while (tmp < endp)
     {
       char *bslash = strchr (tmp, '\\');
-      int len = (bslash ? (bslash - tmp + 1) : strlen (tmp));
+      size_t len = (bslash) ? (size_t) (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
@@ -572,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
@@ -586,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);
This page took 0.024479 seconds and 4 git commands to generate.