[patch gdb]: Fix some DOS-path related issues in gdb

Kai Tietz ktietz70@googlemail.com
Thu Mar 3 12:02:00 GMT 2011


Hello,

This patch fixes some issues related to DOS file-system filenames and
paths. I am not sure, if I
hit all places, nevertheless I am sure I hit most.
This patch uses the libiberty functions & macros about
directory-separator checks, absolute-path checks,
and the filename-comparision functions.

ChangeLog gdb/

2011-03-03  Kai Tietz

       * breakpoint.c (clear_command): Use filename_(n)cmp
       for source-file comparision.
       * bsd-kvm.c (bsd_kvm_open): Use IS_ABSOLUTE_PATH check
       for filename.
       (bsd_kvm_files_info): Use filename_cmp for core-file
       comparision.
       * buildsym.c (patch_subfile_names): Use IS_DIR_SEPRARATOR
       for trailing directory-separator check.
       (watch_main_source_file): Use filename_cmp for mainbase
       comparision.
       * dbxread.c (add_old_header_file): Use filename_cmp for file-name
       comparision.
       (read_dbx_symtab): Handle DOS path-separators. And use filename_cmp
       for filename comparision.
       * elfread.c (find_separate_debug_file_by_buildid): Use
       filename_cmp for object-filename comparision.
       (elfstab_offset_sections): Handle DOS path-separators. And use
       filename_cmp for filename comparision.
       * exec.c (exec_set_section_address): Use filename_cmp
       for file-name comparision.
       * macrotab.c (macro_lookup_inclusion): Likewise.
       * mdebugread.c (pase_partial_symbols): Handle DOS
       path-separators. And use filename_cmp for file-name comparision.
       * minsyms.c (lookup_minimal_symbol): Likewise.
       * nto-procfs.c (procfs_open): Likewise.
       * psymtab.c (read_psymtabs_with_filename): Use filename_cmp
       for file-name comparision.
       * remote-fileio.c (remote_fileio_extract_ptr_w_len): Handle
       DOS path-separators.
       (remote_fileio_func_rename): Use IS_DIR_SEPARATOR and filename_ncmp
       for path comparision.
       * rs6000-nat.c (add_vmap): Use filename_cmp for file-name comparision.
       * solib-som.c (match_main): Likewise.
       * solib.c (solib_read_symbols): Likewise.
       (reload_shared_libraries_1): Likewise.
       * source.c (add_path): Use filename_ncmp for path comparision.
       * symfile.c (separate_debug_file_exists): Use filename_(n)cmp for
       filename comparision.
       (separate_debug_file_exists): Likewise.
       (find_separate_debug_file_by_debuglink): Likewise.
       (reread_symbols): Likewise.
       * symmisc.c (maintenance_print_symbols): Likewise.
       * symtab.c (filename_seen): Likewise.
       (file_matches): Likewise.
       (print_symbol_info): Likewise.
       (not_interesting_fname): Likewise.
       (maybe_add_partial_symtab_filename): Likewise.
       (make_source_files_completion_list): Likewise.
       * xcoffread.c (process_linenos): Likewise.
       (scan_xcoff_symtab): Likewise.
       * xml-support.c (fetch_xml_builtin): Likewise.
       * xml-syscall.c (init_sysinfo): Likewise.
       * coffread.c (coff_getfilename): Handle DOS path-separators.
       * dwarf2read.c (find_file_and_directory): Handle DOS absolute
       paths.
       * fbsd-nat.c (fbsd_make_corefile_notes): Handle DOS path-separators.
       * linux-fork.c (info_checkpoints_command): Likewise.
       * linux-nat.c (linux_nat_make_corefile_notes): Likewise.
       * linux-thread-db.c (try_thread_db_load): Likewise.
       * nto-tdep.c (nto_find_and_open_solib): Likewise.
       * windows-nat.c (_initialize_check_for_gdb_ini): Use
       IS_DIR_SEPARATOR for path-separator check.

Patch was tested for x86_64-w64-mingw32, i686-pc-cygwin, and
x86_64-pc-linux-gnu. Ok for apply?

Regards,
Kai



-- 
|  (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
-------------- next part --------------
Index: gdb/breakpoint.c
===================================================================
--- gdb.orig/breakpoint.c	2011-03-01 09:03:20.000000000 +0100
+++ gdb/breakpoint.c	2011-03-02 12:12:40.027913000 +0100
@@ -39,6 +39,7 @@
 #include "language.h"
 #include "gdb_string.h"
 #include "demangle.h"
+#include "filenames.h"
 #include "annotate.h"
 #include "symfile.h"
 #include "objfiles.h"
@@ -9510,8 +9511,8 @@ clear_command (char *arg, int from_tty)
 				    && b->source_file != NULL
 				    && sal.symtab != NULL
 				    && sal.pspace == loc->pspace
-				    && strcmp (b->source_file,
-					       sal.symtab->filename) == 0
+				    && filename_cmp (b->source_file,
+						     sal.symtab->filename) == 0
 				    && b->line_number == sal.line);
 		  if (pc_match || line_match)
 		    {
Index: gdb/bsd-kvm.c
===================================================================
--- gdb.orig/bsd-kvm.c	2011-01-07 20:36:15.000000000 +0100
+++ gdb/bsd-kvm.c	2011-03-03 10:48:54.750280700 +0100
@@ -36,6 +36,7 @@
 #endif
 #include <paths.h>
 #include "readline/readline.h"
+#include "filenames.h"
 #include <sys/param.h>
 #include <sys/proc.h>
 #include <sys/user.h>
@@ -77,7 +78,7 @@ bsd_kvm_open (char *filename, int from_t
       char *temp;
 
       filename = tilde_expand (filename);
-      if (filename[0] != '/')
+      if (!IS_ABSOLUTE_PATH (filename))
 	{
 	  temp = concat (current_directory, "/", filename, (char *)NULL);
 	  xfree (filename);
@@ -151,7 +152,7 @@ bsd_kvm_xfer_partial (struct target_ops
 static void
 bsd_kvm_files_info (struct target_ops *ops)
 {
-  if (bsd_kvm_corefile && strcmp (bsd_kvm_corefile, _PATH_MEM) != 0)
+  if (bsd_kvm_corefile && filename_cmp (bsd_kvm_corefile, _PATH_MEM) != 0)
     printf_filtered (_("\tUsing the kernel crash dump %s.\n"),
 		     bsd_kvm_corefile);
   else
Index: gdb/buildsym.c
===================================================================
--- gdb.orig/buildsym.c	2011-01-05 23:22:47.000000000 +0100
+++ gdb/buildsym.c	2011-03-03 10:45:56.543151200 +0100
@@ -643,7 +643,7 @@ void
 patch_subfile_names (struct subfile *subfile, char *name)
 {
   if (subfile != NULL && subfile->dirname == NULL && subfile->name != NULL
-      && subfile->name[strlen (subfile->name) - 1] == '/')
+      && IS_DIR_SEPARATOR (subfile->name[strlen (subfile->name) - 1]))
     {
       subfile->dirname = subfile->name;
       subfile->name = xstrdup (name);
@@ -878,7 +878,7 @@ watch_main_source_file_lossage (void)
 	   subfile->next;
 	   subfile = subfile->next)
 	{
-	  if (strcmp (lbasename (subfile->name), mainbase) == 0)
+	  if (filename_cmp (lbasename (subfile->name), mainbase) == 0)
 	    {
 	      ++nr_matches;
 	      mainsub_alias = subfile;
Index: gdb/dbxread.c
===================================================================
--- gdb.orig/dbxread.c	2011-03-01 09:03:20.000000000 +0100
+++ gdb/dbxread.c	2011-03-03 10:56:14.497121400 +0100
@@ -47,6 +47,7 @@
 #include "target.h"
 #include "gdbcore.h"		/* for bfd stuff */
 #include "libaout.h"		/* FIXME Secret internal BFD stuff for a.out */
+#include "filenames.h"
 #include "objfiles.h"
 #include "buildsym.h"
 #include "stabsread.h"
@@ -346,7 +347,7 @@ add_old_header_file (char *name, int ins
   int i;
 
   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
-    if (strcmp (p[i].name, name) == 0 && instance == p[i].instance)
+    if (filename_cmp (p[i].name, name) == 0 && instance == p[i].instance)
       {
 	add_this_object_header_file (i);
 	return;
@@ -1531,6 +1532,13 @@ read_dbx_symtab (struct objfile *objfile
 	       we assume the previous N_SO was a directory name.  */
 
 	    p = strrchr (namestring, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+	    {
+	      char *p2 = strrchr (namestring, '\\');
+	      if (!p || (p2 && p2 > p))
+	        p = p2;
+	    }
+#endif
 	    if (p && *(p + 1) == '\000')
 	      {
 		/* Save the directory name SOs locally, then save it into
@@ -1620,13 +1628,13 @@ read_dbx_symtab (struct objfile *objfile
 	       things like "break c-exp.y:435" need to work (I
 	       suppose the psymtab_include_list could be hashed or put
 	       in a binary tree, if profiling shows this is a major hog).  */
-	    if (pst && strcmp (namestring, pst->filename) == 0)
+	    if (pst && filename_cmp (namestring, pst->filename) == 0)
 	      continue;
 	    {
 	      int i;
 
 	      for (i = 0; i < includes_used; i++)
-		if (strcmp (namestring, psymtab_include_list[i]) == 0)
+		if (filename_cmp (namestring, psymtab_include_list[i]) == 0)
 		  {
 		    i = -1;
 		    break;
Index: gdb/elfread.c
===================================================================
--- gdb.orig/elfread.c	2011-01-07 20:36:16.000000000 +0100
+++ gdb/elfread.c	2011-03-03 11:08:58.354118900 +0100
@@ -37,6 +37,7 @@
 #include "complaints.h"
 #include "demangle.h"
 #include "psympriv.h"
+#include "filenames.h"
 
 extern void _initialize_elfread (void);
 
@@ -704,7 +705,8 @@ find_separate_debug_file_by_buildid (str
       build_id_name = build_id_to_debug_filename (build_id);
       xfree (build_id);
       /* Prevent looping on a stripped .debug file.  */
-      if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
+      if (build_id_name != NULL
+	  && filename_cmp (build_id_name, objfile->name) == 0)
         {
 	  warning (_("\"%s\": separate debug info file has no debug info"),
 		   build_id_name);
@@ -1005,7 +1007,15 @@ elfstab_offset_sections (struct objfile
 
   /* The ELF symbol info doesn't include path names, so strip the path
      (if any) from the psymtab filename.  */
-  while (0 != (p = strchr (filename, '/')))
+  p = strrchr (filename, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+  {
+    char *p2 = strrchr (filename, '\\');
+    if (!p || (p2 && p2 > p))
+      p = p2;
+  }
+#endif
+  if (p)
     filename = p + 1;
 
   /* FIXME:  This linear search could speed up significantly
@@ -1014,7 +1024,7 @@ elfstab_offset_sections (struct objfile
   for (; maybe; maybe = maybe->next)
     {
       if (filename[0] == maybe->filename[0]
-	  && strcmp (filename, maybe->filename) == 0)
+	  && filename_cmp (filename, maybe->filename) == 0)
 	{
 	  /* We found a match.  But there might be several source files
 	     (from different directories) with the same name.  */
Index: gdb/exec.c
===================================================================
--- gdb.orig/exec.c	2011-02-17 22:19:31.000000000 +0100
+++ gdb/exec.c	2011-03-02 12:16:52.525976200 +0100
@@ -25,6 +25,7 @@
 #include "target.h"
 #include "gdbcmd.h"
 #include "language.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "completer.h"
@@ -845,7 +846,7 @@ exec_set_section_address (const char *fi
   table = current_target_sections;
   for (p = table->sections; p < table->sections_end; p++)
     {
-      if (strcmp (filename, p->bfd->filename) == 0
+      if (filename_cmp (filename, p->bfd->filename) == 0
 	  && index == p->the_bfd_section->index)
 	{
 	  p->endaddr += address - p->addr;
Index: gdb/macrotab.c
===================================================================
--- gdb.orig/macrotab.c	2011-01-09 04:20:33.000000000 +0100
+++ gdb/macrotab.c	2011-03-03 10:41:58.796961300 +0100
@@ -21,6 +21,7 @@
 #include "defs.h"
 #include "gdb_obstack.h"
 #include "splay-tree.h"
+#include "filenames.h"
 #include "symtab.h"
 #include "symfile.h"
 #include "objfiles.h"
@@ -500,7 +501,7 @@ struct macro_source_file *
 macro_lookup_inclusion (struct macro_source_file *source, const char *name)
 {
   /* Is SOURCE itself named NAME?  */
-  if (strcmp (name, source->filename) == 0)
+  if (filename_cmp (name, source->filename) == 0)
     return source;
 
   /* The filename in the source structure is probably a full path, but
@@ -510,11 +511,12 @@ macro_lookup_inclusion (struct macro_sou
     int src_name_len = strlen (source->filename);
 
     /* We do mean < here, and not <=; if the lengths are the same,
-       then the strcmp above should have triggered, and we need to
+       then the filename_cmp above should have triggered, and we need to
        check for a slash here.  */
     if (name_len < src_name_len
-        && source->filename[src_name_len - name_len - 1] == '/'
-        && strcmp (name, source->filename + src_name_len - name_len) == 0)
+        && IS_DIR_SEPARATOR (source->filename[src_name_len - name_len - 1])
+        && filename_cmp (name,
+			 source->filename + src_name_len - name_len) == 0)
       return source;
   }
 
Index: gdb/mdebugread.c
===================================================================
--- gdb.orig/mdebugread.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/mdebugread.c	2011-03-03 11:45:18.109912800 +0100
@@ -45,6 +45,7 @@
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "gdbcore.h"
+#include "filenames.h"
 #include "objfiles.h"
 #include "gdb_obstack.h"
 #include "buildsym.h"
@@ -3014,6 +3015,13 @@ parse_partial_symbols (struct objfile *o
 			 the previous N_SO was a directory name.  */
 
 		      p = strrchr (namestring, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+		      {
+			char *p2 = strrchr (namestring, '\\');
+			if (!p || (p2 && p2 > p))
+			  p = p2;
+		      }
+#endif
 		      if (p && *(p + 1) == '\000')
 			continue;		/* Simply ignore directory
 						   name SOs.  */
@@ -3065,15 +3073,15 @@ parse_partial_symbols (struct objfile *o
 			 work (I suppose the psymtab_include_list could be
 			 hashed or put in a binary tree, if profiling shows
 			 this is a major hog).  */
-		      if (pst && strcmp (namestring, pst->filename) == 0)
+		      if (pst && filename_cmp (namestring, pst->filename) == 0)
 			continue;
 
 		      {
 			int i;
 
 			for (i = 0; i < includes_used; i++)
-			  if (strcmp (namestring,
-				      psymtab_include_list[i]) == 0)
+			  if (filename_cmp (namestring,
+					    psymtab_include_list[i]) == 0)
 			    {
 			      i = -1;
 			      break;
Index: gdb/minsyms.c
===================================================================
--- gdb.orig/minsyms.c	2011-01-09 04:20:33.000000000 +0100
+++ gdb/minsyms.c	2011-03-03 10:37:55.989628700 +0100
@@ -43,6 +43,7 @@
 #include "gdb_string.h"
 #include "symtab.h"
 #include "bfd.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "demangle.h"
@@ -200,6 +201,13 @@ lookup_minimal_symbol (const char *name,
   if (sfile != NULL)
     {
       char *p = strrchr (sfile, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      {
+	char *p2 = strrchr (sfile, '\\');
+	if (!p || (p2 && p2 > p))
+	  p = p2;
+      }
+#endif
 
       if (p != NULL)
 	sfile = p + 1;
@@ -260,7 +268,7 @@ lookup_minimal_symbol (const char *name,
                       case mst_file_data:
                       case mst_file_bss:
                         if (sfile == NULL
-			    || strcmp (msymbol->filename, sfile) == 0)
+			    || filename_cmp (msymbol->filename, sfile) == 0)
                           found_file_symbol = msymbol;
                         break;
 
Index: gdb/nto-procfs.c
===================================================================
--- gdb.orig/nto-procfs.c	2011-01-11 16:10:01.000000000 +0100
+++ gdb/nto-procfs.c	2011-03-03 10:35:52.861993500 +0100
@@ -37,6 +37,7 @@
 #include "gdbcore.h"
 #include "inferior.h"
 #include "target.h"
+#include "filenames.h"
 #include "objfiles.h"
 #include "gdbthread.h"
 #include "nto-tdep.h"
@@ -149,7 +150,7 @@ procfs_open (char *arg, int from_tty)
 	}
       else if (*endstr)
 	{
-	  if (*(endstr - 1) == '/')
+	  if (IS_DIR_SEPARATOR (*(endstr - 1)))
 	    *(endstr - 1) = 0;
 	  else
 	    *endstr = 0;
@@ -545,7 +546,7 @@ procfs_meminfo (char *args, int from_tty
 	      if (err != EOK)
 		continue;
 
-	      if (strcmp (map.info.path, printme.name))
+	      if (filename_cmp (map.info.path, printme.name))
 		continue;
 
 	      /* Lower debug_vaddr is always text, if nessessary, swap.  */
Index: gdb/psymtab.c
===================================================================
--- gdb.orig/psymtab.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/psymtab.c	2011-03-02 11:02:58.109876900 +0100
@@ -946,7 +946,7 @@ read_psymtabs_with_filename (struct objf
 
   ALL_OBJFILE_PSYMTABS (objfile, p)
     {
-      if (strcmp (filename, p->filename) == 0)
+      if (filename_cmp (filename, p->filename) == 0)
 	PSYMTAB_TO_SYMTAB (p);
     }
 }
@@ -1614,7 +1614,7 @@ print-psymbols takes an output file name
 
   immediate_quit++;
   ALL_PSYMTABS (objfile, ps)
-    if (symname == NULL || strcmp (symname, ps->filename) == 0)
+    if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
     dump_psymtab (objfile, ps, outfile);
   immediate_quit--;
   do_cleanups (cleanups);
Index: gdb/remote-fileio.c
===================================================================
--- gdb.orig/remote-fileio.c	2011-02-17 22:19:31.000000000 +0100
+++ gdb/remote-fileio.c	2011-03-03 10:24:24.441575200 +0100
@@ -31,6 +31,7 @@
 #include "remote-fileio.h"
 #include "event-loop.h"
 #include "target.h"
+#include "filenames.h"
 
 #include <fcntl.h>
 #include <sys/time.h>
@@ -378,6 +379,15 @@ remote_fileio_extract_ptr_w_len (char **
   if (!buf || !*buf || !**buf || !ptrval || !length)
     return -1;
   c = strchr (*buf, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+  {
+    char *c2 = strchr (*buf, '\\');
+    if (!c)
+      c = c2;
+    else if (c2 && c2 < c)
+      c = c2;
+  }
+#endif
   if (!c)
     return -1;
   *c++ = '\0';
@@ -1020,8 +1030,8 @@ remote_fileio_func_rename (char *buf)
 		  cygwin_conv_path (CCP_WIN_A_TO_POSIX, newpath, newfullpath,
 				    PATH_MAX);
 		  len = strlen (oldfullpath);
-		  if (newfullpath[len] == '/'
-		      && !strncmp (oldfullpath, newfullpath, len))
+		  if (IS_DIR_SEPARATOR (newfullpath[len])
+		      && !filename_ncmp (oldfullpath, newfullpath, len))
 		    errno = EINVAL;
 		  else
 		    errno = EEXIST;
Index: gdb/rs6000-nat.c
===================================================================
--- gdb.orig/rs6000-nat.c	2011-01-11 16:10:01.000000000 +0100
+++ gdb/rs6000-nat.c	2011-03-03 12:04:39.160347400 +0100
@@ -24,6 +24,7 @@
 #include "target.h"
 #include "gdbcore.h"
 #include "xcoffsolib.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "libbfd.h"		/* For bfd_default_set_arch_mach (FIXME) */
@@ -769,7 +770,7 @@ add_vmap (LdInfo *ldi)
       last = 0;
       /* FIXME??? am I tossing BFDs?  bfd?  */
       while ((last = bfd_openr_next_archived_file (abfd, last)))
-	if (strcmp (mem, last->filename) == 0)
+	if (filename_cmp (mem, last->filename) == 0)
 	  break;
 
       if (!last)
@@ -853,8 +854,8 @@ vmap_ldinfo (LdInfo *ldi)
 
 	  /* The filenames are not always sufficient to match on.  */
 
-	  if ((name[0] == '/' && strcmp (name, vp->name) != 0)
-	      || (memb[0] && strcmp (memb, vp->member) != 0))
+	  if ((name[0] == '/' && filename_cmp (name, vp->name) != 0)
+	      || (memb[0] && filename_cmp (memb, vp->member) != 0))
 	    continue;
 
 	  /* See if we are referring to the same file.
Index: gdb/solib-som.c
===================================================================
--- gdb.orig/solib-som.c	2011-01-14 19:39:31.000000000 +0100
+++ gdb/solib-som.c	2011-03-03 12:05:28.243580200 +0100
@@ -21,6 +21,7 @@
 #include "defs.h"
 #include "symtab.h"
 #include "bfd.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "gdbcore.h"
@@ -568,7 +569,7 @@ link_map_start (void)
 static int
 match_main (const char *name)
 {
-  return strcmp (name, symfile_objfile->name) == 0;
+  return filename_cmp (name, symfile_objfile->name) == 0;
 }
 
 static struct so_list *
Index: gdb/solib.c
===================================================================
--- gdb.orig/solib.c	2011-02-17 22:19:32.000000000 +0100
+++ gdb/solib.c	2011-03-02 11:06:29.717747700 +0100
@@ -638,7 +638,7 @@ solib_read_symbols (struct so_list *so,
 	  /* Have we already loaded this shared object?  */
 	  ALL_OBJFILES (so->objfile)
 	    {
-	      if (strcmp (so->objfile->name, so->so_name) == 0
+	      if (filename_cmp (so->objfile->name, so->so_name) == 0
 		  && so->objfile->addr_low == so->addr_low)
 		break;
 	    }
@@ -762,7 +762,7 @@ update_solib_list (int from_tty, struct
 	    }
 	  else
 	    {
-	      if (! strcmp (gdb->so_original_name, i->so_original_name))
+	      if (! filename_cmp (gdb->so_original_name, i->so_original_name))
 		break;	      
 	    }
 
@@ -1338,7 +1338,7 @@ reload_shared_libraries_1 (int from_tty)
 	 symbol file, close that.  */
       if ((found_pathname == NULL && was_loaded)
 	  || (found_pathname != NULL
-	      && strcmp (found_pathname, so->so_name) != 0))
+	      && filename_cmp (found_pathname, so->so_name) != 0))
 	{
 	  if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED))
 	    free_objfile (so->objfile);
@@ -1350,7 +1350,7 @@ reload_shared_libraries_1 (int from_tty)
 	 file, open it.  */
       if (found_pathname != NULL
 	  && (!was_loaded
-	      || strcmp (found_pathname, so->so_name) != 0))
+	      || filename_cmp (found_pathname, so->so_name) != 0))
 	{
 	  volatile struct gdb_exception e;
 
Index: gdb/source.c
===================================================================
--- gdb.orig/source.c	2011-01-11 22:53:24.000000000 +0100
+++ gdb/source.c	2011-03-02 11:08:29.324935900 +0100
@@ -569,15 +569,10 @@ add_path (char *dirname, char **which_pa
 	p = *which_path;
 	while (1)
 	  {
-	    /* FIXME: strncmp loses in interesting ways on MS-DOS and
-	       MS-Windows because of case-insensitivity and two different
-	       but functionally identical slash characters.  We need a
-	       special filesystem-dependent file-name comparison function.
-
-	       Actually, even on Unix I would use realpath() or its work-
+	    /* Actually, even on Unix I would use realpath() or its work-
 	       alike before comparing.  Then all the code above which
 	       removes excess slashes and dots could simply go away.  */
-	    if (!strncmp (p, name, len)
+	    if (!filename_ncmp (p, name, len)
 		&& (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
 	      {
 		/* Found it in the search path, remove old copy.  */
Index: gdb/symfile.c
===================================================================
--- gdb.orig/symfile.c	2011-03-01 09:03:22.000000000 +0100
+++ gdb/symfile.c	2011-03-02 09:40:42.156590400 +0100
@@ -1317,7 +1317,7 @@ separate_debug_file_exists (const char *
      ".debug" suffix as "/usr/lib/debug/path/to/file" is a separate tree where
      the separate debug infos with the same basename can exist.  */
 
-  if (strcmp (name, parent_objfile->name) == 0)
+  if (filename_cmp (name, parent_objfile->name) == 0)
     return 0;
 
   abfd = bfd_open_maybe_remote (name);
@@ -1325,7 +1325,7 @@ separate_debug_file_exists (const char *
   if (!abfd)
     return 0;
 
-  /* Verify symlinks were not the cause of strcmp name difference above.
+  /* Verify symlinks were not the cause of filename_cmp name difference above.
 
      Some operating systems, e.g. Windows, do not provide a meaningful
      st_ino; they always set it to zero.  (Windows does provide a
@@ -1463,7 +1463,8 @@ find_separate_debug_file_by_debuglink (s
       /* If the file is in the sysroot, try using its base path in the
 	 global debugfile directory.  */
       if (canon_name
-	  && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0
+	  && filename_ncmp (canon_name, gdb_sysroot,
+			    strlen (gdb_sysroot)) == 0
 	  && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)]))
 	{
 	  memcpy (debugfile, debugdir, debugdir_end - debugdir);
@@ -2367,8 +2368,9 @@ reread_symbols (void)
 	  /* We need to do this whenever any symbols go away.  */
 	  make_cleanup (clear_symtab_users_cleanup, 0 /*ignore*/);
 
-	  if (exec_bfd != NULL && strcmp (bfd_get_filename (objfile->obfd),
-					  bfd_get_filename (exec_bfd)) == 0)
+	  if (exec_bfd != NULL
+	      && filename_cmp (bfd_get_filename (objfile->obfd),
+			       bfd_get_filename (exec_bfd)) == 0)
 	    {
 	      /* Reload EXEC_BFD without asking anything.  */
 
Index: gdb/symmisc.c
===================================================================
--- gdb.orig/symmisc.c	2011-01-11 22:53:24.000000000 +0100
+++ gdb/symmisc.c	2011-03-02 12:14:21.768332400 +0100
@@ -23,6 +23,7 @@
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "bfd.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "breakpoint.h"
@@ -475,7 +476,7 @@ maintenance_print_symbols (char *args, i
 
   immediate_quit++;
   ALL_SYMTABS (objfile, s)
-    if (symname == NULL || strcmp (symname, s->filename) == 0)
+    if (symname == NULL || filename_cmp (symname, s->filename) == 0)
     dump_symtab (objfile, s, outfile);
   immediate_quit--;
   do_cleanups (cleanups);
Index: gdb/symtab.c
===================================================================
--- gdb.orig/symtab.c	2011-03-01 09:03:22.000000000 +0100
+++ gdb/symtab.c	2011-03-02 09:48:00.137707000 +0100
@@ -2761,7 +2761,7 @@ filename_seen (const char *file, int add
 
   /* Is FILE in tab?  */
   for (p = tab; p < tab + tab_cur_size; p++)
-    if (strcmp (*p, file) == 0)
+    if (filename_cmp (*p, file) == 0)
       return 1;
 
   /* No; maybe add it to tab.  */
@@ -2862,7 +2862,7 @@ file_matches (const char *file, char *fi
     {
       for (i = 0; i < nfiles; i++)
 	{
-	  if (strcmp (files[i], lbasename (file)) == 0)
+	  if (filename_cmp (files[i], lbasename (file)) == 0)
 	    return 1;
 	}
     }
@@ -3260,7 +3260,7 @@ static void
 print_symbol_info (domain_enum kind, struct symtab *s, struct symbol *sym,
 		   int block, char *last)
 {
-  if (last == NULL || strcmp (last, s->filename) != 0)
+  if (last == NULL || filename_cmp (last, s->filename) != 0)
     {
       fputs_filtered ("\nFile ", gdb_stdout);
       fputs_filtered (s->filename, gdb_stdout);
@@ -4073,7 +4073,7 @@ not_interesting_fname (const char *fname
 
   for (i = 0; illegal_aliens[i]; i++)
     {
-      if (strcmp (fname, illegal_aliens[i]) == 0)
+      if (filename_cmp (fname, illegal_aliens[i]) == 0)
 	return 1;
     }
   return 0;
@@ -4102,12 +4102,7 @@ maybe_add_partial_symtab_filename (const
   if (not_interesting_fname (filename))
     return;
   if (!filename_seen (filename, 1, data->first)
-#if HAVE_DOS_BASED_FILE_SYSTEM
-      && strncasecmp (filename, data->text, data->text_len) == 0
-#else
-      && strncmp (filename, data->text, data->text_len) == 0
-#endif
-      )
+      && filename_ncmp (filename, data->text, data->text_len) == 0)
     {
       /* This file matches for a completion; add it to the
 	 current list of matches.  */
@@ -4120,12 +4115,7 @@ maybe_add_partial_symtab_filename (const
 
       if (base_name != filename
 	  && !filename_seen (base_name, 1, data->first)
-#if HAVE_DOS_BASED_FILE_SYSTEM
-	  && strncasecmp (base_name, data->text, data->text_len) == 0
-#else
-	  && strncmp (base_name, data->text, data->text_len) == 0
-#endif
-	  )
+	  && filename_ncmp (base_name, data->text, data->text_len) == 0)
 	add_filename_to_list (base_name, data->text, data->word,
 			      data->list, data->list_used, data->list_alloced);
     }
@@ -4159,12 +4149,7 @@ make_source_files_completion_list (char
       if (not_interesting_fname (s->filename))
 	continue;
       if (!filename_seen (s->filename, 1, &first)
-#if HAVE_DOS_BASED_FILE_SYSTEM
-	  && strncasecmp (s->filename, text, text_len) == 0
-#else
-	  && strncmp (s->filename, text, text_len) == 0
-#endif
-	  )
+	  && filename_ncmp (s->filename, text, text_len) == 0)
 	{
 	  /* This file matches for a completion; add it to the current
 	     list of matches.  */
@@ -4180,12 +4165,7 @@ make_source_files_completion_list (char
 	  base_name = lbasename (s->filename);
 	  if (base_name != s->filename
 	      && !filename_seen (base_name, 1, &first)
-#if HAVE_DOS_BASED_FILE_SYSTEM
-	      && strncasecmp (base_name, text, text_len) == 0
-#else
-	      && strncmp (base_name, text, text_len) == 0
-#endif
-	      )
+	      && filename_ncmp (base_name, text, text_len) == 0)
 	    add_filename_to_list (base_name, text, word,
 				  &list, &list_used, &list_alloced);
 	}
Index: gdb/xcoffread.c
===================================================================
--- gdb.orig/xcoffread.c	2011-01-12 02:23:29.000000000 +0100
+++ gdb/xcoffread.c	2011-03-03 12:06:39.938184300 +0100
@@ -41,6 +41,7 @@
 #include "coff/rs6000.h"
 #include "xcoffread.h"
 
+#include "filenames.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 /* FIXME: ezannoni/2004-02-13 Verify if the include below is really needed.  */
@@ -609,7 +610,7 @@ process_linenos (CORE_ADDR start, CORE_A
 		 start, 0, &main_source_baseline);
 	    }
 
-	  if (strcmp (inclTable[ii].name, last_source_file) == 0)
+	  if (filename_cmp (inclTable[ii].name, last_source_file) == 0)
 	    {
               /* The entry in the include table refers to the main source
                  file.  Add the lines to the main subfile.  */
@@ -2575,14 +2576,14 @@ scan_xcoff_symtab (struct objfile *objfi
 	       things like "break c-exp.y:435" need to work (I
 	       suppose the psymtab_include_list could be hashed or put
 	       in a binary tree, if profiling shows this is a major hog).  */
-	    if (pst && strcmp (namestring, pst->filename) == 0)
+	    if (pst && filename_cmp (namestring, pst->filename) == 0)
 	      continue;
 
 	    {
 	      int i;
 
 	      for (i = 0; i < includes_used; i++)
-		if (strcmp (namestring, psymtab_include_list[i]) == 0)
+		if (filename_cmp (namestring, psymtab_include_list[i]) == 0)
 		  {
 		    i = -1;
 		    break;
Index: gdb/xml-support.c
===================================================================
--- gdb.orig/xml-support.c	2011-02-17 22:19:32.000000000 +0100
+++ gdb/xml-support.c	2011-03-02 09:51:06.587883100 +0100
@@ -25,6 +25,7 @@
 
 #include "gdb_string.h"
 #include "safe-ctype.h"
+#include "filenames.h"
 
 /* Debugging flag.  */
 static int debug_xml;
@@ -946,7 +947,7 @@ fetch_xml_builtin (const char *filename)
   const char *(*p)[2];
 
   for (p = xml_builtin; (*p)[0]; p++)
-    if (strcmp ((*p)[0], filename) == 0)
+    if (filename_cmp ((*p)[0], filename) == 0)
       return (*p)[1];
 
   return NULL;
Index: gdb/xml-syscall.c
===================================================================
--- gdb.orig/xml-syscall.c	2011-02-17 22:19:32.000000000 +0100
+++ gdb/xml-syscall.c	2011-03-02 11:16:02.371965500 +0100
@@ -280,7 +280,7 @@ static void
 init_sysinfo (void)
 {
   /* Should we re-read the XML info for this target?  */
-  if (my_gdb_datadir && strcmp (my_gdb_datadir, gdb_datadir) != 0)
+  if (my_gdb_datadir && filename_cmp (my_gdb_datadir, gdb_datadir) != 0)
     {
       /* The data-directory changed from the last time we used it.
 	 It means that we have to re-read the XML info.  */
Index: gdb/coffread.c
===================================================================
--- gdb.orig/coffread.c	2011-03-01 09:03:20.000000000 +0100
+++ gdb/coffread.c	2011-03-03 10:53:53.676239400 +0100
@@ -33,6 +33,7 @@
 
 #include "coff/internal.h"	/* Internal format of COFF symbols in BFD */
 #include "libcoff.h"		/* FIXME secret internal data from BFD */
+#include "filenames.h"
 #include "objfiles.h"
 #include "buildsym.h"
 #include "gdb-stabs.h"
@@ -1331,8 +1332,18 @@ coff_getfilename (union internal_auxent
   /* FIXME: We should not be throwing away the information about what
      directory.  It should go into dirname of the symtab, or some such
      place.  */
-  if ((temp = strrchr (result, '/')) != NULL)
+  temp = strrchr (result, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+  {
+    char *p2 = strrchr (result, '\\');
+
+    if (!temp || (p2 && p2 > temp))
+      temp = p2;
+  }
+#endif
+  if (temp != NULL)
     result = temp + 1;
+
   return (result);
 }
 

Index: gdb/dwarf2read.c
===================================================================
--- gdb.orig/dwarf2read.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/dwarf2read.c	2011-03-03 11:04:13.022886500 +0100
@@ -5207,7 +5207,8 @@ find_file_and_directory (struct die_info
 	 directory, get rid of it.  */
       char *cp = strchr (*comp_dir, ':');
 
-      if (cp && cp != *comp_dir && cp[-1] == '.' && cp[1] == '/')
+      if (cp && cp != *comp_dir && cp[-1] == '.'
+	  && IS_ABSOLUTE_PATH (&cp[1]))
 	*comp_dir = cp + 1;
     }
 
Index: gdb/fbsd-nat.c
===================================================================
--- gdb.orig/fbsd-nat.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/fbsd-nat.c	2011-03-03 11:13:47.130288800 +0100
@@ -24,6 +24,7 @@
 #include "regcache.h"
 #include "regset.h"
 #include "gdbthread.h"
+#include "filenames.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -202,8 +203,16 @@ fbsd_make_corefile_notes (bfd *obfd, int
 
   if (get_exec_file (0))
     {
-      char *fname = strrchr (get_exec_file (0), '/') + 1;
-      char *psargs = xstrdup (fname);
+      char *fname = strrchr (get_exec_file (0), '/');
+      char *psargs;
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      char *fname2 = strrchr (get_exec_file (0), '\\');
+
+      if (!fname || (fname2 && fname2 > fname))
+        fname = fname2;
+#endif
+      ++fname;
+      psargs = xstrdup (fname);
 
       if (get_inferior_args ())
 	psargs = reconcat (psargs, psargs, " ", get_inferior_args (),
Index: gdb/linux-fork.c
===================================================================
--- gdb.orig/linux-fork.c	2011-01-09 04:08:57.000000000 +0100
+++ gdb/linux-fork.c	2011-03-03 11:16:49.096395600 +0100
@@ -24,6 +24,7 @@
 #include "regcache.h"
 #include "gdbcmd.h"
 #include "infcall.h"
+#include "filenames.h"
 #include "objfiles.h"
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -586,7 +587,12 @@ info_checkpoints_command (char *arg, int
       if (sal.symtab)
 	{
 	  char *tmp = strrchr (sal.symtab->filename, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+	  char *tmp2 = strrchr (sal_symtab->filename, '\\');
 
+	  if (!tmp || (tmp2 && tmp2 > tmp))
+	    tmp = tmp2;
+#endif
 	  if (tmp)
 	    printf_filtered (_(", file %s"), tmp + 1);
 	  else
Index: gdb/linux-nat.c
===================================================================
--- gdb.orig/linux-nat.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/linux-nat.c	2011-03-03 11:20:00.738231000 +0100
@@ -56,6 +56,7 @@
 #include "terminal.h"
 #include <sys/vfs.h>
 #include "solib.h"
+#include "filenames.h"
 
 #ifndef SPUFS_MAGIC
 #define SPUFS_MAGIC 0x23c9b64e
@@ -4491,7 +4492,14 @@ linux_nat_make_corefile_notes (bfd *obfd
 
   if (get_exec_file (0))
     {
-      strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
+      char *tmp = strrchr (get_exec_file (0), '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      char *tmp2 = strrchr (get_exec_file (0), '\\');
+
+      if (!tmp || (tmp2 && tmp2 > tmp))
+        tmp = tmp2;
+#endif
+      strncpy (fname, tmp + 1, sizeof (fname));
       strncpy (psargs, get_exec_file (0), sizeof (psargs));
       if (get_inferior_args ())
 	{
Index: gdb/linux-thread-db.c
===================================================================
--- gdb.orig/linux-thread-db.c	2011-03-01 09:03:21.000000000 +0100
+++ gdb/linux-thread-db.c	2011-03-03 11:24:28.584743200 +0100
@@ -31,6 +31,7 @@
 #include "gdbcmd.h"
 #include "gdbthread.h"
 #include "inferior.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "target.h"
@@ -777,7 +778,11 @@ try_thread_db_load (const char *library)
       return 0;
     }
 
-  if (libthread_db_debug && strchr (library, '/') == NULL)
+  if (libthread_db_debug && strchr (library, '/') == NULL
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      && strchr (library, '\\') == NULL
+#endif
+     )
     {
       void *td_init;
 
@@ -901,7 +906,14 @@ thread_db_load (void)
 	gdb_assert (strlen (obj->name) < sizeof (path));
 	strcpy (path, obj->name);
 	cp = strrchr (path, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+	{
+	  char *cp2 = strrchr (path, '\\');
 
+	  if (!cp || (cp2 && cp2 > cp))
+	    cp = cp2;
+	}
+#endif
 	if (cp == NULL)
 	  {
 	    warning (_("Expected absolute pathname for libpthread in the"
Index: gdb/nto-tdep.c
===================================================================
--- gdb.orig/nto-tdep.c	2011-01-10 21:38:49.000000000 +0100
+++ gdb/nto-tdep.c	2011-03-03 10:33:39.791595700 +0100
@@ -33,6 +33,7 @@
 #include "elf-bfd.h"
 #include "solib-svr4.h"
 #include "gdbcore.h"
+#include "filenames.h"
 #include "objfiles.h"
 
 #include <string.h>
@@ -129,6 +130,13 @@ nto_find_and_open_solib (char *solib, un
 
   /* Don't assume basename() isn't destructive.  */
   base = strrchr (solib, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+  {
+    char *base2 = strrchr (solib, '\\');
+    if (!base || (base2 && base2 > base))
+      base = base2;
+  }
+#endif
   if (!base)
     base = solib;
   else
Index: gdb/windows-nat.c
===================================================================
--- gdb.orig/windows-nat.c	2011-01-12 02:23:29.000000000 +0100
+++ gdb/windows-nat.c	2011-03-03 10:12:52.749241400 +0100
@@ -46,6 +46,7 @@
 #include <signal.h>
 
 #include "buildsym.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "gdb_obstack.h"
@@ -2586,7 +2587,7 @@ _initialize_check_for_gdb_ini (void)
 				      sizeof ("/gdb.ini"));
       strcpy (oldini, homedir);
       p = strchr (oldini, '\0');
-      if (p > oldini && p[-1] != '/')
+      if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
 	*p++ = '/';
       strcpy (p, "gdb.ini");
       if (access (oldini, 0) == 0)


More information about the Gdb mailing list