From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16470 invoked by alias); 25 Apr 2008 18:16:13 -0000 Received: (qmail 16458 invoked by uid 22791); 25 Apr 2008 18:16:10 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 25 Apr 2008 18:15:31 +0000 Received: (qmail 2304 invoked from network); 25 Apr 2008 18:15:29 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 25 Apr 2008 18:15:29 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Handle DW_AT_const_value/DW_FORM_strp variables Date: Fri, 25 Apr 2008 19:19:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_/+hEIzOzNpIwyJP" Message-Id: <200804251915.27580.pedro@codesourcery.com> 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: 2008-04/txt/msg00578.txt.bz2 --Boundary-00=_/+hEIzOzNpIwyJP Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 608 Hi, In some cases, a string variable can be optimized out by the compiler, e.g., because it is not referenced anywhere in the code. Debug info may still be generated for such cases, so printing the variables contents should still work. GDB is almost handling that -- it's just the final glue is missing. Here's a patch that adds it, and a new testcase. In C, it would look something like: const char a_string[] = "hello world!\n"; int main () { } An unpatched GDB prints: (gdb) p a_string $1 = '\0' Patched prints: (gdb) p a_string $1 = "hello world!\n" -- Pedro Alves --Boundary-00=_/+hEIzOzNpIwyJP Content-Type: text/x-diff; charset="utf-8"; name="const_strp.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="const_strp.diff" Content-length: 8020 gdb/ 2008-04-25 Pedro Alves * dwarf2read.c (dwarf2_const_value): Handle DW_FORM_strp. gdb/testsuite/ 2008-04-25 Pedro Alves * gdb.dwarf2/dw2-strp.S, gdb.dwarf2/dw2-strp.exp: New files. --- gdb/dwarf2read.c | 6 + gdb/testsuite/gdb.dwarf2/dw2-strp.S | 142 ++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.dwarf2/dw2-strp.exp | 52 ++++++++++++ 3 files changed, 200 insertions(+) Index: src/gdb/dwarf2read.c =================================================================== --- src.orig/gdb/dwarf2read.c 2008-04-25 18:21:44.000000000 +0100 +++ src/gdb/dwarf2read.c 2008-04-25 19:04:03.000000000 +0100 @@ -7706,6 +7706,12 @@ dwarf2_const_value (struct attribute *at DW_ADDR (attr)); SYMBOL_CLASS (sym) = LOC_CONST_BYTES; break; + case DW_FORM_strp: + /* DW_STRING is already allocated on the obstack, point directly + to it. */ + SYMBOL_VALUE_BYTES (sym) = (gdb_byte *) DW_STRING (attr); + SYMBOL_CLASS (sym) = LOC_CONST_BYTES; + break; case DW_FORM_block1: case DW_FORM_block2: case DW_FORM_block4: Index: src/gdb/testsuite/gdb.dwarf2/dw2-strp.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gdb/testsuite/gdb.dwarf2/dw2-strp.S 2008-04-25 18:22:38.000000000 +0100 @@ -0,0 +1,142 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008 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 . */ + +/* Debug information */ + + .section .debug_info +.Lcu1_begin: + .long .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ +.Lcu1_start: + .value 2 /* DWARF version number */ + .long .Ldebug_abbrev0 /* Offset Into Abbrev. Section */ + .byte 4 /* Pointer Size (in bytes) */ + + /* CU die */ + .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ + .long .Lproducer /* DW_AT_producer */ + .byte 1 /* DW_AT_language (C) */ + +.Larray_type: + .uleb128 2 /* Abbrev: DW_TAG_array_type */ + .long .Lchar_type-.Lcu1_begin /* DW_AT_type */ + + .uleb128 3 /* Abbrev: DW_TAG_subrange_type */ + .long .Luint_type-.Lcu1_begin /* DW_AT_type */ + .byte 0xd /* DW_AT_upper_bound */ + .byte 0 /* End of children of die */ + +.Luint_type: + .uleb128 4 /* Abbrev: DW_TAG_base_type */ + .long .Luint_str /* DW_AT_name */ + .byte 4 /* DW_AT_byte_size */ + .byte 7 /* DW_AT_encoding */ + +.Lchar_type: + .uleb128 4 /* Abbrev: DW_TAG_base_type */ + .long .Lchar_str /* DW_AT_name */ + .byte 1 /* DW_AT_byte_size */ + .byte 6 /* DW_AT_encoding */ + + .uleb128 5 /* Abbrev: DW_TAG_variable */ + .long .Lvarname /* DW_AT_name */ + .long .Lconst_type-.Lcu1_begin/* DW_AT_type */ + .long .Lvarcontents /* DW_AT_const_value */ + .byte 1 /* DW_AT_external */ + +.Lconst_type: + .uleb128 6 /* Abbrev: DW_TAG_const_type */ + .long .Larray_type-.Lcu1_begin/* DW_AT_type */ + .byte 0 /* End of children of CU */ +.Lcu1_end: + + .section .debug_abbrev +.Ldebug_abbrev0: + .uleb128 1 /* Abbrev code */ + .uleb128 0x11 /* DW_TAG_compile_unit */ + .byte 0x1 /* has_children */ + .uleb128 0x25 /* DW_AT_producer */ + .uleb128 0xe /* DW_FORM_strp */ + .uleb128 0x13 /* DW_AT_language */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 2 /* Abbrev code */ + .uleb128 0x1 /* TAG: DW_TAG_array_type */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 3 /* Abbrev code */ + .uleb128 0x21 /* DW_TAG_subrange_type */ + .byte 0x0 /* no children */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .uleb128 0x2f /* DW_AT_upper_bound */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 4 /* Abbrev code */ + .uleb128 0x24 /* DW_TAG_base_type */ + .byte 0x0 /* no_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0xe /* DW_FORM_strp */ + .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 5 /* Abbrev code */ + .uleb128 0x34 /* DW_TAG_variable */ + .byte 0x0 /* no_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0xe /* DW_FORM_strp */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .uleb128 0x1c /* DW_AT_const_value */ + .uleb128 0xe /* DW_FORM_strp */ + .uleb128 0x3f /* DW_AT_external */ + .uleb128 0xc /* DW_FORM_flag */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 6 /* Abbrev code */ + .uleb128 0x26 /* DW_TAG_const_type */ + .byte 0x0 /* DW_children_no */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + +/* String table */ + .section .debug_str +.Lproducer: + .string "GNU C 3.3.3" +.Lchar_str: + .string "char" +.Luint_str: + .string "unsigned int" +.Lvarname: + .string "a_string" +.Lvarcontents: + .string "hello world!\n" Index: src/gdb/testsuite/gdb.dwarf2/dw2-strp.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gdb/testsuite/gdb.dwarf2/dw2-strp.exp 2008-04-25 18:22:38.000000000 +0100 @@ -0,0 +1,52 @@ +# Copyright 2008 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 . + +# Test printint string variables that are optimized out because they +# are unreferenced in code, and whose contents appear in .debug_str. + +# 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-strp" +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 "p a_string" "\\\$1 = \"hello world!\\\\n\"" +gdb_test "ptype a_string" "type = char \\\[14\\\]" --Boundary-00=_/+hEIzOzNpIwyJP--