Like r0-46282-gf41115930523b3, but this time for normal variables
rather than the constant pool.
With the simple C++ code on ia32:
```
std::initializer_list<long double> a = {0.3l};
```
GCC currently produces:
```
        .section        .rodata.cst16,"aM",@progbits,16
        .align 16
        .type   _ZGR1a_, @object
        .size   _ZGR1a_, 12
_ZGR1a_:
        .long   -1717986918
        .long   -1717986919
        .long   16381
        .text
```
Notice how the mereable section is not being aligned at the end to
16 bytes.
This was exactly the same issue as reported in 
https://sourceware.org/legacy-ml/binutils/2002-11/msg00615.html
except this time for DECLs which mergeable rather than the constant pool
(which was fixed by r0-46282-gf41115930523b3).

So we need to ensure the variables in mergable sections are filed
correctly for the rest of the section.

Note this showed up more with gcn after r16-2595-gf1c80147641783 since
more decls are done in mergable sections without the same size as the
alignment.

Bootstrapped and tested on x86_64-linux-gnu.

        PR middle-end/121394

gcc/ChangeLog:

        * varasm.cc (assemble_variable_contents): Ensure mergeable sections
        get padded for each decl.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
 gcc/varasm.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/varasm.cc b/gcc/varasm.cc
index 000ad9e26f6..7b04b82c1a5 100644
--- a/gcc/varasm.cc
+++ b/gcc/varasm.cc
@@ -2475,6 +2475,12 @@ assemble_variable_contents (tree decl, const char *name,
       else
        /* Leave space for it.  */
        assemble_zeros (tree_to_uhwi (DECL_SIZE_UNIT (decl)));
+      /* Make sure all decls in SECTION_MERGE sections have proper size.  */
+      if (in_section
+         && (in_section->common.flags & SECTION_MERGE)
+         && tree_fits_uhwi_p (DECL_SIZE (decl))
+         && DECL_ALIGN (decl) > tree_to_uhwi (DECL_SIZE (decl)))
+       assemble_align (DECL_ALIGN (decl));
       targetm.asm_out.decl_end ();
     }
 }
-- 
2.43.0

Reply via email to