[PR63238] output alignment debug information

Output DWARFv5+ DW_AT_alignment for non-default alignment of
variables, fields and types.

for gcc/ChangeLog

	PR debug/63238
	* dwarf2out.c (clone_as_declaration): Drop DW_AT_alignment.
	(add_alignment_attribute): New.
	(base_type_die): Add alignment attribute.
	(subrange_type_die): Likewise.
	(modified_type_die): Likewise.
	(gen_array_type_die): Likewise.
	(gen_descr_array_type_die: Likewise.
	(gen_enumeration_type_die): Likewise.
	(gen_subprogram_die): Likewise.
	(gen_variable_die): Likewise.
	(gen_field_die): Likewise.
	(gen_ptr_to_mbr_type_die): Likewise.
	(gen_struct_or_union_type_die): Likewise.
	(gen_subroutine_type_die): Likewise.
	(gen_typedef_die): Likewise.
	(base_type_cmp): Compare alignment attribute.

for gcc/testsuite/ChangeLog

	PR debug/63238
	* gcc.dg/debug/dwarf2/align-1.c: New.
	* gcc.dg/debug/dwarf2/align-2.c: New.
	* gcc.dg/debug/dwarf2/align-3.c: New.
	* gcc.dg/debug/dwarf2/align-4.c: New.
	* gcc.dg/debug/dwarf2/align-5.c: New.
	* gcc.dg/debug/dwarf2/align-6.c: New.
	* gcc.dg/debug/dwarf2/align-as-1.c: New.
	* g++.dg/debug/dwarf2/align-1.C: New.
	* g++.dg/debug/dwarf2/align-2.C: New.
	* g++.dg/debug/dwarf2/align-3.C: New.
	* g++.dg/debug/dwarf2/align-4.C: New.
	* g++.dg/debug/dwarf2/align-5.C: New.
	* g++.dg/debug/dwarf2/align-6.C: New.

From-SVN: r245052
This commit is contained in:
Alexandre Oliva 2017-01-31 01:03:15 +00:00 committed by Alexandre Oliva
parent 8db29d88f3
commit 40fb9c89e1
16 changed files with 194 additions and 6 deletions

View file

@ -1,3 +1,23 @@
2017-01-30 Alexandre Oliva <aoliva@redhat.com>
PR debug/63238
* dwarf2out.c (clone_as_declaration): Drop DW_AT_alignment.
(add_alignment_attribute): New.
(base_type_die): Add alignment attribute.
(subrange_type_die): Likewise.
(modified_type_die): Likewise.
(gen_array_type_die): Likewise.
(gen_descr_array_type_die: Likewise.
(gen_enumeration_type_die): Likewise.
(gen_subprogram_die): Likewise.
(gen_variable_die): Likewise.
(gen_field_die): Likewise.
(gen_ptr_to_mbr_type_die): Likewise.
(gen_struct_or_union_type_die): Likewise.
(gen_subroutine_type_die): Likewise.
(gen_typedef_die): Likewise.
(base_type_cmp): Compare alignment attribute.
2017-01-30 Aaron Sawdey <acsawdey@linux.vnet.ibm.com> 2017-01-30 Aaron Sawdey <acsawdey@linux.vnet.ibm.com>
PR target/79170 PR target/79170

View file

@ -3510,6 +3510,7 @@ static void add_bound_info (dw_die_ref, enum dwarf_attribute, tree,
struct loc_descr_context *); struct loc_descr_context *);
static void add_subscript_info (dw_die_ref, tree, bool); static void add_subscript_info (dw_die_ref, tree, bool);
static void add_byte_size_attribute (dw_die_ref, tree); static void add_byte_size_attribute (dw_die_ref, tree);
static void add_alignment_attribute (dw_die_ref, tree);
static inline void add_bit_offset_attribute (dw_die_ref, tree, static inline void add_bit_offset_attribute (dw_die_ref, tree,
struct vlr_context *); struct vlr_context *);
static void add_bit_size_attribute (dw_die_ref, tree); static void add_bit_size_attribute (dw_die_ref, tree);
@ -7706,6 +7707,7 @@ clone_as_declaration (dw_die_ref die)
add_dwarf_attr (clone, a); add_dwarf_attr (clone, a);
break; break;
case DW_AT_byte_size: case DW_AT_byte_size:
case DW_AT_alignment:
default: default:
break; break;
} }
@ -12106,6 +12108,8 @@ base_type_die (tree type, bool reverse)
add_AT_unsigned (base_type_result, DW_AT_endianity, add_AT_unsigned (base_type_result, DW_AT_endianity,
BYTES_BIG_ENDIAN ? DW_END_little : DW_END_big); BYTES_BIG_ENDIAN ? DW_END_little : DW_END_big);
add_alignment_attribute (base_type_result, type);
if (fpt_used) if (fpt_used)
{ {
switch (fpt_info.scale_factor_kind) switch (fpt_info.scale_factor_kind)
@ -12269,6 +12273,8 @@ subrange_type_die (tree type, tree low, tree high, tree bias,
add_AT_unsigned (subrange_die, DW_AT_byte_size, size_in_bytes); add_AT_unsigned (subrange_die, DW_AT_byte_size, size_in_bytes);
} }
add_alignment_attribute (subrange_die, type);
if (low) if (low)
add_bound_info (subrange_die, DW_AT_lower_bound, low, NULL); add_bound_info (subrange_die, DW_AT_lower_bound, low, NULL);
if (high) if (high)
@ -12586,6 +12592,7 @@ modified_type_die (tree type, int cv_quals, bool reverse,
add_AT_unsigned (mod_type_die, DW_AT_byte_size, add_AT_unsigned (mod_type_die, DW_AT_byte_size,
simple_type_size_in_bits (type) / BITS_PER_UNIT); simple_type_size_in_bits (type) / BITS_PER_UNIT);
add_alignment_attribute (mod_type_die, type);
item_type = TREE_TYPE (type); item_type = TREE_TYPE (type);
addr_space_t as = TYPE_ADDR_SPACE (item_type); addr_space_t as = TYPE_ADDR_SPACE (item_type);
@ -19946,6 +19953,37 @@ add_byte_size_attribute (dw_die_ref die, tree tree_node)
add_AT_unsigned (die, DW_AT_byte_size, size); add_AT_unsigned (die, DW_AT_byte_size, size);
} }
/* Add a DW_AT_alignment attribute to DIE with TREE_NODE's non-default
alignment. */
static void
add_alignment_attribute (dw_die_ref die, tree tree_node)
{
if (dwarf_version < 5 && dwarf_strict)
return;
unsigned align;
if (DECL_P (tree_node))
{
if (!DECL_USER_ALIGN (tree_node))
return;
align = DECL_ALIGN_UNIT (tree_node);
}
else if (TYPE_P (tree_node))
{
if (!TYPE_USER_ALIGN (tree_node))
return;
align = TYPE_ALIGN_UNIT (tree_node);
}
else
gcc_unreachable ();
add_AT_unsigned (die, DW_AT_alignment, align);
}
/* For a FIELD_DECL node which represents a bit-field, output an attribute /* For a FIELD_DECL node which represents a bit-field, output an attribute
which specifies the distance in bits from the highest order bit of the which specifies the distance in bits from the highest order bit of the
"containing object" for the bit-field to the highest order bit of the "containing object" for the bit-field to the highest order bit of the
@ -20765,6 +20803,8 @@ gen_array_type_die (tree type, dw_die_ref context_die)
if (get_AT (array_die, DW_AT_name)) if (get_AT (array_die, DW_AT_name))
add_pubtype (type, array_die); add_pubtype (type, array_die);
add_alignment_attribute (array_die, type);
} }
/* After all arguments are created, adjust any DW_TAG_string_type /* After all arguments are created, adjust any DW_TAG_string_type
@ -20904,6 +20944,8 @@ gen_descr_array_type_die (tree type, struct array_descr_info *info,
if (get_AT (array_die, DW_AT_name)) if (get_AT (array_die, DW_AT_name))
add_pubtype (type, array_die); add_pubtype (type, array_die);
add_alignment_attribute (array_die, type);
} }
#if 0 #if 0
@ -21013,6 +21055,7 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)
TREE_ASM_WRITTEN (type) = 1; TREE_ASM_WRITTEN (type) = 1;
add_byte_size_attribute (type_die, type); add_byte_size_attribute (type_die, type);
add_alignment_attribute (type_die, type);
if (dwarf_version >= 3 || !dwarf_strict) if (dwarf_version >= 3 || !dwarf_strict)
{ {
tree underlying = lang_hooks.types.enum_underlying_base_type (type); tree underlying = lang_hooks.types.enum_underlying_base_type (type);
@ -21071,6 +21114,8 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)
else else
add_AT_flag (type_die, DW_AT_declaration, 1); add_AT_flag (type_die, DW_AT_declaration, 1);
add_alignment_attribute (type_die, type);
add_pubtype (type, type_die); add_pubtype (type, type_die);
return type_die; return type_die;
@ -21971,6 +22016,8 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
if (TREE_THIS_VOLATILE (decl) && (dwarf_version >= 5 || !dwarf_strict)) if (TREE_THIS_VOLATILE (decl) && (dwarf_version >= 5 || !dwarf_strict))
add_AT_flag (subr_die, DW_AT_noreturn, 1); add_AT_flag (subr_die, DW_AT_noreturn, 1);
add_alignment_attribute (subr_die, decl);
add_accessibility_attribute (subr_die, decl); add_accessibility_attribute (subr_die, decl);
} }
@ -22695,6 +22742,7 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
add_type_attribute (var_die, TREE_TYPE (decl_or_origin), add_type_attribute (var_die, TREE_TYPE (decl_or_origin),
decl_quals (decl_or_origin), false, decl_quals (decl_or_origin), false,
context_die); context_die);
add_alignment_attribute (var_die, decl);
add_AT_flag (var_die, DW_AT_external, 1); add_AT_flag (var_die, DW_AT_external, 1);
if (loc) if (loc)
{ {
@ -22822,6 +22870,8 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
if (DECL_ARTIFICIAL (decl)) if (DECL_ARTIFICIAL (decl))
add_AT_flag (var_die, DW_AT_artificial, 1); add_AT_flag (var_die, DW_AT_artificial, 1);
add_alignment_attribute (var_die, decl);
add_accessibility_attribute (var_die, decl); add_accessibility_attribute (var_die, decl);
} }
@ -23186,6 +23236,8 @@ gen_field_die (tree decl, struct vlr_context *ctx, dw_die_ref context_die)
add_bit_offset_attribute (decl_die, decl, ctx); add_bit_offset_attribute (decl_die, decl, ctx);
} }
add_alignment_attribute (decl_die, decl);
/* If we have a variant part offset, then we are supposed to process a member /* If we have a variant part offset, then we are supposed to process a member
of a QUAL_UNION_TYPE, which is how we represent variant parts in of a QUAL_UNION_TYPE, which is how we represent variant parts in
trees. */ trees. */
@ -23261,6 +23313,7 @@ gen_ptr_to_mbr_type_die (tree type, dw_die_ref context_die)
lookup_type_die (TYPE_OFFSET_BASETYPE (type))); lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
add_type_attribute (ptr_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false, add_type_attribute (ptr_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
context_die); context_die);
add_alignment_attribute (ptr_die, type);
if (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE if (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE
&& TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE) && TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE)
@ -24139,6 +24192,7 @@ gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
this type is expressed in terms of this type itself. */ this type is expressed in terms of this type itself. */
TREE_ASM_WRITTEN (type) = 1; TREE_ASM_WRITTEN (type) = 1;
add_byte_size_attribute (type_die, type); add_byte_size_attribute (type_die, type);
add_alignment_attribute (type_die, type);
if (TYPE_STUB_DECL (type) != NULL_TREE) if (TYPE_STUB_DECL (type) != NULL_TREE)
{ {
add_src_coords_attributes (type_die, TYPE_STUB_DECL (type)); add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
@ -24196,6 +24250,7 @@ gen_subroutine_type_die (tree type, dw_die_ref context_die)
add_prototyped_attribute (subr_die, type); add_prototyped_attribute (subr_die, type);
add_type_attribute (subr_die, return_type, TYPE_UNQUALIFIED, false, add_type_attribute (subr_die, return_type, TYPE_UNQUALIFIED, false,
context_die); context_die);
add_alignment_attribute (subr_die, type);
gen_formal_types_die (type, subr_die); gen_formal_types_die (type, subr_die);
if (get_AT (subr_die, DW_AT_name)) if (get_AT (subr_die, DW_AT_name))
@ -24231,7 +24286,10 @@ gen_typedef_die (tree decl, dw_die_ref context_die)
add_abstract_origin_attribute (type_die, origin); add_abstract_origin_attribute (type_die, origin);
else else
{ {
tree type; tree type = TREE_TYPE (decl);
if (type == error_mark_node)
return;
add_name_and_src_coords_attributes (type_die, decl); add_name_and_src_coords_attributes (type_die, decl);
if (DECL_ORIGINAL_TYPE (decl)) if (DECL_ORIGINAL_TYPE (decl))
@ -24246,11 +24304,6 @@ gen_typedef_die (tree decl, dw_die_ref context_die)
} }
else else
{ {
type = TREE_TYPE (decl);
if (type == error_mark_node)
return;
if (is_naming_typedef_decl (TYPE_NAME (type))) if (is_naming_typedef_decl (TYPE_NAME (type)))
{ {
/* Here, we are in the case of decl being a typedef naming /* Here, we are in the case of decl being a typedef naming
@ -24289,6 +24342,10 @@ gen_typedef_die (tree decl, dw_die_ref context_die)
created. */ created. */
equate_type_number_to_die (type, type_die); equate_type_number_to_die (type, type_die);
type = TREE_TYPE (decl);
add_alignment_attribute (type_die, type);
add_accessibility_attribute (type_die, decl); add_accessibility_attribute (type_die, decl);
} }
@ -27969,6 +28026,7 @@ base_type_cmp (const void *x, const void *y)
dw_die_ref dy = *(const dw_die_ref *) y; dw_die_ref dy = *(const dw_die_ref *) y;
unsigned int byte_size1, byte_size2; unsigned int byte_size1, byte_size2;
unsigned int encoding1, encoding2; unsigned int encoding1, encoding2;
unsigned int align1, align2;
if (dx->die_mark > dy->die_mark) if (dx->die_mark > dy->die_mark)
return -1; return -1;
if (dx->die_mark < dy->die_mark) if (dx->die_mark < dy->die_mark)
@ -27985,6 +28043,12 @@ base_type_cmp (const void *x, const void *y)
return 1; return 1;
if (encoding1 > encoding2) if (encoding1 > encoding2)
return -1; return -1;
align1 = get_AT_unsigned (dx, DW_AT_alignment);
align2 = get_AT_unsigned (dy, DW_AT_alignment);
if (align1 < align2)
return 1;
if (align1 > align2)
return -1;
return 0; return 0;
} }

View file

@ -1,3 +1,20 @@
2017-01-30 Alexandre Oliva <aoliva@redhat.com>
PR debug/63238
* gcc.dg/debug/dwarf2/align-1.c: New.
* gcc.dg/debug/dwarf2/align-2.c: New.
* gcc.dg/debug/dwarf2/align-3.c: New.
* gcc.dg/debug/dwarf2/align-4.c: New.
* gcc.dg/debug/dwarf2/align-5.c: New.
* gcc.dg/debug/dwarf2/align-6.c: New.
* gcc.dg/debug/dwarf2/align-as-1.c: New.
* g++.dg/debug/dwarf2/align-1.C: New.
* g++.dg/debug/dwarf2/align-2.C: New.
* g++.dg/debug/dwarf2/align-3.C: New.
* g++.dg/debug/dwarf2/align-4.C: New.
* g++.dg/debug/dwarf2/align-5.C: New.
* g++.dg/debug/dwarf2/align-6.C: New.
2017-01-30 Aaron Sawdey <acsawdey@linux.vnet.ibm.com> 2017-01-30 Aaron Sawdey <acsawdey@linux.vnet.ibm.com>
PR target/79170 PR target/79170

View file

@ -0,0 +1,5 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
int __attribute__((__aligned__(64))) i;

View file

@ -0,0 +1,6 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
typedef int __attribute__((__aligned__(64))) i_t;
i_t i;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
typedef int int_t;
typedef int_t __attribute__((__aligned__(64))) i_t;
i_t i;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 2 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int __attribute__((__aligned__(64))) i;
} t;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int i;
} __attribute__((__aligned__(64))) t;

View file

@ -0,0 +1,9 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int i;
};
struct tt __attribute__((__aligned__(64))) t;

View file

@ -0,0 +1,5 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
int __attribute__((__aligned__(64))) i;

View file

@ -0,0 +1,6 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
typedef int __attribute__((__aligned__(64))) i_t;
i_t i;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
typedef int int_t;
typedef int_t __attribute__((__aligned__(64))) i_t;
i_t i;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 2 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int __attribute__((__aligned__(64))) i;
} t;

View file

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int i;
} __attribute__((__aligned__(64))) t;

View file

@ -0,0 +1,9 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
struct tt {
int i;
};
struct tt __attribute__((__aligned__(64))) t;

View file

@ -0,0 +1,5 @@
// { dg-do compile }
// { dg-options "-O -g -dA" }
// { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { powerpc-ibm-aix* } } } }
int _Alignas(64) i;