On Thu, Aug 7, 2025 at 12:00 AM Richard Biener <richard.guent...@gmail.com> wrote: > > On Thu, Aug 7, 2025 at 8:37 AM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > > > 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))) > > Isn't that a wrong test? Consider 16 byte alignment and a 24 byte object. > > Is the concern only aligned but packed decls btw? I'd have expected the > size to be always a multiple of the alignment otherwise.
There is a better way of implementing this. /* For mergeable section, make sure the section is zero filled up to the entity size of the section */ if (in_section && (in_section->common.flags & SECTION_MERGE) && tree_fits_uhwi_p (DECL_SIZE (decl)) && (in_section->common.flags & SECTION_ENTSIZE) > tree_to_uhwi (DECL_SIZE (decl))) assemble_zeros ((in_section->common.flags & SECTION_ENTSIZE) - tree_to_uhwi (DECL_SIZE (decl))); Note (in_section->common.flags & SECTION_ENTSIZE) contains the entity size of the section. and will be zero for the mergeable string section. I will be combining this with another patch which I will be doing which removes the alignment requirement for the section, just the size needs to be small to be placed into the mergeable constant section. Thanks, Andrew Pinski > > Richard. > > > + assemble_align (DECL_ALIGN (decl)); > > targetm.asm_out.decl_end (); > > } > > } > > -- > > 2.43.0 > >