From 39add80ac5626817e840dfa60cd184277004da86 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Mon, 25 Jun 2018 23:53:54 +0000 Subject: [PATCH] Add a warning if someone attempts to add extra section flags to sections with well defined semantics like .rodata. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335558 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCParser/ELFAsmParser.cpp | 49 ++++++++++++++++++++++++++------------- test/MC/ELF/extra-section-flags.s | 10 ++++++++ 2 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 test/MC/ELF/extra-section-flags.s diff --git a/lib/MC/MCParser/ELFAsmParser.cpp b/lib/MC/MCParser/ELFAsmParser.cpp index dc5b0e0d031..93513a2c415 100644 --- a/lib/MC/MCParser/ELFAsmParser.cpp +++ b/lib/MC/MCParser/ELFAsmParser.cpp @@ -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; diff --git a/test/MC/ELF/extra-section-flags.s b/test/MC/ELF/extra-section-flags.s new file mode 100644 index 00000000000..c96516ee482 --- /dev/null +++ b/test/MC/ELF/extra-section-flags.s @@ -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 + -- 2.11.0