Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -424,6 +424,9 @@ Name.startswith(".llvm.linkonce.tb.")) return SectionKind::getThreadBSS(); + if (Name.startswith(".debug_")) + return SectionKind::getMetadata(); + return K; } Index: lib/MC/MCContext.cpp =================================================================== --- lib/MC/MCContext.cpp +++ lib/MC/MCContext.cpp @@ -394,6 +394,15 @@ auto IterBool = ELFUniquingMap.insert( std::make_pair(ELFSectionKey{Section.str(), Group, UniqueID}, nullptr)); auto &Entry = *IterBool.first; + MCSectionELF *&Sec = Entry.second; + if (!IterBool.second) { + // We want to let users add additional flags even for sections with + // defaults. For example, .debug_str has "MS" flags by default and user + // might want to add "E". + Sec->setFlags(Sec->getFlags() | Flags); + return Sec; + } + if (!IterBool.second) return Entry.second; @@ -407,10 +416,9 @@ else Kind = SectionKind::getReadOnly(); - MCSectionELF *Result = createELFSectionImpl( - CachedName, Type, Flags, Kind, EntrySize, GroupSym, UniqueID, Associated); - Entry.second = Result; - return Result; + Sec = createELFSectionImpl(CachedName, Type, Flags, Kind, EntrySize, GroupSym, + UniqueID, Associated); + return Sec; } MCSectionELF *MCContext::createELFGroupSection(const MCSymbolELF *Group) { Index: test/MC/ELF/section-flags.s =================================================================== --- test/MC/ELF/section-flags.s +++ test/MC/ELF/section-flags.s @@ -0,0 +1,12 @@ +# RUN: llvm-mc -triple x86_64-pc-linux-gnu %s -filetype=obj -o %t.o +# RUN: llvm-readobj -s --elf-output-style=GNU %t.o | FileCheck %s + +## Check we are able to set the custom flag ('E') for debug sections. +# CHECK: .debug_info {{.*}} E +# CHECK: .debug_str {{.*}} EMS + +.section .debug_info,"e" +nop + +.section .debug_str,"eMS",@progbits,1 +nop