[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:
parent
8db29d88f3
commit
40fb9c89e1
@ -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>
|
||||
|
||||
PR target/79170
|
||||
|
@ -3510,6 +3510,7 @@ static void add_bound_info (dw_die_ref, enum dwarf_attribute, tree,
|
||||
struct loc_descr_context *);
|
||||
static void add_subscript_info (dw_die_ref, tree, bool);
|
||||
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,
|
||||
struct vlr_context *);
|
||||
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);
|
||||
break;
|
||||
case DW_AT_byte_size:
|
||||
case DW_AT_alignment:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -12106,6 +12108,8 @@ base_type_die (tree type, bool reverse)
|
||||
add_AT_unsigned (base_type_result, DW_AT_endianity,
|
||||
BYTES_BIG_ENDIAN ? DW_END_little : DW_END_big);
|
||||
|
||||
add_alignment_attribute (base_type_result, type);
|
||||
|
||||
if (fpt_used)
|
||||
{
|
||||
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_alignment_attribute (subrange_die, type);
|
||||
|
||||
if (low)
|
||||
add_bound_info (subrange_die, DW_AT_lower_bound, low, NULL);
|
||||
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,
|
||||
simple_type_size_in_bits (type) / BITS_PER_UNIT);
|
||||
add_alignment_attribute (mod_type_die, type);
|
||||
item_type = TREE_TYPE (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 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
|
||||
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
|
||||
@ -20765,6 +20803,8 @@ gen_array_type_die (tree type, dw_die_ref context_die)
|
||||
|
||||
if (get_AT (array_die, DW_AT_name))
|
||||
add_pubtype (type, array_die);
|
||||
|
||||
add_alignment_attribute (array_die, 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))
|
||||
add_pubtype (type, array_die);
|
||||
|
||||
add_alignment_attribute (array_die, type);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@ -21013,6 +21055,7 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)
|
||||
|
||||
TREE_ASM_WRITTEN (type) = 1;
|
||||
add_byte_size_attribute (type_die, type);
|
||||
add_alignment_attribute (type_die, type);
|
||||
if (dwarf_version >= 3 || !dwarf_strict)
|
||||
{
|
||||
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
|
||||
add_AT_flag (type_die, DW_AT_declaration, 1);
|
||||
|
||||
add_alignment_attribute (type_die, type);
|
||||
|
||||
add_pubtype (type, 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))
|
||||
add_AT_flag (subr_die, DW_AT_noreturn, 1);
|
||||
|
||||
add_alignment_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),
|
||||
decl_quals (decl_or_origin), false,
|
||||
context_die);
|
||||
add_alignment_attribute (var_die, decl);
|
||||
add_AT_flag (var_die, DW_AT_external, 1);
|
||||
if (loc)
|
||||
{
|
||||
@ -22822,6 +22870,8 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
|
||||
if (DECL_ARTIFICIAL (decl))
|
||||
add_AT_flag (var_die, DW_AT_artificial, 1);
|
||||
|
||||
add_alignment_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_alignment_attribute (decl_die, decl);
|
||||
|
||||
/* 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
|
||||
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)));
|
||||
add_type_attribute (ptr_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
|
||||
context_die);
|
||||
add_alignment_attribute (ptr_die, type);
|
||||
|
||||
if (TREE_CODE (TREE_TYPE (type)) != FUNCTION_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. */
|
||||
TREE_ASM_WRITTEN (type) = 1;
|
||||
add_byte_size_attribute (type_die, type);
|
||||
add_alignment_attribute (type_die, type);
|
||||
if (TYPE_STUB_DECL (type) != NULL_TREE)
|
||||
{
|
||||
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_type_attribute (subr_die, return_type, TYPE_UNQUALIFIED, false,
|
||||
context_die);
|
||||
add_alignment_attribute (subr_die, type);
|
||||
gen_formal_types_die (type, subr_die);
|
||||
|
||||
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);
|
||||
else
|
||||
{
|
||||
tree type;
|
||||
tree type = TREE_TYPE (decl);
|
||||
|
||||
if (type == error_mark_node)
|
||||
return;
|
||||
|
||||
add_name_and_src_coords_attributes (type_die, decl);
|
||||
if (DECL_ORIGINAL_TYPE (decl))
|
||||
@ -24246,11 +24304,6 @@ gen_typedef_die (tree decl, dw_die_ref context_die)
|
||||
}
|
||||
else
|
||||
{
|
||||
type = TREE_TYPE (decl);
|
||||
|
||||
if (type == error_mark_node)
|
||||
return;
|
||||
|
||||
if (is_naming_typedef_decl (TYPE_NAME (type)))
|
||||
{
|
||||
/* 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. */
|
||||
equate_type_number_to_die (type, type_die);
|
||||
|
||||
type = TREE_TYPE (decl);
|
||||
|
||||
add_alignment_attribute (type_die, type);
|
||||
|
||||
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;
|
||||
unsigned int byte_size1, byte_size2;
|
||||
unsigned int encoding1, encoding2;
|
||||
unsigned int align1, align2;
|
||||
if (dx->die_mark > dy->die_mark)
|
||||
return -1;
|
||||
if (dx->die_mark < dy->die_mark)
|
||||
@ -27985,6 +28043,12 @@ base_type_cmp (const void *x, const void *y)
|
||||
return 1;
|
||||
if (encoding1 > encoding2)
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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>
|
||||
|
||||
PR target/79170
|
||||
|
5
gcc/testsuite/g++.dg/debug/dwarf2/align-1.C
Normal file
5
gcc/testsuite/g++.dg/debug/dwarf2/align-1.C
Normal 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;
|
6
gcc/testsuite/g++.dg/debug/dwarf2/align-2.C
Normal file
6
gcc/testsuite/g++.dg/debug/dwarf2/align-2.C
Normal 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;
|
7
gcc/testsuite/g++.dg/debug/dwarf2/align-3.C
Normal file
7
gcc/testsuite/g++.dg/debug/dwarf2/align-3.C
Normal 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;
|
7
gcc/testsuite/g++.dg/debug/dwarf2/align-4.C
Normal file
7
gcc/testsuite/g++.dg/debug/dwarf2/align-4.C
Normal 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;
|
7
gcc/testsuite/g++.dg/debug/dwarf2/align-5.C
Normal file
7
gcc/testsuite/g++.dg/debug/dwarf2/align-5.C
Normal 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;
|
9
gcc/testsuite/g++.dg/debug/dwarf2/align-6.C
Normal file
9
gcc/testsuite/g++.dg/debug/dwarf2/align-6.C
Normal 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;
|
5
gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c
Normal file
5
gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c
Normal 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;
|
6
gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c
Normal file
6
gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c
Normal 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;
|
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c
Normal file
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c
Normal 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;
|
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c
Normal file
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c
Normal 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;
|
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c
Normal file
7
gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c
Normal 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;
|
9
gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c
Normal file
9
gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c
Normal 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;
|
5
gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c
Normal file
5
gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c
Normal 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;
|
Loading…
Reference in New Issue
Block a user