diff options
author | Tom Tromey <tromey@redhat.com> | 2013-08-07 19:57:51 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2013-08-07 19:57:51 +0000 |
commit | f9125b6c6c523dc3f0191fdb5b9551c6f5d70c61 (patch) | |
tree | b69053ffa18840afb67205aaf62c9660d98d6096 | |
parent | fdbb204be90dda0680acdf9b4829ddf531dc2aaa (diff) | |
download | gdb-f9125b6c6c523dc3f0191fdb5b9551c6f5d70c61.zip gdb-f9125b6c6c523dc3f0191fdb5b9551c6f5d70c61.tar.gz gdb-f9125b6c6c523dc3f0191fdb5b9551c6f5d70c61.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 16 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dwz.exp | 106 |
4 files changed, 129 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eafdee4..1097608 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2013-08-07 Tom Tromey <tromey@redhat.com> + * 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 <tromey@redhat.com> + * linespec.c (convert_linespec_to_sals): Use maybe_add_address when adding label symbols. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index cb77386..ff901e9 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 6ae1f5b..160a27a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-08-07 Tom Tromey <tromey@redhat.com> + + * gdb.dwarf2/dwz.exp: New file. + 2013-08-02 Tom Tromey <tromey@redhat.com> * 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 0000000..895444b --- /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 {} { + 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" |