On Thu, Aug 7, 2025 at 7:58 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > Now there are mergeable sections which have an entity size, we can place > decls (constants) that are smaller in size in these sections. > An example is an `long double` which has a size of 12 bytes on i686 and is > placed in the 16 bytes shareable section. > > For an example with the following C++ code: > ``` > std::initializer_list<long double> a = {0.3l}; > ``` > > We place the constant array in the .rodata.cst16 section but we don't add a > padding to 16 bytes. > ``` > .section .rodata.cst16,"aM",@progbits,16 > .align 16 > .type _ZGR1a_, @object > .size _ZGR1a_, 12 > _ZGR1a_: > .long -1717986918 > .long -1717986919 > .long 16381 > .text > ``` > GAS has a workaround added to do the padding but other assemblers don't. > The gas workaround was added with > https://sourceware.org/legacy-ml/binutils/2002-11/msg00615.html . > Now for the constant pool, GCC does emit a `.align` to padd out the size > correctly. > This was done in r0-46282-gf41115930523b3. > The same padding should be done when emitting a variable contents when in a > mergeable section. > > This patch implements the padding and we now get an addition `.zero 4` which > pads out the section.
Note I separated this out from the other mergeability patch so it can be backported to both GCC 15 and 14. Thanks, Andrew > > Bootstrapped and tested on x86_64-linux-gnu. > > PR middle-end/121394 > gcc/ChangeLog: > > * varasm.cc (assemble_variable_contents): Pad out > mergeable sections if needed. > (output_constant_pool_1): Change the padding to be explicit > zeroing for mergeable sections. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/varasm.cc | 27 +++++++++++++++++++++++---- > 1 file changed, 23 insertions(+), 4 deletions(-) > > diff --git a/gcc/varasm.cc b/gcc/varasm.cc > index 000ad9e26f6..ee32cf1d7f6 100644 > --- a/gcc/varasm.cc > +++ b/gcc/varasm.cc > @@ -2475,6 +2475,19 @@ assemble_variable_contents (tree decl, const char > *name, > else > /* Leave space for it. */ > assemble_zeros (tree_to_uhwi (DECL_SIZE_UNIT (decl))); > + /* 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_UNIT (decl)) > + && ((in_section->common.flags & SECTION_ENTSIZE) > + > tree_to_uhwi (DECL_SIZE_UNIT (decl)))) > + { > + unsigned HOST_WIDE_INT entsize, declsize; > + entsize = (in_section->common.flags & SECTION_ENTSIZE); > + declsize = tree_to_uhwi (DECL_SIZE_UNIT (decl)); > + assemble_zeros (entsize - declsize); > + } > targetm.asm_out.decl_end (); > } > } > @@ -4435,10 +4448,16 @@ output_constant_pool_1 (class constant_descriptor_rtx > *desc, > > /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS > sections have proper size. */ > - if (align > GET_MODE_BITSIZE (desc->mode) > - && in_section > - && (in_section->common.flags & SECTION_MERGE)) > - assemble_align (align); > + if (in_section > + && (in_section->common.flags & SECTION_MERGE) > + && ((in_section->common.flags & SECTION_ENTSIZE) > + > GET_MODE_SIZE (desc->mode))) > + { > + unsigned HOST_WIDE_INT entsize, constsize; > + entsize = (in_section->common.flags & SECTION_ENTSIZE); > + constsize = GET_MODE_SIZE (desc->mode); > + assemble_zeros (entsize - constsize); > + } > > #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY > done: > -- > 2.43.0 >