From: Pedro Alves Date: Fri, 25 Apr 2008 18:45:24 +0000 (+0000) Subject: gdb/ X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=93b5768bfdc8cb884d54258a3935144214608cac;p=deliverable%2Fbinutils-gdb.git gdb/ * dwarf2read.c (dwarf2_const_value): Handle DW_FORM_strp. gdb/testsuite/ * gdb.dwarf2/dw2-strp.S, gdb.dwarf2/dw2-strp.exp: New files. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ce3f532a63..fa31e444e3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2008-04-25 Pedro Alves + + * dwarf2read.c (dwarf2_const_value): Handle DW_FORM_strp. + 2008-04-25 Pedro Alves * amd64-tdep.c (amd64_get_longjmp_target): New. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index dab4290491..40eb412e29 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -7706,6 +7706,12 @@ dwarf2_const_value (struct attribute *attr, struct symbol *sym, 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: diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1942198d53..e0f19d495f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-04-25 Pedro Alves + + * gdb.dwarf2/dw2-strp.S, gdb.dwarf2/dw2-strp.exp: New files. + 2008-04-24 Vladimir Prus * gdb.mi/mi-syn-frame.exp: Adjust for token disappearance. diff --git a/gdb/testsuite/gdb.dwarf2/dw2-strp.S b/gdb/testsuite/gdb.dwarf2/dw2-strp.S new file mode 100644 index 0000000000..ac89bb4d49 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-strp.S @@ -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" diff --git a/gdb/testsuite/gdb.dwarf2/dw2-strp.exp b/gdb/testsuite/gdb.dwarf2/dw2-strp.exp new file mode 100644 index 0000000000..d5bfe41240 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-strp.exp @@ -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\\\]"