From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2622 invoked by alias); 7 Aug 2013 19:45:09 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 2479 invoked by uid 89); 7 Aug 2013 19:45:09 -0000 X-Spam-SWARE-Status: No, score=-6.0 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RDNS_NONE,SPF_HELO_PASS,SPF_PASS autolearn=no version=3.3.1 Received: from Unknown (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 07 Aug 2013 19:45:08 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r77Jj0Yp029265 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 7 Aug 2013 15:45:00 -0400 Received: from barimba.redhat.com (ovpn-113-128.phx2.redhat.com [10.3.113.128]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r77JixLb013380; Wed, 7 Aug 2013 15:45:00 -0400 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2 2/5] fix recursively_compute_inclusions and add dwz test case Date: Wed, 07 Aug 2013 19:45:00 -0000 Message-Id: <1375904695-27787-3-git-send-email-tromey@redhat.com> In-Reply-To: <1375904695-27787-1-git-send-email-tromey@redhat.com> References: <1375904695-27787-1-git-send-email-tromey@redhat.com> X-SW-Source: 2013-08/txt/msg00212.txt.bz2 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/dwarf2read.c | 16 ++++-- gdb/testsuite/gdb.dwarf2/dwz.exp | 106 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dwz.exp 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/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 . + +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" -- 1.8.1.4