This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patchv2 10/11] Fix .gdb_index for real and absolute filenames


Hi,

formerly:
	[patch 8/9] Fix .gdb_index for real and absolute filenames
	http://sourceware.org/ml/gdb-patches/2013-01/msg00392.html

Here is a second part of the "basenames" performance handling for
default "set basenames-may-differ off".

Also gdb_realpath no longer needs to be additionally cached as
dw2_get_real_path now caches gdb_realpath instead of xfullpath.


Thanks,
Jan


gdb/
2013-01-25  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* dwarf2read.c (dw2_map_symtabs_matching_filename): Move variable
	this_real_name to outer block.  Use it also for
	compare_filenames_for_search.
	(dw2_expand_symtabs_matching): New variable this_real_name.  Use it
	with dw2_get_real_path for file_matcher, considering also
	BASENAMES_MAY_DIFFER.
	(file_full_name): Prepend COMP_DIR even for relative lh->INCLUDE_DIRS.

--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3072,6 +3072,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
       for (j = 0; j < file_data->num_file_names; ++j)
 	{
 	  const char *this_name = file_data->file_names[j];
+	  const char *this_real_name;
 
 	  if (compare_filenames_for_search (this_name, name))
 	    {
@@ -3086,11 +3087,16 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
 	      && FILENAME_CMP (lbasename (this_name), name_basename) != 0)
 	    continue;
 
-	  if (real_path != NULL)
+	  this_real_name = dw2_get_real_path (objfile, file_data, j);
+	  if (compare_filenames_for_search (this_real_name, name))
 	    {
-	      const char *this_real_name = dw2_get_real_path (objfile,
-							      file_data, j);
+	      if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
+					callback, data))
+		return 1;
+	    }
 
+	  if (real_path != NULL)
+	    {
 	      gdb_assert (IS_ABSOLUTE_PATH (real_path));
 	      gdb_assert (IS_ABSOLUTE_PATH (name));
 	      if (this_real_name != NULL
@@ -3533,11 +3539,27 @@ dw2_expand_symtabs_matching
 
 	  for (j = 0; j < file_data->num_file_names; ++j)
 	    {
+	      const char *this_real_name;
+
 	      if (file_matcher (file_data->file_names[j], data, 0))
 		{
 		  per_cu->v.quick->mark = 1;
 		  break;
 		}
+
+	      /* Before we invoke realpath, which can get expensive when many
+		 files are involved, do a quick comparison of the basenames.  */
+	      if (!basenames_may_differ
+		  && !file_matcher (lbasename (file_data->file_names[j]),
+				    data, 1))
+		continue;
+
+	      this_real_name = dw2_get_real_path (objfile, file_data, j);
+	      if (file_matcher (this_real_name, data, 0))
+		{
+		  per_cu->v.quick->mark = 1;
+		  break;
+		}
 	    }
 
 	  slot = htab_find_slot (per_cu->v.quick->mark
@@ -18022,23 +18044,19 @@ file_full_name (int file, struct line_header *lh, const char *comp_dir)
       else
         {
           const char *dir;
-          int dir_len;
-          char *full_name;
 
-          if (fe->dir_index)
-            dir = lh->include_dirs[fe->dir_index - 1];
-          else
+          if (fe->dir_index == 0)
             dir = comp_dir;
+	  else
+	    {
+	      dir = lh->include_dirs[fe->dir_index - 1];
+	      if (!IS_ABSOLUTE_PATH (dir))
+		return concat (comp_dir, SLASH_STRING, dir, SLASH_STRING,
+			       fe->name, NULL);
+	    }
 
           if (dir)
-            {
-              dir_len = strlen (dir);
-              full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1);
-              strcpy (full_name, dir);
-              full_name[dir_len] = '/';
-              strcpy (full_name + dir_len + 1, fe->name);
-              return full_name;
-            }
+	    return concat (dir, SLASH_STRING, fe->name, NULL);
           else
             return xstrdup (fe->name);
         }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]