From f9125b6c6c523dc3f0191fdb5b9551c6f5d70c61 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 7 Aug 2013 19:57:51 +0000 Subject: [PATCH] fix recursively_compute_inclusions and add dwz test case 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 18. The new test unconditionally tests the partial unit machinery, which I think is an added plus. * 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/ChangeLog | 7 ++ gdb/dwarf2read.c | 16 +++-- gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.dwarf2/dwz.exp | 106 +++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dwz.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eafdee4209..1097608991 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2013-08-07 Tom Tromey + + * dwarf2read.c (recursively_compute_inclusions): Add + "immediate_parent" argument. Set symtab's "user" field + if not set. + (compute_symtab_includes): Update. + 2013-08-07 Tom Tromey * linespec.c (convert_linespec_to_sals): Use maybe_add_address diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index cb77386f6f..ff901e9a88 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -7374,7 +7374,8 @@ get_symtab (struct dwarf2_per_cu_data *per_cu) static void recursively_compute_inclusions (VEC (symtab_ptr) **result, htab_t all_children, htab_t all_type_symtabs, - struct dwarf2_per_cu_data *per_cu) + struct dwarf2_per_cu_data *per_cu, + struct symtab *immediate_parent) { void **slot; int ix; @@ -7402,10 +7403,16 @@ recursively_compute_inclusions (VEC (symtab_ptr) **result, { *slot = symtab; VEC_safe_push (symtab_ptr, *result, symtab); + if (symtab->user == NULL) + symtab->user = immediate_parent; } } else - VEC_safe_push (symtab_ptr, *result, symtab); + { + VEC_safe_push (symtab_ptr, *result, symtab); + if (symtab->user == NULL) + symtab->user = immediate_parent; + } } for (ix = 0; @@ -7413,7 +7420,7 @@ recursively_compute_inclusions (VEC (symtab_ptr) **result, ++ix) { recursively_compute_inclusions (result, all_children, - all_type_symtabs, iter); + all_type_symtabs, iter, symtab); } } @@ -7449,7 +7456,8 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) ++ix) { recursively_compute_inclusions (&result_symtabs, all_children, - all_type_symtabs, per_cu_iter); + all_type_symtabs, per_cu_iter, + symtab); } /* Now we have a transitive closure of all the included symtabs. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6ae1f5b5e0..160a27a87c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-08-07 Tom Tromey + + * gdb.dwarf2/dwz.exp: New file. + 2013-08-02 Tom Tromey * gdb.base/watchpoint.c (struct foo5): New. diff --git a/gdb/testsuite/gdb.dwarf2/dwz.exp b/gdb/testsuite/gdb.dwarf2/dwz.exp new file mode 100644 index 0000000000..895444be96 --- /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 . + +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 {} { + partial_label: partial_unit {} { + subprogram { + {name main} + {low_pc main addr} + {high_pc "main + 10" addr} + } + } + } + + cu {} { + 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 {} { + 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" -- 2.34.1