From 766f25306af343fb2784350cb4d8cd9ca180f0d3 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sun, 15 Sep 2013 19:53:20 +0000 Subject: [PATCH] ELF: Add support for the exclude section bit for gas compat. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190769 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/ELF.h | 3 +++ lib/MC/MCParser/ELFAsmParser.cpp | 13 ++++++++----- lib/MC/MCSectionELF.cpp | 4 ++++ lib/Object/ELFYAML.cpp | 1 + test/MC/ELF/section.s | 25 +++++++++++++++++++++---- tools/llvm-readobj/ELFDumper.cpp | 1 + 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index 54da31c0de7..8f92832795b 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -1196,6 +1196,9 @@ enum { // This section holds Thread-Local Storage. SHF_TLS = 0x400U, + // This section is excluded from the final executable or shared library. + SHF_EXCLUDE = 0x80000000U, + // Start of target-specific flags. /// XCORE_SHF_CP_SECTION - All sections with the "c" flag are grouped diff --git a/lib/MC/MCParser/ELFAsmParser.cpp b/lib/MC/MCParser/ELFAsmParser.cpp index 67b0e5df24a..7b8a2d0bc5b 100644 --- a/lib/MC/MCParser/ELFAsmParser.cpp +++ b/lib/MC/MCParser/ELFAsmParser.cpp @@ -279,14 +279,17 @@ static SectionKind computeSectionKind(unsigned Flags) { return SectionKind::getDataRel(); } -static int parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) { - int flags = 0; +static unsigned parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) { + unsigned flags = 0; for (unsigned i = 0; i < flagsStr.size(); i++) { switch (flagsStr[i]) { case 'a': flags |= ELF::SHF_ALLOC; break; + case 'e': + flags |= ELF::SHF_EXCLUDE; + break; case 'x': flags |= ELF::SHF_EXECINSTR; break; @@ -315,7 +318,7 @@ static int parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) { *UseLastGroup = true; break; default: - return -1; + return -1U; } } @@ -381,8 +384,8 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush) { StringRef FlagsStr = getTok().getStringContents(); Lex(); - int extraFlags = parseSectionFlags(FlagsStr, &UseLastGroup); - if (extraFlags < 0) + unsigned extraFlags = parseSectionFlags(FlagsStr, &UseLastGroup); + if (extraFlags == -1U) return TokError("unknown flag"); Flags |= extraFlags; diff --git a/lib/MC/MCSectionELF.cpp b/lib/MC/MCSectionELF.cpp index bf1a984a9bf..ff9c4d351a1 100644 --- a/lib/MC/MCSectionELF.cpp +++ b/lib/MC/MCSectionELF.cpp @@ -75,6 +75,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, OS << ",#execinstr"; if (Flags & ELF::SHF_WRITE) OS << ",#write"; + if (Flags & ELF::SHF_EXCLUDE) + OS << ",#exclude"; if (Flags & ELF::SHF_TLS) OS << ",#tls"; OS << '\n'; @@ -84,6 +86,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, OS << ",\""; if (Flags & ELF::SHF_ALLOC) OS << 'a'; + if (Flags & ELF::SHF_EXCLUDE) + OS << 'e'; if (Flags & ELF::SHF_EXECINSTR) OS << 'x'; if (Flags & ELF::SHF_GROUP) diff --git a/lib/Object/ELFYAML.cpp b/lib/Object/ELFYAML.cpp index e530d3dda3f..2f35cf9b103 100644 --- a/lib/Object/ELFYAML.cpp +++ b/lib/Object/ELFYAML.cpp @@ -266,6 +266,7 @@ void ScalarBitSetTraits::bitset(IO &IO, #define BCase(X) IO.bitSetCase(Value, #X, ELF::X); BCase(SHF_WRITE) BCase(SHF_ALLOC) + BCase(SHF_EXCLUDE) BCase(SHF_EXECINSTR) BCase(SHF_MERGE) BCase(SHF_STRINGS) diff --git a/test/MC/ELF/section.s b/test/MC/ELF/section.s index a6794034c94..b3246e0b817 100644 --- a/test/MC/ELF/section.s +++ b/test/MC/ELF/section.s @@ -8,9 +8,9 @@ .section -.note.GNU,"",@progbits // CHECK: Name: .note.GNU-stack (56) -// CHECK: Name: .note.GNU-stack2 (143) -// CHECK: Name: .note.GNU- (160) -// CHECK: Name: -.note.GNU (132) +// CHECK: Name: .note.GNU-stack2 (153) +// CHECK: Name: .note.GNU- (170) +// CHECK: Name: -.note.GNU (142) // Test that the defaults are used @@ -120,11 +120,28 @@ bar: // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: } +.section .excluded,"e",@progbits + +// CHECK: Section { +// CHECK: Name: .excluded (92) +// CHECK-NEXT: Type: SHT_PROGBITS (0x1) +// CHECK-NEXT: Flags [ (0x80000000) +// CHECK-NEXT: SHF_EXCLUDE (0x80000000) +// CHECK-NEXT: ] +// CHECK-NEXT: Address: 0x0 +// CHECK-NEXT: Offset: 0x50 +// CHECK-NEXT: Size: 0 +// CHECK-NEXT: Link: 0 +// CHECK-NEXT: Info: 0 +// CHECK-NEXT: AddressAlignment: 1 +// CHECK-NEXT: EntrySize: 0 +// CHECK-NEXT: } + // Test that we handle the strings like gas .section bar-"foo" .section "foo" // CHECK: Section { -// CHECK: Name: bar-"foo" (171) +// CHECK: Name: bar-"foo" (181) // CHECK: Section { // CHECK: Name: foo (52) diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 502fe6750a9..71f03bc3d06 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -377,6 +377,7 @@ static const char *getElfSectionType(unsigned Arch, unsigned Type) { static const EnumEntry ElfSectionFlags[] = { LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ), LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ), + LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE ), LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ), LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ), LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ), -- 2.34.1