Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* FYI: fix latent bug in dw2_find_symbol_file
@ 2012-06-11 18:42 Tom Tromey
  2012-06-11 20:50 ` Doug Evans
  0 siblings, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2012-06-11 18:42 UTC (permalink / raw)
  To: gdb-patches

I'm checking this in.

dw2_find_symbol_file has a latent bug.  It assumes that the last file in
file name table is the primary file name for the CU.

However, there's no reason this must be true.  The primary file name
could appear anywhere.

And, since this method returns just the file name, and not the directory
name, there is no reason to even bother reading the line number program
-- we can just use the CU DIE's DW_AT_name.

I don't have a test case for this; but the situation came up with the
dwz multifile code.

Built and regtested on x86-64 Fedora 16.

Tom

2012-06-11  Tom Tromey  <tromey@redhat.com>

	* dwarf2read.c (dw2_get_primary_filename_reader): New function.
	(dw2_find_symbol_file): Use it.

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 589361e..7e25d08 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -2836,12 +2836,34 @@ dw2_expand_symtabs_with_filename (struct objfile *objfile,
     }
 }
 
+/* A helper function for dw2_find_symbol_file that finds the primary
+   file name for a given CU.  This is a die_reader_func.  */
+
+static void
+dw2_get_primary_filename_reader (const struct die_reader_specs *reader,
+				 gdb_byte *info_ptr,
+				 struct die_info *comp_unit_die,
+				 int has_children,
+				 void *data)
+{
+  const char **result_ptr = data;
+  struct dwarf2_cu *cu = reader->cu;
+  struct attribute *attr;
+
+  attr = dwarf2_attr (comp_unit_die, DW_AT_name, cu);
+  if (attr == NULL)
+    *result_ptr = NULL;
+  else
+    *result_ptr = DW_STRING (attr);
+}
+
 static const char *
 dw2_find_symbol_file (struct objfile *objfile, const char *name)
 {
   struct dwarf2_per_cu_data *per_cu;
   offset_type *vec;
   struct quick_file_names *file_data;
+  const char *filename;
 
   dw2_setup (objfile);
 
@@ -2873,12 +2895,17 @@ dw2_find_symbol_file (struct objfile *objfile, const char *name)
   /* vec[0] is the length, which must always be >0.  */
   per_cu = dw2_get_cu (MAYBE_SWAP (vec[1]));
 
-  file_data = dw2_get_file_names (objfile, per_cu);
-  if (file_data == NULL
-      || file_data->num_file_names == 0)
-    return NULL;
+  if (per_cu->v.quick->symtab != NULL)
+    return per_cu->v.quick->symtab->filename;
+
+  if (per_cu->is_debug_types)
+    init_cutu_and_read_dies (per_cu, 0, 0, dw2_get_primary_filename_reader,
+			     &filename);
+  else
+    init_cutu_and_read_dies_simple (per_cu, dw2_get_primary_filename_reader,
+				    &filename);
 
-  return file_data->file_names[file_data->num_file_names - 1];
+  return filename;
 }
 
 static void


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-06-15 16:17 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-11 18:42 FYI: fix latent bug in dw2_find_symbol_file Tom Tromey
2012-06-11 20:50 ` Doug Evans
2012-06-11 20:57   ` Tom Tromey
2012-06-11 21:08     ` Doug Evans
2012-06-11 21:26       ` Doug Evans
2012-06-13 22:10         ` Cary Coutant
2012-06-13 23:00           ` Tom Tromey
2012-06-12 15:40       ` Tom Tromey
2012-06-15 16:17   ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox