PR gas/2582
authorNick Clifton <nickc@redhat.com>
Fri, 5 May 2006 16:55:28 +0000 (16:55 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 5 May 2006 16:55:28 +0000 (16:55 +0000)
* dwarf2dbg.c (INSERT_DIR_SEPARATOR): New macro.  Handles the insertion of a
  directory separator character into a string at a given offset.  Uses
  heuristics to decide when to use a backslash character rather than a
  forward-slash character.
  (dwarf2_directive_loc): Use the macro.
  (out_debug_info): Likewise.

gas/ChangeLog
gas/dwarf2dbg.c

index 6bac5b5..82de3cc 100644 (file)
@@ -1,3 +1,13 @@
+2006-05-05  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/2582
+       * dwarf2dbg.c (INSERT_DIR_SEPARATOR): New macro.  Handles the
+       insertion of a directory separator character into a string at a
+       given offset.  Uses heuristics to decide when to use a backslash
+       character rather than a forward-slash character.
+       (dwarf2_directive_loc): Use the macro.
+       (out_debug_info): Likewise.
+
 2006-05-05  Thiemo Seufer  <ths@mips.com>
             David Ung  <davidu@mips.com>
 
index 661962f..65a0a26 100644 (file)
 #include "dwarf2dbg.h"
 #include <filenames.h>
 
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+/* We need to decide which character to use as a directory separator.
+   Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
+   necessarily mean that the backslash character is the one to use.
+   Some environments, eg Cygwin, can support both naming conventions.
+   So we use the heuristic that we only need to use the backslash if
+   the path is an absolute path starting with a DOS style drive
+   selector.  eg C: or D:  */
+# define INSERT_DIR_SEPARATOR(string, offset) \
+  do \
+    { \
+      if (offset > 1 \
+          && string[0] != 0 \
+          && string[1] == ':') \
+       string [offset] = '\\'; \
+      else \
+       string [offset] = '/'; \
+    } \
+  while (0)
+#else
+# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
+#endif
+
 #ifndef DWARF2_FORMAT
 # define DWARF2_FORMAT() dwarf2_format_32bit
 #endif
@@ -569,7 +592,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
          char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
 
          memcpy (cp, dirs[files[filenum].dir], dir_len);
-         cp[dir_len] = '/';
+         INSERT_DIR_SEPARATOR (cp, dir_len);
          memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
          cp[dir_len + file_len + 1] = '\0';
          listing_source_file (cp);
@@ -1464,7 +1487,7 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg)
       len = strlen (dirs[files[1].dir]);
       p = frag_more (len + 1);
       memcpy (p, dirs[files[1].dir], len);
-      p[len] = '/';
+      INSERT_DIR_SEPARATOR (p, len);
     }
   len = strlen (files[1].filename) + 1;
   p = frag_more (len);