Fix bug in stabs filename encoding where backslashes are present.
authorTimothy Wall <twall@alum.mit.edu>
Wed, 2 Feb 2000 00:24:17 +0000 (00:24 +0000)
committerTimothy Wall <twall@alum.mit.edu>
Wed, 2 Feb 2000 00:24:17 +0000 (00:24 +0000)
gas/ChangeLog
gas/stabs.c

index 19711d309575f24bd9a3985e0d9e7abfb3d69646..49709ab827842459e4eedc3e6794dce49a6b11e2 100644 (file)
@@ -1,3 +1,9 @@
+2000-02-01  Timothy Wall  <twall@cygnus.com>
+
+       * stabs.c (generate_asm_file): Escape backslashes in stabs file
+       entries, matching the way GCC generates them.  If not escaped, the
+       filename is encoded incorrectly.
+
 2000-01-31  Nick Clifton  <nickc@cygnus.com>
        * config/tc-arm.c (reg_table): Add support for ATPCS register
        naming conventions.
index c8d9a0bc5ce1f577ed111dc641c009efa9f74a0f..7c13c2f1e09b1a2d65618f6021b9dcccd2a3c5ba 100644 (file)
@@ -498,7 +498,7 @@ generate_asm_file (type, file)
   static char *last_file;
   static int label_count;
   char *hold;
-  char buf[100];
+  char *buf = xmalloc (2 * strlen (file) + 10);
   char sym[30];
 
   /* Rather than try to do this in some efficient fashion, we just
@@ -511,10 +511,28 @@ generate_asm_file (type, file)
   if (last_file == NULL
       || strcmp (last_file, file) != 0)
     {
+      char *tmp = file;
+      char *endp = file + strlen(file);
+      char *bufp = buf;
+
       sprintf (sym, "%sF%d", FAKE_LABEL_NAME, label_count);
       ++label_count;
 
-      sprintf (buf, "\"%s\",%d,0,0,%s\n", file, type, sym);
+      *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 (bslash != NULL)
+            *bufp++ = '\\';
+        } 
+      sprintf (bufp, "\",%d,0,0,%s\n", type, sym);
       input_line_pointer = buf;
       s_stab ('s');
       colon (sym);
@@ -525,6 +543,7 @@ generate_asm_file (type, file)
     }
 
   input_line_pointer = hold;
+  free (buf);
 }
 
 /* Generate stabs debugging information for the current line.  This is