Commit 64153cce by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/49871 (-gdwarf-3 creates invalid DWARF3 with DW_AT_data_member_location attribute)

	PR debug/49871
	* dwarf2out.c (size_of_die, value_format, output_die): Use
	DW_FORM_udata instead of DW_FORM_data[48] for
	dw_val_class_unsigned_const DW_AT_data_member_location for DWARF 3.

	* gcc.dg/debug/dwarf2/pr49871.c: New test.

From-SVN: r176876
parent 844bf05b
2011-07-28 Jakub Jelinek <jakub@redhat.com>
PR debug/49871
* dwarf2out.c (size_of_die, value_format, output_die): Use
DW_FORM_udata instead of DW_FORM_data[48] for
dw_val_class_unsigned_const DW_AT_data_member_location for DWARF 3.
2011-07-28 H.J. Lu <hongjiu.lu@intel.com> 2011-07-28 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.md (*tls_global_dynamic_64): Update * config/i386/i386.md (*tls_global_dynamic_64): Update
......
...@@ -7652,7 +7652,15 @@ size_of_die (dw_die_ref die) ...@@ -7652,7 +7652,15 @@ size_of_die (dw_die_ref die)
size += size_of_sleb128 (AT_int (a)); size += size_of_sleb128 (AT_int (a));
break; break;
case dw_val_class_unsigned_const: case dw_val_class_unsigned_const:
size += constant_size (AT_unsigned (a)); {
int csize = constant_size (AT_unsigned (a));
if (dwarf_version == 3
&& a->dw_attr == DW_AT_data_member_location
&& csize >= 4)
size += size_of_uleb128 (AT_unsigned (a));
else
size += csize;
}
break; break;
case dw_val_class_const_double: case dw_val_class_const_double:
size += 2 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; size += 2 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
...@@ -7953,8 +7961,16 @@ value_format (dw_attr_ref a) ...@@ -7953,8 +7961,16 @@ value_format (dw_attr_ref a)
case 2: case 2:
return DW_FORM_data2; return DW_FORM_data2;
case 4: case 4:
/* In DWARF3 DW_AT_data_member_location with
DW_FORM_data4 or DW_FORM_data8 is a loclistptr, not
constant, so we need to use DW_FORM_udata if we need
a large constant. */
if (dwarf_version == 3 && a->dw_attr == DW_AT_data_member_location)
return DW_FORM_udata;
return DW_FORM_data4; return DW_FORM_data4;
case 8: case 8:
if (dwarf_version == 3 && a->dw_attr == DW_AT_data_member_location)
return DW_FORM_udata;
return DW_FORM_data8; return DW_FORM_data8;
default: default:
gcc_unreachable (); gcc_unreachable ();
...@@ -8261,8 +8277,15 @@ output_die (dw_die_ref die) ...@@ -8261,8 +8277,15 @@ output_die (dw_die_ref die)
break; break;
case dw_val_class_unsigned_const: case dw_val_class_unsigned_const:
dw2_asm_output_data (constant_size (AT_unsigned (a)), {
AT_unsigned (a), "%s", name); int csize = constant_size (AT_unsigned (a));
if (dwarf_version == 3
&& a->dw_attr == DW_AT_data_member_location
&& csize >= 4)
dw2_asm_output_data_uleb128 (AT_unsigned (a), "%s", name);
else
dw2_asm_output_data (csize, AT_unsigned (a), "%s", name);
}
break; break;
case dw_val_class_const_double: case dw_val_class_const_double:
......
2011-07-28 Jakub Jelinek <jakub@redhat.com> 2011-07-28 Jakub Jelinek <jakub@redhat.com>
PR debug/49871
* gcc.dg/debug/dwarf2/pr49871.c: New test.
2011-07-28 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/i386.exp (check_effective_target_bmi): Make sure * gcc.target/i386/i386.exp (check_effective_target_bmi): Make sure
the builtin isn't optimized away. the builtin isn't optimized away.
......
/* PR debug/49871 */
/* { dg-do compile } */
/* { dg-options "-gdwarf-3 -dA -fno-merge-debug-strings" } */
struct S
{
char a[1 << 16];
int b;
} s;
/* { dg-final { scan-assembler "\\(DW_AT_data_member_location\\)\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(DW_FORM_udata\\)" } } */
/* { dg-final { scan-assembler-not "\\(DW_AT_data_member_location\\)\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(DW_FORM_data\[48\]\\)" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment