Add a warning if someone attempts to add extra section flags to sections

with well defined semantics like .rodata.

llvm-svn: 335558
This commit is contained in:
Eric Christopher 2018-06-25 23:53:54 +00:00
parent 802c31cc28
commit b7a52bb28a
2 changed files with 43 additions and 16 deletions

View File

@ -481,6 +481,31 @@ static bool hasPrefix(StringRef SectionName, StringRef Prefix) {
return SectionName.startswith(Prefix) || SectionName == Prefix.drop_back();
}
// Return a set of section flags based on the section name that can then
// be augmented later, otherwise return 0 if we don't have any reasonable
// defaults.
static unsigned defaultSectionFlags(StringRef SectionName) {
if (hasPrefix(SectionName, ".rodata.") || SectionName == ".rodata1")
return ELF::SHF_ALLOC;
if (SectionName == ".fini" || SectionName == ".init" ||
hasPrefix(SectionName, ".text."))
return ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
if (hasPrefix(SectionName, ".data.") || SectionName == ".data1" ||
hasPrefix(SectionName, ".bss.") ||
hasPrefix(SectionName, ".init_array.") ||
hasPrefix(SectionName, ".fini_array.") ||
hasPrefix(SectionName, ".preinit_array."))
return ELF::SHF_ALLOC | ELF::SHF_WRITE;
if (hasPrefix(SectionName, ".tdata.") || hasPrefix(SectionName, ".tbss."))
return ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_TLS;
return 0;
}
bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
StringRef SectionName;
@ -490,27 +515,13 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
StringRef TypeName;
int64_t Size = 0;
StringRef GroupName;
unsigned Flags = 0;
const MCExpr *Subsection = nullptr;
bool UseLastGroup = false;
MCSymbolELF *Associated = nullptr;
int64_t UniqueID = ~0;
// Set the defaults first.
if (hasPrefix(SectionName, ".rodata.") || SectionName == ".rodata1")
Flags |= ELF::SHF_ALLOC;
else if (SectionName == ".fini" || SectionName == ".init" ||
hasPrefix(SectionName, ".text."))
Flags |= ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
else if (hasPrefix(SectionName, ".data.") || SectionName == ".data1" ||
hasPrefix(SectionName, ".bss.") ||
hasPrefix(SectionName, ".init_array.") ||
hasPrefix(SectionName, ".fini_array.") ||
hasPrefix(SectionName, ".preinit_array."))
Flags |= ELF::SHF_ALLOC | ELF::SHF_WRITE;
else if (hasPrefix(SectionName, ".tdata.") ||
hasPrefix(SectionName, ".tbss."))
Flags |= ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_TLS;
// Set the default section flags first in case no others are given.
unsigned Flags = defaultSectionFlags(SectionName);
if (getLexer().is(AsmToken::Comma)) {
Lex();
@ -538,6 +549,12 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
if (extraFlags == -1U)
return TokError("unknown flag");
// If we found additional section flags on a known section then give a
// warning.
if (Flags && Flags != extraFlags)
Warning(loc, "setting incorrect section attributes for " + SectionName);
Flags |= extraFlags;
bool Mergeable = Flags & ELF::SHF_MERGE;

View File

@ -0,0 +1,10 @@
# RUN: llvm-mc -triple x86_64-unknown-unknown -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s
.section .rodata, "ax"
# CHECK: warning: setting incorrect section attributes for .rodata
nop
.section .rodata, "a"
# CHECK-NOT: warning:
nop