Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -412,6 +412,9 @@ Name.startswith(".llvm.linkonce.sb.")) return SectionKind::getBSS(); + if (Name == ".rodata" || Name.startswith(".rodata.")) + return SectionKind::getReadOnly(); + if (Name == ".tdata" || Name.startswith(".tdata.") || Name.startswith(".gnu.linkonce.td.") || @@ -424,6 +427,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) {