forked from pool/gcc13
32 lines
1.4 KiB
Diff
32 lines
1.4 KiB
Diff
|
varasm.c: Always output flags in merged .section for LLVM assembler compatibility [PR97827]
|
||
|
|
||
|
For compatibility with LLVM 11's 'mc' assembler, the flags have to be
|
||
|
repeated every time. See also LLVM Bug 48201 for this issue and
|
||
|
https://reviews.llvm.org/D73999 for the patch causing the issue.
|
||
|
|
||
|
gcc/
|
||
|
PR target/97827
|
||
|
* varasm.c (default_elf_asm_named_section): Always output all
|
||
|
flags if SECTION_MERGE, even if already declared before.
|
||
|
|
||
|
diff --git a/gcc/varasm.cc b/gcc/varasm.cc
|
||
|
index 21be03aeba2..9cb46885aa5 100644
|
||
|
--- a/gcc/varasm.cc
|
||
|
+++ b/gcc/varasm.cc
|
||
|
@@ -6792,10 +6792,13 @@ default_elf_asm_named_section (const char *name, unsigned int flags,
|
||
|
/* 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 or with SHF_GNU_RETAIN or with SHF_LINK_ORDER,
|
||
|
- in which case GAS requires the full declaration every time. */
|
||
|
+ in which case GAS requires the full declaration every time.
|
||
|
+ LLVM's MC linker requires that the
|
||
|
+ flags are identical, thus avoid the abbreviated form with MERGE. */
|
||
|
if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
|
||
|
&& !(flags & (SECTION_RETAIN | SECTION_LINK_ORDER))
|
||
|
- && (flags & SECTION_DECLARED))
|
||
|
+ && (flags & SECTION_DECLARED)
|
||
|
+ && !(flags & SECTION_MERGE))
|
||
|
{
|
||
|
fprintf (asm_out_file, "\t.section\t%s\n", name);
|
||
|
return;
|