From: Alexandre Oliva Date: Tue, 31 Jan 2017 01:03:15 +0000 (+0000) Subject: [PR63238] output alignment debug information X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=40fb9c89e1599b2f13d1403820a9e0fb2c1129c1;p=gcc.git [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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 64ef77decda..eed607a8d1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2017-01-30 Alexandre Oliva + + 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 PR target/79170 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 0368f8d0d14..cfb00b8db6b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67800b1104f..8210eae17ba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2017-01-30 Alexandre Oliva + + 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 PR target/79170 diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-1.C new file mode 100644 index 00000000000..58b773179cb --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-1.C @@ -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; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-2.C new file mode 100644 index 00000000000..31eed4a5141 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-2.C @@ -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; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-3.C new file mode 100644 index 00000000000..328ea0d1ae3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-3.C @@ -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; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-4.C new file mode 100644 index 00000000000..31e9e81b62e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-4.C @@ -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; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-5.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-5.C new file mode 100644 index 00000000000..21166463902 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-5.C @@ -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; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/align-6.C b/gcc/testsuite/g++.dg/debug/dwarf2/align-6.C new file mode 100644 index 00000000000..e8fc43f6e90 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/align-6.C @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c new file mode 100644 index 00000000000..58b773179cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c new file mode 100644 index 00000000000..31eed4a5141 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c new file mode 100644 index 00000000000..328ea0d1ae3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c new file mode 100644 index 00000000000..31e9e81b62e --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c new file mode 100644 index 00000000000..21166463902 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c new file mode 100644 index 00000000000..e8fc43f6e90 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c b/gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c new file mode 100644 index 00000000000..6923257e111 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c @@ -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;