On Fri, 15 May 2009 21:44:43 +0200, Richard Guenther wrote: > One more issue is that with g++ 4.1 > > #include > const char foo_c[] = "here is foo_c"; > int main() > { > puts(foo_c); > return 0; > } > > foo_c at main is printed as > > (gdb) p foo_c > $1 = '\0' > (gdb) ptype foo_c > type = char [14] > > it works if I remove the puts call. It also works with g++ 4.2 and > newer. I wonder if gdb is confused by g++ 4.1 using DW_AT_const_value > for the string ... Yes, it looks so. But this issue is unrelated to the Archer patches, it is a normal FSF GDB bug. Cross-posting and requesting commit approval. Regression tested on x86_64-unknown-linux-gnu. Thanks, Jan gdb/ 2009-05-15 Jan Kratochvil Fix parsing DW_AT_const_value using DW_FORM_string. * dwarf2read.c (dwarf2_const_value ): New. gdb/testsuite/ 2009-05-15 Jan Kratochvil * gdb.dwarf2/dw2-strp.exp (p a_string2, ptype a_string2): New. * gdb.dwarf2/dw2-strp.S (a_string2): New. --- gdb/dwarf2read.c 1 May 2009 14:43:20 -0000 1.302 +++ gdb/dwarf2read.c 15 May 2009 20:44:44 -0000 @@ -7957,6 +7957,7 @@ dwarf2_const_value (struct attribute *at DW_ADDR (attr)); SYMBOL_CLASS (sym) = LOC_CONST_BYTES; break; + case DW_FORM_string: case DW_FORM_strp: /* DW_STRING is already allocated on the obstack, point directly to it. */ --- gdb/testsuite/gdb.dwarf2/dw2-strp.S 31 Mar 2009 20:21:08 -0000 1.4 +++ gdb/testsuite/gdb.dwarf2/dw2-strp.S 15 May 2009 20:44:44 -0000 @@ -52,17 +52,23 @@ .byte 1 /* DW_AT_byte_size */ .byte 6 /* DW_AT_encoding */ - .uleb128 5 /* Abbrev: DW_TAG_variable */ + .uleb128 5 /* Abbrev: DW_TAG_variable DW_FORM_strp */ .4byte .Lvarname /* DW_AT_name */ .4byte .Lconst_type-.Lcu1_begin/* DW_AT_type */ .4byte .Lvarcontents /* DW_AT_const_value */ .byte 1 /* DW_AT_external */ + .uleb128 6 /* Abbrev: DW_TAG_variable DW_FORM_string */ + .string "a_string2" /* DW_AT_name */ + .4byte .Lconst_type-.Lcu1_begin/* DW_AT_type */ + .string "hello world2\n" /* DW_AT_const_value */ + .byte 1 /* DW_AT_external */ + .Lconst_type: - .uleb128 6 /* Abbrev: DW_TAG_const_type */ + .uleb128 7 /* Abbrev: DW_TAG_const_type */ .4byte .Larray_type-.Lcu1_begin/* DW_AT_type */ - .uleb128 7 /* Abbrev: DW_TAG_variable (name "") */ + .uleb128 8 /* Abbrev: DW_TAG_variable (name "") */ .4byte .Lemptyname /* DW_AT_name */ .byte 0 /* End of children of CU */ @@ -125,6 +131,20 @@ .byte 0x0 /* Terminator */ .uleb128 6 /* Abbrev code */ + .uleb128 0x34 /* DW_TAG_variable */ + .byte 0x0 /* no_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .uleb128 0x1c /* DW_AT_const_value */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x3f /* DW_AT_external */ + .uleb128 0xc /* DW_FORM_flag */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 7 /* Abbrev code */ .uleb128 0x26 /* DW_TAG_const_type */ .byte 0x0 /* DW_children_no */ .uleb128 0x49 /* DW_AT_type */ @@ -132,7 +152,7 @@ .byte 0x0 /* Terminator */ .byte 0x0 /* Terminator */ - .uleb128 7 /* Abbrev code */ + .uleb128 8 /* Abbrev code */ .uleb128 0x34 /* DW_TAG_variable */ .byte 0x0 /* DW_children_no */ .uleb128 0x3 /* DW_AT_name */ --- gdb/testsuite/gdb.dwarf2/dw2-strp.exp 3 Jan 2009 05:58:04 -0000 1.2 +++ gdb/testsuite/gdb.dwarf2/dw2-strp.exp 15 May 2009 20:44:44 -0000 @@ -48,5 +48,8 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} -gdb_test "p a_string" "\\\$1 = \"hello world!\\\\n\"" +gdb_test "p a_string" " = \"hello world!\\\\n\"" gdb_test "ptype a_string" "type = char \\\[14\\\]" + +gdb_test "p a_string2" " = \"hello world2\\\\n\"" +gdb_test "ptype a_string2" "type = char \\\[14\\\]"