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]

[2/5] RFC fix latent bug with dwz -m


Doug pointed out a while ago that in the final dwz -m patch, nothing
ever set symtab::user.

This patch fixes this oversight and adds a test case showing why it is
important.

Built and regtested (both ways) on x86-64 Fedora 16.
The new test unconditionally tests the partial unit machinery, which I
think is an added plus.

Tom

	* dwarf2read.c (recursively_compute_inclusions): Add
	"immediate_parent" argument.  Set symtab's "user" field
	if not set.
	(compute_symtab_includes): Update.

	* gdb.dwarf2/dwz.exp: New file.
---
 gdb/dwarf2read.c                 |   20 +++++--
 gdb/testsuite/gdb.dwarf2/dwz.exp |  106 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 5 deletions(-)
 create mode 100644 gdb/testsuite/gdb.dwarf2/dwz.exp

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index d021f98..fa066cf 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -6893,11 +6893,13 @@ get_symtab (struct dwarf2_per_cu_data *per_cu)
 static void
 recursively_compute_inclusions (VEC (dwarf2_per_cu_ptr) **result,
 				htab_t all_children,
-				struct dwarf2_per_cu_data *per_cu)
+				struct dwarf2_per_cu_data *per_cu,
+				struct symtab *immediate_parent)
 {
   void **slot;
   int ix;
   struct dwarf2_per_cu_data *iter;
+  struct symtab *this_symtab;
 
   slot = htab_find_slot (all_children, per_cu, INSERT);
   if (*slot != NULL)
@@ -6908,13 +6910,20 @@ recursively_compute_inclusions (VEC (dwarf2_per_cu_ptr) **result,
 
   *slot = per_cu;
   /* Only add a CU if it has a symbol table.  */
-  if (get_symtab (per_cu) != NULL)
-    VEC_safe_push (dwarf2_per_cu_ptr, *result, per_cu);
+  this_symtab = get_symtab (per_cu);
+  if (this_symtab != NULL)
+    {
+      VEC_safe_push (dwarf2_per_cu_ptr, *result, per_cu);
+      if (this_symtab->user == NULL)
+	this_symtab->user = immediate_parent;
+    }
+  else
+    this_symtab = immediate_parent;
 
   for (ix = 0;
        VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter);
        ++ix)
-    recursively_compute_inclusions (result, all_children, iter);
+    recursively_compute_inclusions (result, all_children, iter, this_symtab);
 }
 
 /* Compute the symtab 'includes' fields for the symtab related to
@@ -6944,7 +6953,8 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu)
 	   VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs,
 			ix, iter);
 	   ++ix)
-	recursively_compute_inclusions (&result_children, all_children, iter);
+	recursively_compute_inclusions (&result_children, all_children, iter,
+					symtab);
 
       /* Now we have a transitive closure of all the included CUs, and
 	 for .gdb_index version 7 the included TUs, so we can convert it
diff --git a/gdb/testsuite/gdb.dwarf2/dwz.exp b/gdb/testsuite/gdb.dwarf2/dwz.exp
new file mode 100644
index 0000000..379db04
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dwz.exp
@@ -0,0 +1,106 @@
+# Copyright 2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile main.c dwz.S
+
+# Create the DWARF.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    declare_labels partial_label double_label int_label int_label2
+
+    extern main
+
+    cu 0 2 8 {
+	partial_label: partial_unit {} {
+	    subprogram {
+		{name main}
+		{low_pc main addr}
+		{high_pc "main + 10" addr}
+	    }
+	}
+    }
+
+    cu 0 2 8 {
+	compile_unit {{language @DW_LANG_C}} {
+	    int_label2: base_type {
+		{name int}
+		{byte_size 4 sdata}
+		{encoding @DW_ATE_signed}
+	    }
+
+	    constant {
+		{name the_int}
+		{type :$int_label2}
+		{const_value 99 data1}
+	    }
+
+	    constant {
+		{name other_int}
+		{type :$int_label2}
+		{const_value 99 data1}
+	    }
+	}
+    }
+
+    cu 0 2 8 {
+	compile_unit {{language @DW_LANG_C}} {
+	    imported_unit {
+		{import $partial_label ref_addr}
+	    }
+
+	    int_label: base_type {
+		{name int}
+		{byte_size 4 sdata}
+		{encoding @DW_ATE_signed}
+	    }
+
+	    constant {
+		{name the_int}
+		{type :$int_label}
+		{const_value 23 data1}
+	    }
+	}
+    }
+}
+
+if  { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
+	   object {nodebug}] != "" } {
+    return -1
+}
+
+if  { [gdb_compile $asm_file ${binfile}2.o object {nodebug}] != "" } {
+    return -1
+}
+
+if  { [gdb_compile [list ${binfile}1.o ${binfile}2.o] \
+	   "${binfile}" executable {}] != "" } {
+    return -1
+}
+
+clean_restart ${testfile}
+
+if ![runto_main] {
+    return -1
+}
+
+gdb_test "p other_int" " = 99"
+gdb_test "p the_int" " = 23"
-- 
1.7.7.6


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