https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97827

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ams at gcc dot gnu.org,
                   |                            |burnus at gcc dot gnu.org

--- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Changed in LLVM in https://reviews.llvm.org/D73999
cf. https://lists.llvm.org/pipermail/llvm-dev/2020-February/139390.html
and related Binutils discussion:
https://sourceware.org/legacy-ml/binutils/2020-02/msg00093.html

LLVM commit 75af9da755721123e62b45cd0bc0c5e688a9722a:
"   GNU as started to emit warnings for changed sh_type or sh_flags in 2000.
    GNU as>=2.35 will emit errors for most sh_type/sh_flags change, and error
for entsize change."

Cf. also http://web.mit.edu/rhel-doc/3/rhel-as-en-3/section.html



A grep shows:
        .section        .rodata.cst8
        .section        .rodata.cst8
        .section        .rodata.cst8,"aM",@progbits,8

Codewise, we have:
  mergeable_constant_section (mode=E_DFmode, align=64, flags=0)
which calls:
  884           flags |= (align / 8) | SECTION_MERGE;
  885           return get_section (name, flags, NULL);
with flags == 32776.

In the latter:
      flags |= SECTION_NAMED;
  → 2129928
and as "slot = section_htab->find_slot_with_hash" → *slot == NULL:
      sect = ggc_alloc<section> ();
      sect->named.common.flags = flags;
      sect->named.name = ggc_strdup (name);
      sect->named.decl = decl;

However, once the same function is called, we have:
  sect->common.flags == 3178504
while still/again:
  flags == 2129928

Next comes the call to:
  switch_to_section
which ends with
  new_section->common.flags |= SECTION_DECLARED;
which is
  3178504


If we look at default_elf_asm_named_section, we find:

  /* If we have already declared this section, we can use an
     abbreviated form to switch back to it -- unless this section is
     part of a COMDAT groups, in which case GAS requires the full
     declaration every time.  */
  if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
      && (flags & SECTION_DECLARED))
    { 
      fprintf (asm_out_file, "\t.section\t%s\n", name);
      return;
    }

Reply via email to