On Wed, Jan 31, 2024 at 8:30 AM Jakub Jelinek <ja...@redhat.com> wrote:
>
> On Tue, Jan 30, 2024 at 06:21:36PM -0800, H.J. Lu wrote:
> > Changes in v2:
> >
> > 1. Check decl non-null before dereferencing it.
> > 2. Update PR rtl-optimization/113617 from
>
> Thanks for updating the testcase.
>
> > --- a/gcc/varasm.cc
> > +++ b/gcc/varasm.cc
> > @@ -7459,16 +7459,46 @@ default_elf_select_rtx_section (machine_mode mode, 
> > rtx x,
> >  {
> >    int reloc = compute_reloc_for_rtx (x);
> >
> > +  tree decl = nullptr;
> > +
> > +  /* If it is a private COMDAT function symbol reference, call
> > +     function_rodata_section for the read-only or relocated read-only
> > +     data section associated with function DECL so that the COMDAT
> > +     section will be used for the private COMDAT function symbol.  */
> > +  if (HAVE_COMDAT_GROUP)
> > +    {
> > +      if (GET_CODE (x) == CONST
> > +       && GET_CODE (XEXP (x, 0)) == PLUS
> > +       && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
> > +     x = XEXP (XEXP (x, 0), 0);
> > +
> > +      if (GET_CODE (x) == SYMBOL_REF)
> > +     {
> > +       decl = SYMBOL_REF_DECL (x);
> > +       if (decl
> > +           && (TREE_CODE (decl) != FUNCTION_DECL
> > +               || !DECL_COMDAT_GROUP (decl)
> > +               || TREE_PUBLIC (decl)))
> > +         decl = nullptr;
> > +     }
> > +    }
> > +
> >    /* ??? Handle small data here somehow.  */
> >
> >    if (reloc & targetm.asm_out.reloc_rw_mask ())
> >      {
> > +      if (decl)
> > +     return targetm.asm_out.function_rodata_section (decl, true);
>
> As I wrote before, I still very much dislike this.
> We want to refer to the
> _ZN1R1BIFvvENS_1IIFPFvPvxxxEPN2N12N22N31CIN12_GLOBAL__N_11DIxEELb0EEExxxEEEE1FERNS_1HERKSI_NS_1GE
> private symbol defined in
> .text._ZN1R1BIFvvENS_1IIFPFvPvxxxEPN2N12N22N31CIN12_GLOBAL__N_11DIxEELb0EEExxxEEEE1FERNS_1HERKSI_NS_1GE
> section in _ZN1AIxE3fooExx comdat group from some readonly data
> memory, and read that from
> _ZN2N12N22N31XILi1EE3booINS1_1CIN12_GLOBAL__N_11DIxEELb0EEEEEvxxxRT_ function
> defined in 
> .text._ZN2N12N22N31XILi1EE3booINS1_1CIN12_GLOBAL__N_11DIxEELb0EEEEEvxxxRT_
> section in the same comdat group.
>
> The patch puts that into
> .data.rel.ro.local._ZN1R1BIFvvENS_1IIFPFvPvxxxEPN2N12N22N31CIN12_GLOBAL__N_11DIxEELb0EEExxxEEEE1FERNS_1HERKSI_NS_1GE
> section in the same comdat group, but that just looks weird and for
> targets which use section anchors also inefficient.
>
> If we have a shared constant pool (otherwise the constants would be emitted
> into a per-function constant pool of that
> _ZN2N12N22N31XILi1EE3booINS1_1CIN12_GLOBAL__N_11DIxEELb0EEEEEvxxxRT_
> function and would live in something based on that function name.
> But in case it is shared, it is normally just .data.rel.ro.local or
> .data.rel.ro section, shared by whatever refers to it.
> These comdat private symbols are kind of exception, they can still be
> shared, but have to be shared only within the containing comdat group
> because it isn't valid to refer to them from other comdat groups.
> So, it is ok if say two different functions in the same comdat group
> actually share those MEM constants.
> Thus, I think for the DECL_COMDAT_GROUP (decl) && HAVE_COMDAT_GROUP
> case it would be best to make it clear in the section name that it
> is a .data.rel.ro.local or .data.rel.ro section shared by everything
> in the comdat group.  So, shouldn't it be just
>         .section        
> .data.rel.ro.local,"awG",@progbits,_ZN1AIxE3fooExx,comdat
> and emit that directly in this function rather than using
> targetm.asm_out.function_rodata_section?

Which function (target hook) can I use to generate

 .section        .data.rel.ro.local,"awG",@progbits,_ZN1AIxE3fooExx,comdat

> Looking at targetm.asm_out.function_rodata_section, it is
> default_function_rodata_section on most targets, then on darwin,
> cygwin, AIX and mcore default_no_function_rodata_section which just
> returns the shared readonly_data_section (I hope those targets don't
> DECL_COMDAT_GROUP (decl) && HAVE_COMDAT_GROUP, otherwise it will simply not
> work) and then loongarch does some ugly magic (which is related to
> jumptables and so nothing we need to care about here hopefully).
>
> Another question is if we need to do anything about the
> DECL_COMDAT_GROUP (decl) && DECL_SECTION_NAME (decl)
> && startswith (DECL_SECTION_NAME (decl), ".gnu.linkonce.t.")
> case (older linkers) (i.e. when using years old GNU linkers).
>

Should we support such targets? It is not easy for me to test it.

Thanks.

-- 
H.J.

Reply via email to