From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15465 invoked by alias); 24 Mar 2009 21:40:42 -0000 Received: (qmail 15445 invoked by uid 22791); 24 Mar 2009 21:40:39 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 24 Mar 2009 21:40:33 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n2OLe7J3016040; Tue, 24 Mar 2009 17:40:07 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n2OLe0nj002137; Tue, 24 Mar 2009 17:40:00 -0400 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n2OLe42w023678; Tue, 24 Mar 2009 17:40:05 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.3) with ESMTP id n2OLe1It013905; Tue, 24 Mar 2009 22:40:02 +0100 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.2/Submit) id n2OLduLp013892; Tue, 24 Mar 2009 22:39:56 +0100 Date: Tue, 24 Mar 2009 23:50:00 -0000 From: Jan Kratochvil To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: [patch/rfc] Recognize non-DW_AT_location symbols [Re: [patch] Racy FAIL: gdb.base/auxv.exp + gdb.base/callfuncs.exp] Message-ID: <20090324213956.GA10086@host0.dyn.jankratochvil.net> References: <20090316202040.GA27070@host0.dyn.jankratochvil.net> <20090320150248.GA12530@adacore.com> <20090320182215.GC12530@adacore.com> <20090320183838.GA8318@host0.dyn.jankratochvil.net> <20090320191841.GE12530@adacore.com> <20090323173115.GA19319@adacore.com> <20090323173741.GA14334@host0.dyn.jankratochvil.net> <20090323224736.GL9472@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090323224736.GL9472@adacore.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-IsSubscribed: yes 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 X-SW-Source: 2009-03/txt/msg00534.txt.bz2 On Mon, 23 Mar 2009 23:47:36 +0100, Joel Brobecker wrote: > > (the original patch for optimized-out variables is being tested and looks OK) > > Excellent! How about officially resubmitting the latest version of > the patch, to give everyone a chance to look at it again, before > we decide to check it in? I was not completely convinced that time I would like to submit it that way. Written there a rationale as I do not find the reasons for the die_is_declaration() condition there to be obvious. Also submitted to http://dwarfstd.org/Issues.php that DWARF3 section 2.13.2 is IMO ambiguous as was discussed at: http://sourceware.org/ml/gdb-patches/2004-04/threads.html#00296 suggesting to add: DW_AT_declaration and DW_AT_sibling attributes are not being inherited from the debugging information entry referenced by the specification attribute. The testcase probably breaks on Alpha (as its default executable addresses do not fit in 32 bits) compared to its original variant. No regressions on x86_64-unknown-linux-gnu, tested also on gcc-4.4 (Fedora 11). Thanks, Jan gdb/ 2009-03-24 Joel Brobecker Jan Kratochvil Recognize missing DW_AT_location as . * dwarf2read.c (new_symbol ): Call add_symbol_to_list. gdb/testsuite/ 2009-03-24 Jan Kratochvil * gdb.dwarf2/dw2-noloc-main.c: New file. * gdb.dwarf2/dw2-noloc.S (.text): Remove. (.data): New. (DW_AT_stmt_list, .debug_line, DW_AT_frame_base): Remove. (DW_AT_low_pc, DW_AT_high_pc): Reference `dw2-noloc-main.c'. (DW_TAG_subprogram func_cu1, noloc): Remove. (file_location, file_optimized_out, extern_location, extern_resolvable) (extern_unresolvable, main, func_location, func_optimized_out) (func_extern_location, func_extern_resolvable) (func_extern_unresolvable): New. * gdb.dwarf2/dw2-noloc.exp: Use prepare_for_testing, compile also `dw2-noloc-main.c'. Test the new DIEs from `dw2-noloc.S'. (globals): New procedure. --- gdb/dwarf2read.c 20 Mar 2009 22:00:10 -0000 1.297 +++ gdb/dwarf2read.c 24 Mar 2009 21:05:16 -0000 @@ -7659,6 +7659,26 @@ new_symbol (struct die_info *die, struct SYMBOL_CLASS (sym) = LOC_UNRESOLVED; add_symbol_to_list (sym, &global_symbols); } + /* Catch local optimized-out variables but do not create symbols + for DIEs later being completed (by their DW_AT_location or + DW_AT_const_value). + + C++ declaration refering to a definition in the same file (and + therefore not using DW_AT_external) would be + DW_TAG_imported_declaration (not DW_TAG_variable) as the + target DIE can be referenced as it is in the same CU. + + Therefore such DW_TAG_variable having DW_AT_declaration would + be present only to be later completed through + DW_AT_specification. As GDB looks up the first symbol in its + scope we will rather defer creating the symbol to the later + DIE completing this DIE. */ + else if (!die_is_declaration (die, cu)) + { + /* Use the default LOC_OPTIMIZED_OUT class. */ + gdb_assert (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT); + add_symbol_to_list (sym, cu->list_in_scope); + } } break; case DW_TAG_formal_parameter: --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c 24 Mar 2009 21:05:16 -0000 @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 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 . */ + +asm (".globl cu_text_start"); +asm ("cu_text_start:"); + +int +main (void) +{ + return 0; +} + +asm (".globl cu_text_end"); +asm ("cu_text_end:"); --- gdb/testsuite/gdb.dwarf2/dw2-noloc.S 3 Jan 2009 05:58:04 -0000 1.4 +++ gdb/testsuite/gdb.dwarf2/dw2-noloc.S 24 Mar 2009 21:05:16 -0000 @@ -15,16 +15,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ - .text -.Lbegin_text1: - .globl func_cu1 - .type func_cu1, %function -func_cu1: -.Lbegin_func_cu1: - .int 0 -.Lend_func_cu1: - .size func_cu1, .-func_cu1 -.Lend_text1: + .data + .globl func_extern_resolvable +func_extern_resolvable: + .globl extern_resolvable +extern_resolvable: +resolvable: + .4byte 1234567890 /* Debug information */ @@ -39,36 +36,89 @@ func_cu1: /* CU die */ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ - .4byte .Lline1_begin /* DW_AT_stmt_list */ - .4byte .Lend_text1 /* DW_AT_high_pc */ - .4byte .Lbegin_text1 /* DW_AT_low_pc */ + .4byte cu_text_end /* DW_AT_high_pc */ + .4byte cu_text_start /* DW_AT_low_pc */ .ascii "file1.txt\0" /* DW_AT_name */ .ascii "GNU C 3.3.3\0" /* DW_AT_producer */ .byte 1 /* DW_AT_language (C) */ - /* func_cu1 */ - .uleb128 2 /* Abbrev: DW_TAG_subprogram */ - .byte 1 /* DW_AT_external */ - .byte 1 /* DW_AT_decl_file */ - .byte 2 /* DW_AT_decl_line */ - .ascii "func_cu1\0" /* DW_AT_name */ - .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ - .4byte .Lbegin_func_cu1 /* DW_AT_low_pc */ - .4byte .Lend_func_cu1 /* DW_AT_high_pc */ - .byte 1 /* DW_AT_frame_base: length */ - .byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */ - .Ltype_int: .uleb128 3 /* Abbrev: DW_TAG_base_type */ .ascii "int\0" /* DW_AT_name */ .byte 4 /* DW_AT_byte_size */ .byte 5 /* DW_AT_encoding */ - .uleb128 4 /* Abbrev: DW_TAG_variable */ - .ascii "noloc\0" /* DW_AT_name */ + .uleb128 7 /* Abbrev: DW_TAG_variable (location) */ + .ascii "file_location\0" /* DW_AT_name */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 3 /* DW_OP_addr */ + .4byte resolvable /* */ +2: .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + + .uleb128 5 /* Abbrev: DW_TAG_variable (bare) */ + .ascii "file_optimized_out\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + + .uleb128 8 /* Abbrev: DW_TAG_variable (location+extern) */ + .ascii "extern_location\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 3 /* DW_OP_addr */ + .4byte resolvable /* */ +2: .byte 1 /* DW_AT_external */ + + .uleb128 4 /* Abbrev: DW_TAG_variable (extern) */ + .ascii "extern_resolvable\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 1 /* DW_AT_external */ + + /* This variable is optimized-out. */ + .uleb128 4 /* Abbrev: DW_TAG_variable (extern) */ + .ascii "extern_unresolvable\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 1 /* DW_AT_external */ + + /* main */ + .uleb128 6 /* Abbrev: DW_TAG_subprogram */ + .byte 1 /* DW_AT_decl_file */ + .byte 2 /* DW_AT_decl_line */ + .ascii "main\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .4byte cu_text_start /* DW_AT_low_pc */ + .4byte cu_text_end /* DW_AT_high_pc */ + + .uleb128 7 /* Abbrev: DW_TAG_variable (location) */ + .ascii "func_location\0" /* DW_AT_name */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 3 /* DW_OP_addr */ + .4byte resolvable /* */ +2: .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + + .uleb128 5 /* Abbrev: DW_TAG_variable (bare) */ + .ascii "func_optimized_out\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + + .uleb128 8 /* Abbrev: DW_TAG_variable (location+extern) */ + .ascii "func_extern_location\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 3 /* DW_OP_addr */ + .4byte resolvable /* */ +2: .byte 1 /* DW_AT_external */ + + .uleb128 4 /* Abbrev: DW_TAG_variable (extern) */ + .ascii "func_extern_resolvable\0" /* DW_AT_name */ .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ .byte 1 /* DW_AT_external */ + /* This variable is optimized-out. */ + .uleb128 4 /* Abbrev: DW_TAG_variable (extern) */ + .ascii "func_extern_unresolvable\0" /* DW_AT_name */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 1 /* DW_AT_external */ + + .byte 0 /* End of children of main */ + .byte 0 /* End of children of CU */ .Lcu1_end: @@ -79,8 +129,6 @@ func_cu1: .uleb128 1 /* Abbrev code */ .uleb128 0x11 /* DW_TAG_compile_unit */ .byte 1 /* has_children */ - .uleb128 0x10 /* DW_AT_stmt_list */ - .uleb128 0x6 /* DW_FORM_data4 */ .uleb128 0x12 /* DW_AT_high_pc */ .uleb128 0x1 /* DW_FORM_addr */ .uleb128 0x11 /* DW_AT_low_pc */ @@ -94,11 +142,43 @@ func_cu1: .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ - .uleb128 2 /* Abbrev code */ - .uleb128 0x2e /* DW_TAG_subprogram */ + .uleb128 3 /* Abbrev code */ + .uleb128 0x24 /* DW_TAG_base_type */ .byte 0 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0xb /* DW_AT_byte_size */ + .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x3e /* DW_AT_encoding */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 4 /* Abbrev code (extern) */ + .uleb128 0x34 /* DW_TAG_variable */ + .byte 0 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ .uleb128 0x3f /* DW_AT_external */ .uleb128 0xc /* DW_FORM_flag */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 5 /* Abbrev code (bare) */ + .uleb128 0x34 /* DW_TAG_variable */ + .byte 0 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 6 /* Abbrev code */ + .uleb128 0x2e /* DW_TAG_subprogram */ + .byte 1 /* has_children */ .uleb128 0x3a /* DW_AT_decl_file */ .uleb128 0xb /* DW_FORM_data1 */ .uleb128 0x3b /* DW_AT_decl_line */ @@ -111,30 +191,30 @@ func_cu1: .uleb128 0x1 /* DW_FORM_addr */ .uleb128 0x12 /* DW_AT_high_pc */ .uleb128 0x1 /* DW_FORM_addr */ - .uleb128 0x40 /* DW_AT_frame_base */ - .uleb128 0xa /* DW_FORM_block1 */ .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ - .uleb128 3 /* Abbrev code */ - .uleb128 0x24 /* DW_TAG_base_type */ + .uleb128 7 /* Abbrev code (location) */ + .uleb128 0x34 /* DW_TAG_variable */ .byte 0 /* has_children */ .uleb128 0x3 /* DW_AT_name */ .uleb128 0x8 /* DW_FORM_string */ - .uleb128 0xb /* DW_AT_byte_size */ - .uleb128 0xb /* DW_FORM_data1 */ - .uleb128 0x3e /* DW_AT_encoding */ - .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x2 /* DW_AT_location */ + .uleb128 0xa /* DW_FORM_block1 */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ - .uleb128 4 /* Abbrev code */ + .uleb128 8 /* Abbrev code (location+extern) */ .uleb128 0x34 /* DW_TAG_variable */ .byte 0 /* has_children */ .uleb128 0x3 /* DW_AT_name */ .uleb128 0x8 /* DW_FORM_string */ .uleb128 0x49 /* DW_AT_type */ .uleb128 0x13 /* DW_FORM_ref4 */ + .uleb128 0x2 /* DW_AT_location */ + .uleb128 0xa /* DW_FORM_block1 */ .uleb128 0x3f /* DW_AT_external */ .uleb128 0xc /* DW_FORM_flag */ .byte 0x0 /* Terminator */ @@ -142,69 +222,3 @@ func_cu1: .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ - -/* Line table */ - .section .debug_line -.Lline1_begin: - .4byte .Lline1_end - .Lline1_start /* Initial length */ -.Lline1_start: - .2byte 2 /* Version */ - .4byte .Lline1_lines - .Lline1_hdr /* header_length */ -.Lline1_hdr: - .byte 1 /* Minimum insn length */ - .byte 1 /* default_is_stmt */ - .byte 1 /* line_base */ - .byte 1 /* line_range */ - .byte 0x10 /* opcode_base */ - - /* Standard lengths */ - .byte 0 - .byte 1 - .byte 1 - .byte 1 - .byte 1 - .byte 0 - .byte 0 - .byte 0 - .byte 1 - .byte 0 - .byte 0 - .byte 1 - .byte 0 - .byte 0 - .byte 0 - - /* Include directories */ - .byte 0 - - /* File names */ - .ascii "file1.txt\0" - .uleb128 0 - .uleb128 0 - .uleb128 0 - - .byte 0 - -.Lline1_lines: - .byte 0 /* DW_LNE_set_address */ - .uleb128 5 - .byte 2 - .4byte .Lbegin_func_cu1 - - .byte 3 /* DW_LNS_advance_line */ - .sleb128 3 /* ... to 4 */ - - .byte 1 /* DW_LNS_copy */ - - .byte 1 /* DW_LNS_copy (second time as an end-of-prologue marker) */ - - .byte 0 /* DW_LNE_set_address */ - .uleb128 5 - .byte 2 - .4byte .Lend_func_cu1 - - .byte 0 /* DW_LNE_end_of_sequence */ - .uleb128 1 - .byte 1 - -.Lline1_end: --- gdb/testsuite/gdb.dwarf2/dw2-noloc.exp 3 Jan 2009 05:58:04 -0000 1.4 +++ gdb/testsuite/gdb.dwarf2/dw2-noloc.exp 24 Mar 2009 21:05:16 -0000 @@ -24,25 +24,55 @@ if {![istarget *-*-linux*] return 0 } -set testfile "dw2-noloc" -set srcfile ${testfile}.S -set binfile ${objdir}/${subdir}/${testfile}.x - -if { [gdb_compile "${srcdir}/${subdir}/main.c" "main.o" object {debug}] != "" } { +if { [prepare_for_testing dw2-noloc.exp "dw2-noloc" {dw2-noloc-main.c dw2-noloc.S} {nodebug}] } { return -1 } -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${testfile}.o" object {nodebug}] != "" } { - return -1 +proc globals {type} { + global pf_prefix + set old_prefix $pf_prefix + lappend pf_prefix "$type:" + + gdb_test "print file_location" "= 1234567890" + gdb_test "ptype file_location" "type = int" + + gdb_test "print file_optimized_out" "= " + gdb_test "ptype file_optimized_out" "type = int" + + gdb_test "print extern_location" "= 1234567890" + gdb_test "ptype extern_location" "type = int" + + gdb_test "print extern_resolvable" "= 1234567890" + gdb_test "ptype extern_resolvable" "type = int" + + # This variable should be printed as optimized-out. + gdb_test "print extern_unresolvable" "Address of symbol \"extern_unresolvable\" is unknown\\." + gdb_test "ptype extern_unresolvable" "type = int" + + set pf_prefix $old_prefix } -if { [gdb_compile "${testfile}.o main.o" "${binfile}" executable {debug}] != "" } { +globals no-run + +if ![runto_main] { return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} +globals in-main + + +gdb_test "print func_location" "= 1234567890" +gdb_test "ptype func_location" "type = int" + +gdb_test "print func_optimized_out" "= " +gdb_test "ptype func_optimized_out" "type = int" + +gdb_test "print func_extern_location" "= 1234567890" +gdb_test "ptype func_extern_location" "type = int" + +gdb_test "print func_extern_resolvable" "= 1234567890" +gdb_test "ptype func_extern_resolvable" "type = int" -gdb_test "print noloc" "Address of symbol \"noloc\" is unknown." "print noloc" +# This variable should be printed as optimized-out. +gdb_test "print func_extern_unresolvable" "Address of symbol \"func_extern_unresolvable\" is unknown\\." +gdb_test "ptype func_extern_unresolvable" "type = int"