From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11232 invoked by alias); 28 Mar 2007 22:21:56 -0000 Received: (qmail 11173 invoked by uid 22791); 28 Mar 2007 22:21:51 -0000 X-Spam-Check-By: sourceware.org Received: from nile.gnat.com (HELO nile.gnat.com) (205.232.38.5) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 28 Mar 2007 23:21:44 +0100 Received: from localhost (localhost [127.0.0.1]) by filtered-nile.gnat.com (Postfix) with ESMTP id 7E5DD48CDCE for ; Wed, 28 Mar 2007 18:21:42 -0400 (EDT) Received: from nile.gnat.com ([127.0.0.1]) by localhost (nile.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 26762-01-4 for ; Wed, 28 Mar 2007 18:21:42 -0400 (EDT) Received: from joel.gnat.com (unknown [70.71.0.212]) by nile.gnat.com (Postfix) with ESMTP id C930648CBFA for ; Wed, 28 Mar 2007 18:21:41 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id EA1C0E7B43; Wed, 28 Mar 2007 18:22:53 -0400 (EDT) Date: Wed, 28 Mar 2007 22:21:00 -0000 From: Joel Brobecker To: gdb-patches@sourceware.org Subject: [RFA/DWARF] variables with no DW_AT_location Message-ID: <20070328222253.GM3866@adacore.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="8t9RHnE3ZwKMSgU+" Content-Disposition: inline User-Agent: Mutt/1.4.2.2i 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: 2007-03/txt/msg00296.txt.bz2 --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 2324 Hello, We came across a case where GNAT generated some debugging info for a local variable, but no DW_AT_location. As a result, the debugger ended up not "seeing" that variable. (gdb) p subp No definition of "subp" in current context. After investigation, it appeared that the variable was actually optimized away by the compiler. Although we were later able to link it to one of its temporary location, so the symptoms disappeared. But I had a look at the DWARF reference, and it says that the missing attribute means that the variable was optimized away. I propose to change GDB to print "optimized out" in this case. The simplest way of doing this was to take advantage of the fact that the dwarf2read module sets the symbol class of such variables to LOC_UNRESOLVED, and then modify the code in findvar to return an "optimized out" value rather than no value at all. To be honest, I find the logic in read_var_value for LOC_UNRESOLVED types to be a bit questionable: We revert to minimal symbols if the debugging info does not provide the location. But if the variable was indeed optimized out, what really proves that we are picking up the same symbol? The one we're interested in could be a local variable that was optimized away while the one found by GDB in the symbol table could be another global variable that happens to have the same name. However, I tried adjusting dwarf2read to avoid setting the class to LOC_UNRESOLVED, but then starting hitting other problems (one was a dereference of a NULL type). I'm doing this on my own time, so I'm wondering what you guys think of the approach is suggesting in this patch. 2007-03-28 Joel Brobecker * findvar.c (read_var_value): Return optimized-out values for LOC_UNRESOLVED symbols when we cannot find an associated minimal symbol. I have create a new testcase for this. But the change also affects one of the tests in gdb.cp. I think it's OK, although GDB is a bit less verbose. I have attached a proposed update of this testcase. 2007-03-28 Joel Brobecker * gdb.dwarf2/dw2-noloc.S: New file. * gdb.dwarf2/dw2-noloc.exp: New file. * gdb.cp/m-static.exp: Minor adjustment to new GDB output. Tested on x86-linux. OK to apply? -- Joel --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="no_at_loc.diff" Content-length: 1628 Index: findvar.c =================================================================== RCS file: /cvs/src/src/gdb/findvar.c,v retrieving revision 1.100 diff -u -p -r1.100 findvar.c --- findvar.c 27 Feb 2007 19:46:04 -0000 1.100 +++ findvar.c 28 Mar 2007 21:52:06 -0000 @@ -575,7 +575,11 @@ addresses have not been bound by the dyn msym = lookup_minimal_symbol (DEPRECATED_SYMBOL_NAME (var), NULL, NULL); if (msym == NULL) - return 0; + { + VALUE_LVAL (v) = not_lval; + set_value_optimized_out (v, 1); + return v; + } if (overlay_debugging) addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (msym), SYMBOL_BFD_SECTION (msym)); Index: testsuite/gdb.cp/m-static.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/m-static.exp,v retrieving revision 1.5 diff -u -p -r1.5 m-static.exp --- testsuite/gdb.cp/m-static.exp 9 Jan 2007 17:59:12 -0000 1.5 +++ testsuite/gdb.cp/m-static.exp 28 Mar 2007 22:18:23 -0000 @@ -126,7 +126,7 @@ gdb_test "print test3.data.value_derived gdb_test "print test4.elsewhere" "\\$\[0-9\].* = 221" "static const int initialized elsewhere" # static const int that nobody initializes. From PR gdb/635. -gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimised out" "static const int initialized nowhere" +gdb_test "print test4.nowhere" "" "static const int initialized nowhere" # Perhaps at some point test4 should also include a test for a static # const int that was initialized in the header file. But I'm not sure --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="dw2-noloc.S" Content-length: 5747 /* This testcase is part of GDB, the GNU debugger. Copyright 2007 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ .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: /* Debug information */ .section .debug_info .Lcu1_begin: /* CU header */ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ .Lcu1_start: .2byte 2 /* DWARF Version */ .4byte .Labbrev1_begin /* Offset into abbrev section */ .byte 4 /* Pointer size */ /* 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 */ .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 */ .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ .byte 1 /* DW_AT_external */ .byte 0 /* End of children of CU */ .Lcu1_end: /* Abbrev table */ .section .debug_abbrev .Labbrev1_begin: .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 */ .uleb128 0x1 /* DW_FORM_addr */ .uleb128 0x3 /* DW_AT_name */ .uleb128 0x8 /* DW_FORM_string */ .uleb128 0x25 /* DW_AT_producer */ .uleb128 0x8 /* DW_FORM_string */ .uleb128 0x13 /* DW_AT_language */ .uleb128 0xb /* DW_FORM_data1 */ .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ .uleb128 2 /* Abbrev code */ .uleb128 0x2e /* DW_TAG_subprogram */ .byte 0 /* has_children */ .uleb128 0x3f /* DW_AT_external */ .uleb128 0xc /* DW_FORM_flag */ .uleb128 0x3a /* DW_AT_decl_file */ .uleb128 0xb /* DW_FORM_data1 */ .uleb128 0x3b /* DW_AT_decl_line */ .uleb128 0xb /* DW_FORM_data1 */ .uleb128 0x3 /* DW_AT_name */ .uleb128 0x8 /* DW_FORM_string */ .uleb128 0x49 /* DW_AT_type */ .uleb128 0x13 /* DW_FORM_ref4 */ .uleb128 0x11 /* DW_AT_low_pc */ .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 */ .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 */ .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 */ .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: --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="dw2-noloc.exp" Content-length: 1625 # Copyright 2007 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # This test can only be run on targets which support DWARF-2 and use gas. # For now pick a sampling of likely targets. if {![istarget *-*-linux*] && ![istarget *-*-gnu*] && ![istarget *-*-elf*] && ![istarget *-*-openbsd*] && ![istarget arm-*-eabi*] && ![istarget powerpc-*-eabi*]} { 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}] != "" } { return -1 } if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${testfile}.o" object {nodebug}] != "" } { return -1 } if { [gdb_compile "${testfile}.o main.o" "${binfile}" executable {debug}] != "" } { return -1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} gdb_test "print noloc" "" "print noloc" --8t9RHnE3ZwKMSgU+--