This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix DW_AT_const_value using DW_FORM_string


On Fri, 15 May 2009 21:44:43 +0200, Richard Guenther wrote:
> One more issue is that with g++ 4.1
> 
> #include <stdio.h>
> 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' <repeats 13 times>
> (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  <jan.kratochvil@redhat.com>

	Fix parsing DW_AT_const_value using DW_FORM_string.
	* dwarf2read.c (dwarf2_const_value <DW_FORM_string>): New.

gdb/testsuite/
2009-05-15  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* 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\\\]"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]