Re: [PR63238] output alignment debug information

2017-03-16 Thread Cary Coutant
>> This is OK so far, but the DW_AT_alignment attribute also needs to be
>> added to the checksum computation in die_checksum and
>> die_checksum_ordered.
>
> Thanks.  I see what to do in die_checksum_ordered, but die_checksum?  It
> seems to handle attributes by value class, and AFAICT the classes that
> DW_AT_alignment could use are already covered.  What am I missing?
>
> Here's a patch I'm about to start testing.  Does it look ok?

Sorry, I read this while I wasn't in a position to reply, then totally
forgot about it. Yes, you're right about die_checksum, sorry. And, for
the record, it looks OK.

-cary


Re: [PR63238] output alignment debug information

2017-02-01 Thread Jakub Jelinek
On Fri, Jan 27, 2017 at 04:24:58AM -0200, Alexandre Oliva wrote:
> Output DWARFv5+ DW_AT_alignment for non-default alignment of
> variables, fields and types.

The new tests all fail on targets that default to -gstrict-dwarf
because they have buggy or prehistoric linkers/debug info consumers
like Darwin.

Fixed thusly, tested on x86_64-linux vanilla and with common.opt
hack to turn -gstrict-dwarf and -fno-merge-debug-strings by default,
committed to trunk as obvious:

2017-02-01  Jakub Jelinek  

PR testsuite/79324
* gcc.dg/debug/dwarf2/align-1.c: Add -gno-strict-dwarf to dg-options.
* gcc.dg/debug/dwarf2/align-2.c: Likewise.
* gcc.dg/debug/dwarf2/align-3.c: Likewise.
* gcc.dg/debug/dwarf2/align-4.c: Likewise.
* gcc.dg/debug/dwarf2/align-5.c: Likewise.
* gcc.dg/debug/dwarf2/align-6.c: Likewise.
* gcc.dg/debug/dwarf2/align-as-1.c: Likewise.
* g++.dg/debug/dwarf2/align-1.C: Likewise.
* g++.dg/debug/dwarf2/align-2.C: Likewise.
* g++.dg/debug/dwarf2/align-3.C: Likewise.
* g++.dg/debug/dwarf2/align-4.C: Likewise.
* g++.dg/debug/dwarf2/align-5.C: Likewise.
* g++.dg/debug/dwarf2/align-6.C: Likewise.

--- gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c 2017-02-01 16:39:24.852112430 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 int __attribute__((__aligned__(64))) i;
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c 2017-02-01 16:39:34.260991165 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 typedef int __attribute__((__aligned__(64))) i_t;
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c 2017-02-01 16:39:37.841945013 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 typedef int int_t;
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c 2017-02-01 16:39:41.889892842 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 2 { xfail { 
powerpc-ibm-aix* } } } }
 
 struct tt {
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c 2017-02-01 16:39:46.117838350 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 struct tt {
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c 2017-02-01 16:39:50.884776913 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 struct tt {
--- gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c.jj   2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c  2017-02-01 
16:39:55.554716725 +0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 int _Alignas(64) i;
--- gcc/testsuite/g++.dg/debug/dwarf2/align-1.C.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/g++.dg/debug/dwarf2/align-1.C 2017-02-01 16:40:58.421906472 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 
 int __attribute__((__aligned__(64))) i;
--- gcc/testsuite/g++.dg/debug/dwarf2/align-2.C.jj  2017-01-31 
09:26:00.0 +0100
+++ gcc/testsuite/g++.dg/debug/dwarf2/align-2.C 2017-02-01 16:41:01.340868851 
+0100
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-O -g -dA" }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
 // { dg-final { scan-assembler-times " DW_AT_alignment" 1 { xfail { 
powerpc-ibm-aix* } } } }
 

Re: [PR63238] output alignment debug information

2017-01-30 Thread Alexandre Oliva
On Jan 29, 2017, Cary Coutant  wrote:

>> for gcc/ChangeLog
>> 
>> PR debug/63238

> This is OK so far, but the DW_AT_alignment attribute also needs to be
> added to the checksum computation in die_checksum and
> die_checksum_ordered.

Thanks.  I see what to do in die_checksum_ordered, but die_checksum?  It
seems to handle attributes by value class, and AFAICT the classes that
DW_AT_alignment could use are already covered.  What am I missing?

Here's a patch I'm about to start testing.  Does it look ok?


[PR63238] include alignment debug information in DIE checksum

Add DW_AT_alignment to the DIE checksum.

for gcc/ChangeLog

PR debug/63238
* dwarf2out.c (struct checksum_attributes): Add at_alignment.
(collect_checksum_attributes): Set it.
(die_checksum_ordered): Use it.
---
 gcc/dwarf2out.c |5 +
 1 file changed, 5 insertions(+)

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index f8fe4c1..15b7a66 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -6600,6 +6600,7 @@ struct checksum_attributes
   dw_attr_node *at_friend;
   dw_attr_node *at_accessibility;
   dw_attr_node *at_address_class;
+  dw_attr_node *at_alignment;
   dw_attr_node *at_allocated;
   dw_attr_node *at_artificial;
   dw_attr_node *at_associated;
@@ -6673,6 +6674,9 @@ collect_checksum_attributes (struct checksum_attributes 
*attrs, dw_die_ref die)
 case DW_AT_address_class:
   attrs->at_address_class = a;
   break;
+   case DW_AT_alignment:
+ attrs->at_alignment = a;
+ break;
 case DW_AT_allocated:
   attrs->at_allocated = a;
   break;
@@ -6879,6 +6883,7 @@ die_checksum_ordered (dw_die_ref die, struct md5_ctx 
*ctx, int *mark)
   CHECKSUM_ATTR (attrs.at_vtable_elem_location);
   CHECKSUM_ATTR (attrs.at_type);
   CHECKSUM_ATTR (attrs.at_friend);
+  CHECKSUM_ATTR (attrs.at_alignment);
 
   /* Checksum the child DIEs.  */
   c = die->die_child;


-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


Re: [PR63238] output alignment debug information

2017-01-29 Thread Cary Coutant
> 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.

This is OK so far, but the DW_AT_alignment attribute also needs to be
added to the checksum computation in die_checksum and
die_checksum_ordered.

-cary


Re: [PR63238] output alignment debug information

2017-01-26 Thread Alexandre Oliva
On Oct 19, 2016, Alexandre Oliva <aol...@redhat.com> wrote:

> On Sep 23, 2016, Alexandre Oliva <aol...@redhat.com> wrote:
>> On Aug 27, 2016, Alexandre Oliva <aol...@redhat.com> wrote:
>>> Output DWARFv5+ DW_AT_alignment for non-default alignment of
>>> variables, fields and types.

>>> Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

>> Ping?

> Ping?  (conflicts resolved, patch refreshed and retested)

Ping?  (refreshed, not sure there were conflicts to resolve)


[PR63238] output alignment debug information

From: Alexandre Oliva <aol...@redhat.com>

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.
---
 gcc/dwarf2out.c|   76 ++--
 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C|5 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C|6 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c|5 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c|6 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c |5 ++
 14 files changed, 157 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1b2c04c..f8fe4c1 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)
 

Re: [PR63238] output alignment debug information

2016-10-19 Thread Alexandre Oliva
On Sep 23, 2016, Alexandre Oliva  wrote:

> On Aug 27, 2016, Alexandre Oliva  wrote:
>> Output DWARFv5+ DW_AT_alignment for non-default alignment of
>> variables, fields and types.

>> Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

> Ping?

Ping?  (conflicts resolved, patch refreshed and retested)


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.
---
 gcc/dwarf2out.c|   76 ++--
 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C|5 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C|6 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c|5 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c|6 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c |5 ++
 14 files changed, 157 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index ba36310..afe7bfd 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3342,6 +3342,7 @@ static void add_bound_info (dw_die_ref, enum 
dwarf_attribute, tree,
const 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);
@@ -7461,6 +7462,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;
 }
@@ -10986,6 +10988,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)
@@ -11149,6 +11153,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)
 

Re: [PR63238] output alignment debug information

2016-09-23 Thread Alexandre Oliva
On Aug 27, 2016, Alexandre Oliva  wrote:

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

> Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

Ping?

https://gcc.gnu.org/ml/gcc-patches/2016-08/msg01911.html

-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


[PR63238] output alignment debug information

2016-08-26 Thread Alexandre Oliva
Output DWARFv5+ DW_AT_alignment for non-default alignment of
variables, fields and types.

Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

for include/ChangeLog

PR debug/63238
* dwarf2.def (DW_AT_alignment): New.

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.
---
 gcc/dwarf2out.c|   76 ++--
 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C|5 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C|6 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C|7 ++
 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c|5 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c|6 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c|7 ++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c|9 +++
 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c |5 ++
 include/dwarf2.def |1 
 15 files changed, 158 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-1.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-2.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-3.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-4.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-5.C
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/align-6.C
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-1.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-2.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-3.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-4.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-5.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-6.c
 create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/align-as-1.c

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index f40f759..f3928e0 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3342,6 +3342,7 @@ static void add_bound_info (dw_die_ref, enum 
dwarf_attribute, tree,
const 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);
@@ -7415,6 +7416,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;
 }
@@ -10941,6 +10943,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)
@@ -11104,6 +11108,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)
@@ -11421,6 +11427,7 @@ modified_type_die (tree type, int cv_quals, bool