From patchwork Thu Nov 5 20:01:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Buettner X-Patchwork-Id: 9567 Received: (qmail 7473 invoked by alias); 5 Nov 2015 20:01:47 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 7463 invoked by uid 89); 5 Nov 2015 20:01:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_05, KAM_STOCKGEN, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 05 Nov 2015 20:01:45 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 0B5B5C100450 for ; Thu, 5 Nov 2015 20:01:44 +0000 (UTC) Received: from pinnacle.lan (ovpn-113-161.phx2.redhat.com [10.3.113.161]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id tA5K1hEP011073 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Thu, 5 Nov 2015 15:01:43 -0500 Date: Thu, 5 Nov 2015 13:01:40 -0700 From: Kevin Buettner To: gdb-patches@sourceware.org Cc: Pedro Alves Subject: Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes Message-ID: <20151105130140.0fd3404f@pinnacle.lan> In-Reply-To: <563B2BF1.2050007@redhat.com> References: <20151029212509.438b5642@pinnacle.lan> <56334F21.1020205@redhat.com> <20151104144908.320110e1@pinnacle.lan> <563B2BF1.2050007@redhat.com> MIME-Version: 1.0 X-IsSubscribed: yes On Thu, 05 Nov 2015 10:14:09 +0000 Pedro Alves wrote: > > Defining the obvious proc (for gdb_target_symbol) worked out of the > > box for all cases except gdb.dwarf2/atomic-type.exp. For that I > > needed to make a change to lib/dwarf.exp (and learned a bit more about > > tcl in the process). If you know of a cleaner way to code it, let me > > know - I couldn't think of a way to do it without adding the if-else > > statement. > > Not sure I see what makes gdb.dwarf2/atomic-type.exp different? > E.g., the gdb.dwarf2/dw2-bad-mips-linkage-name.exp hunk looks quite > similar. What makes gdb.dwarf2/atomic-type.exp special? I was mistaken. Both of these tests - dw2-bad-mips-linkage-name.exp and atomic-type.exp - have problems due to the fact that the call to gdb_target_symbol appears within a DW_TAG_ construct. The proc _handle_DW_TAG performs command and variable expansion within a DW_TAG_ construct. (It does other things too.) When I remove my change to dwarf.exp, this what I see in the log file: ERROR: tcl error sourcing /ironwood1/sourceware-git/mesquite-native/bld/../../binutils-gdb/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp. ERROR: missing close-bracket while executing "subst {[gdb_target_symbol}" ("uplevel" body line 1) invoked from within "uplevel 2 [list subst [lindex $attr 1]]" (procedure "_handle_DW_TAG" line 31) invoked from within "_handle_DW_TAG DW_TAG_subprogram $attrs $children" (procedure "DW_TAG_subprogram" line 1) invoked from within "DW_TAG_subprogram { {name f} {low_pc [gdb_target_symbol f] addr} {high_pc f_end_lbl addr} ..." ("uplevel" body line 9) invoked from within "uplevel 2 $children" (procedure "_handle_DW_TAG" line 61) invoked from within "_handle_DW_TAG DW_TAG_compile_unit $attrs $children" (procedure "DW_TAG_compile_unit" line 1) invoked from within "DW_TAG_compile_unit { {DW_AT_language @DW_LANG_C} {DW_AT_name dw2-bad-mips-linkage-name.c} {DW_AT_..." ("uplevel" body line 2) invoked from within "uplevel $body" (procedure "cu" line 66) invoked from within "cu {} { DW_TAG_compile_unit { {DW_AT_language @DW_LANG_C} {DW_AT_name dw2-bad-mips-linkage-name.c} ..." ("eval" body line 2) invoked from within "eval $body" (procedure "Dwarf::assemble" line 30) invoked from within "Dwarf::assemble $asm_file { cu {} { DW_TAG_compile_unit { {DW_AT_language @DW_LANG_C} {DW_AT_name dw2-bad-mip..." The reason for this is that '[gdb_target_symbol' is one list element and 'f]' is another. The code, as it was originally written, invoked subst on just a single element. When invoked on (just) '[gdb_target_symbol' it rightly complains about the "missing close-bracket". My change joins the list elements together and then invokes subst on them: if {[llength $attr] > 2} { set attr_value [uplevel 2 [list subst [join [lrange $attr 1 end-1]]]] } else { set attr_value [uplevel 2 [list subst [lindex $attr 1]]] } versus just this line, originally: set attr_value [uplevel 2 [list subst [lindex $attr 1]]] I was hoping to write this somewhat more compactly, but we need to accomodate the case where a form is not provided. The original statement, in the else clause, still handles this. Thanks again for your comments. Kevin > > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > > index 048070b..e1c9839 100644 > > --- a/gdb/testsuite/lib/gdb.exp > > +++ b/gdb/testsuite/lib/gdb.exp > > @@ -5521,6 +5521,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} { > > return $destcore > > } > > > > +# gdb_target_symbol_prefix compiles a test program and uses readelf to > > s/readelf/objdump/ Fixed in the new version... gdb.dwarf2: Define and use gdb_target_symbol for symbol prefixes Some of the tests in gdb.dwarf2 which use Dwarf::assemble refer to (minimal/linker) symbols created in the course of building a small test program. Some targets use a prefix such as underscore ("_") on these symbols. Many of the tests in gdb.dwarf2 do not take this into account. As a consequence, these tests fail to build, resulting either in failures or untested testcases. Here is an example from gdb.dwarf2/dw2-regno-invalid.exp: Dwarf::assemble $asm_file { cu {} { compile_unit { {low_pc main DW_FORM_addr} {high_pc main+0x10000 DW_FORM_addr} } { ... } For targets which require an underscore prefix on linker symbols, the two occurrences of "main" would have to have a prepended underscore, i.e. _main instead of main. For the above case, a call to the new proc gdb_target_symbol is used prepend the correct prefix to the symbol. I.e. the above code is rewritten (as shown in the patch) as follows: Dwarf::assemble $asm_file { cu {} { compile_unit { {low_pc [gdb_target_symbol main] DW_FORM_addr} {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr} } { ... } I also found it necessary to make an adjustment to lib/dwarf.exp so that expressions of more than just one list element can be used in DW_TAG_... constructs. Both atomic-type.exp and dw2-bad-mips-linkage-name.exp require this new functionality. gdb/testsuite/ChangeLog: * lib/gdb.exp (gdb_target_symbol_prefix, gdb_target_symbol): New procs. * lib/dwarf.exp (_handle_DW_TAG): Handle attribute values, representing expressions, of more than one list element. * gdb.dwarf2/atomic-type.exp (Dwarf::assemble): Use gdb_target_symbol to prepend linker symbol prefix to f. * gdb.dwarf2/data-loc.exp (Dwarf::assemble): Likewise, for table_1 and table_2. * gdb.dwarf2/dw2-bad-mips-linkage-name.exp (Dwarf::assemble): Likewise, for f and g. * gdb.dwarf2/dw2-ifort-parameter.exp (Dwarf::assemble): Likewise, for ptr. * gdb.dwarf2/dw2-regno-invalid.exp (Dwarf::assemble): Likewise, for main. * gdb.dwarf2/dynarr-ptr.exp (Dwarf::assemble): Likewise, for table_1_ptr and table_2_ptr. --- gdb/testsuite/gdb.dwarf2/atomic-type.exp | 2 +- gdb/testsuite/gdb.dwarf2/data-loc.exp | 8 ++-- .../gdb.dwarf2/dw2-bad-mips-linkage-name.exp | 4 +- gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp | 2 +- gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp | 8 ++-- gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp | 8 ++-- gdb/testsuite/lib/dwarf.exp | 15 ++++++- gdb/testsuite/lib/gdb.exp | 48 ++++++++++++++++++++++ 8 files changed, 77 insertions(+), 18 deletions(-) diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp index fb315e3..e2a3447 100644 --- a/gdb/testsuite/gdb.dwarf2/atomic-type.exp +++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp @@ -68,7 +68,7 @@ Dwarf::assemble $asm_file { DW_TAG_subprogram { {name f} - {low_pc f addr} + {low_pc [gdb_target_symbol f] addr} {high_pc f_end_lbl addr} {type :$i_l} } { diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp b/gdb/testsuite/gdb.dwarf2/data-loc.exp index e9e702c..a1fb772 100644 --- a/gdb/testsuite/gdb.dwarf2/data-loc.exp +++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp @@ -84,7 +84,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__three} {DW_AT_type :$array_label} {DW_AT_location { - DW_OP_addr table_1 + DW_OP_addr [gdb_target_symbol table_1] } SPECIAL_expr} {external 1 flag} } @@ -92,7 +92,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__three_tdef} {DW_AT_type :$array_ptr_label} {DW_AT_location { - DW_OP_addr table_1 + DW_OP_addr [gdb_target_symbol table_1] } SPECIAL_expr} {external 1 flag} } @@ -100,7 +100,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__five} {DW_AT_type :$array_label} {DW_AT_location { - DW_OP_addr table_2 + DW_OP_addr [gdb_target_symbol table_2] } SPECIAL_expr} {external 1 flag} } @@ -108,7 +108,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__five_tdef} {DW_AT_type :$array_ptr_label} {DW_AT_location { - DW_OP_addr table_2 + DW_OP_addr [gdb_target_symbol table_2] } SPECIAL_expr} {external 1 flag} } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp index 77f6175..dfb9567 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp @@ -42,14 +42,14 @@ Dwarf::assemble $asm_file { } DW_TAG_subprogram { {name f} - {low_pc f addr} + {low_pc [gdb_target_symbol f] addr} {high_pc f_end_lbl addr} {type :$b_l} {DW_AT_MIPS_linkage_name _Z1fv} } DW_TAG_subprogram { {name g} - {low_pc g addr} + {low_pc [gdb_target_symbol g] addr} {high_pc g_end_lbl addr} {type :$b_l} {DW_AT_MIPS_linkage_name 42 DW_FORM_data1} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp index c71103d..4f07b50 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp @@ -53,7 +53,7 @@ Dwarf::assemble $asm_file { {variable_parameter 1 flag} {type :$int_label} {location { - addr ptr + addr [gdb_target_symbol ptr] deref } SPECIAL_expr} } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp index a7d77c5..53897bd 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp @@ -29,8 +29,8 @@ set asm_file [standard_output_file $srcfile] Dwarf::assemble $asm_file { cu {} { compile_unit { - {low_pc main DW_FORM_addr} - {high_pc main+0x10000 DW_FORM_addr} + {low_pc [gdb_target_symbol main] DW_FORM_addr} + {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr} } { declare_labels integer_label @@ -43,8 +43,8 @@ Dwarf::assemble $asm_file { DW_TAG_subprogram { {name main} {DW_AT_external 1 flag} - {low_pc main DW_FORM_addr} - {high_pc main+0x10000 DW_FORM_addr} + {low_pc [gdb_target_symbol main] DW_FORM_addr} + {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr} } { DW_TAG_variable { {DW_AT_name bregx} diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp index 3dcb3d7..0a612fe 100644 --- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp +++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp @@ -85,7 +85,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__three_ptr} {DW_AT_type :$array_ptr_label} {DW_AT_location { - DW_OP_addr table_1_ptr + DW_OP_addr [gdb_target_symbol table_1_ptr] } SPECIAL_expr} {external 1 flag} } @@ -93,7 +93,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__three_ptr_tdef} {DW_AT_type :$array_typedef_label} {DW_AT_location { - DW_OP_addr table_1_ptr + DW_OP_addr [gdb_target_symbol table_1_ptr] } SPECIAL_expr} {external 1 flag} } @@ -101,7 +101,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__five_ptr} {DW_AT_type :$array_ptr_label} {DW_AT_location { - DW_OP_addr table_2_ptr + DW_OP_addr [gdb_target_symbol table_2_ptr] } SPECIAL_expr} {external 1 flag} } @@ -109,7 +109,7 @@ Dwarf::assemble $asm_file { {DW_AT_name foo__five_ptr_tdef} {DW_AT_type :$array_typedef_label} {DW_AT_location { - DW_OP_addr table_2_ptr + DW_OP_addr [gdb_target_symbol table_2_ptr] } SPECIAL_expr} {external 1 flag} } diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index 888ba94..383f8f5 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -621,7 +621,18 @@ namespace eval Dwarf { foreach attr $attrs { set attr_name [_map_name [lindex $attr 0] _AT] - set attr_value [uplevel 2 [list subst [lindex $attr 1]]] + + # When the length of ATTR is greater than 2, the last + # element of the list must be a form. The second through + # the penultimate elements are joined together and + # evaluated using subst. This allows constructs such as + # [gdb_target_symbol foo] to be used. + + if {[llength $attr] > 2} { + set attr_value [uplevel 2 [list subst [join [lrange $attr 1 end-1]]]] + } else { + set attr_value [uplevel 2 [list subst [lindex $attr 1]]] + } if { [string equal "MACRO_AT_func" $attr_name] } { _handle_macro_at_func $attr_value @@ -629,7 +640,7 @@ namespace eval Dwarf { _handle_macro_at_range $attr_value } else { if {[llength $attr] > 2} { - set attr_form [lindex $attr 2] + set attr_form [lindex $attr end] } else { # If the value looks like an integer, a form is required. if [string is integer $attr_value] { diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 048070b..f11609b 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -5521,6 +5521,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} { return $destcore } +# gdb_target_symbol_prefix compiles a test program and then examines +# the output from objdump to determine the prefix (such as underscore) +# for linker symbol prefixes. + +gdb_caching_proc gdb_target_symbol_prefix { + # Set up and compile a simple test program... + set src [standard_temp_file main[pid].c] + set exe [standard_temp_file main[pid].x] + + gdb_produce_source $src { + int main() { + return 0; + } + } + + verbose "compiling testfile $src" 2 + set compile_flags {debug nowarnings quiet} + set lines [gdb_compile $src $exe executable $compile_flags] + + set prefix "" + + if ![string match "" $lines] then { + verbose "gdb_target_symbol_prefix: testfile compilation failed, returning null prefix" 2 + } else { + set objdump_program [gdb_find_objdump] + set result [catch "exec $objdump_program --syms $exe" output] + + if { $result == 0 \ + && ![regexp -lineanchor \ + { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } { + verbose "gdb_target_symbol_prefix: Could not find main in objdump output; returning null prefix" 2 + } + } + + file delete $src + file delete $exe + + return $prefix +} + +# gdb_target_symbol returns the provided symbol with the correct prefix +# prepended. (See gdb_target_symbol_prefix, above.) + +proc gdb_target_symbol { symbol } { + set prefix [gdb_target_symbol_prefix] + return "${prefix}${symbol}" +} + # gdb_target_symbol_prefix_flags returns a string that can be added # to gdb_compile options to define SYMBOL_PREFIX macro value # symbol_prefix_flags returns a string that can be added