forked from OSchip/llvm-project
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:
parent
802c31cc28
commit
b7a52bb28a
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue