From cfc2bccfd87e19e99dc9ad177d00f2728fb2e7e1 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Wed, 25 Sep 2019 12:09:30 +0000 Subject: [PATCH] [yaml2elf] - Support describing .stack_sizes sections using unique suffixes. Currently we can't use unique suffixes in section names to describe stack sizes sections. E.g. '.stack_sizes [1]' will be treated as a regular section. This happens because we recognize stack sizes section by name and do not yet drop the suffix before the check. The patch fixes it. Differential revision: https://reviews.llvm.org/D68018 llvm-svn: 372853 --- llvm/include/llvm/ObjectYAML/ELFYAML.h | 2 ++ llvm/lib/ObjectYAML/ELFEmitter.cpp | 13 ++++---- llvm/lib/ObjectYAML/ELFYAML.cpp | 1 + llvm/test/tools/yaml2obj/elf-stack-sizes.yaml | 31 +++++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h index 37bbe72a5613..df87340ad4d6 100644 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -25,6 +25,8 @@ namespace llvm { namespace ELFYAML { +StringRef dropUniqueSuffix(StringRef S); + // These types are invariant across 32/64-bit ELF, so for simplicity just // directly give them their exact sizes. We don't need to worry about // endianness because these are just the types in the YAMLIO structures, diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index 0139c2d1144c..6edc3c8e7633 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -340,7 +340,7 @@ bool ELFState::initImplicitHeader(ContiguousBlobAccumulator &CBA, return true; } -static StringRef dropUniqueSuffix(StringRef S) { +StringRef llvm::ELFYAML::dropUniqueSuffix(StringRef S) { size_t SuffixPos = S.rfind(" ["); if (SuffixPos == StringRef::npos) return S; @@ -371,7 +371,8 @@ void ELFState::initSectionHeaders(std::vector &SHeaders, assert(Sec && "It can't be null unless it is an implicit section. But all " "implicit sections should already have been handled above."); - SHeader.sh_name = DotShStrtab.getOffset(dropUniqueSuffix(Sec->Name)); + SHeader.sh_name = + DotShStrtab.getOffset(ELFYAML::dropUniqueSuffix(Sec->Name)); SHeader.sh_type = Sec->Type; if (Sec->Flags) SHeader.sh_flags = *Sec->Flags; @@ -473,7 +474,7 @@ ELFState::toELFSymbols(ArrayRef Symbols, if (Sym.NameIndex) Symbol.st_name = *Sym.NameIndex; else if (!Sym.Name.empty()) - Symbol.st_name = Strtab.getOffset(dropUniqueSuffix(Sym.Name)); + Symbol.st_name = Strtab.getOffset(ELFYAML::dropUniqueSuffix(Sym.Name)); Symbol.setBindingAndType(Sym.Binding, Sym.Type); if (!Sym.Section.empty()) @@ -962,7 +963,7 @@ template void ELFState::buildSectionIndex() { if (Name.empty()) continue; - DotShStrtab.add(dropUniqueSuffix(Name)); + DotShStrtab.add(ELFYAML::dropUniqueSuffix(Name)); if (!SN2I.addName(Name, I)) reportError("repeated section name: '" + Name + "' at YAML section number " + Twine(I)); @@ -987,12 +988,12 @@ template void ELFState::buildSymbolIndexes() { template void ELFState::finalizeStrings() { // Add the regular symbol names to .strtab section. for (const ELFYAML::Symbol &Sym : Doc.Symbols) - DotStrtab.add(dropUniqueSuffix(Sym.Name)); + DotStrtab.add(ELFYAML::dropUniqueSuffix(Sym.Name)); DotStrtab.finalize(); // Add the dynamic symbol names to .dynstr section. for (const ELFYAML::Symbol &Sym : Doc.DynamicSymbols) - DotDynstr.add(dropUniqueSuffix(Sym.Name)); + DotDynstr.add(ELFYAML::dropUniqueSuffix(Sym.Name)); // SHT_GNU_verdef and SHT_GNU_verneed sections might also // add strings to .dynstr section. diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index d369f14be4bb..94b1df104391 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -1152,6 +1152,7 @@ void MappingTraits>::mapping( if (!IO.outputting()) { StringRef Name; IO.mapOptional("Name", Name, StringRef()); + Name = ELFYAML::dropUniqueSuffix(Name); if (ELFYAML::StackSizesSection::nameMatches(Name)) Section = std::make_unique(); diff --git a/llvm/test/tools/yaml2obj/elf-stack-sizes.yaml b/llvm/test/tools/yaml2obj/elf-stack-sizes.yaml index c94c2c3b862f..e05a3def6a43 100644 --- a/llvm/test/tools/yaml2obj/elf-stack-sizes.yaml +++ b/llvm/test/tools/yaml2obj/elf-stack-sizes.yaml @@ -311,3 +311,34 @@ Sections: Type: SHT_PROGBITS Size: 0x1 Content: "1122" + +## Check we can describe multiple .stack_sizes sections using unique suffixes. + +# RUN: yaml2obj --docnum=14 %s -o %t11 +# RUN: llvm-readobj --sections --section-data %t11 | FileCheck %s --check-prefix=UNIQUE + +# UNIQUE: Name: .stack_sizes +# UNIQUE: SectionData ( +# UNIQUE-NEXT: 0000: 10000000 00000000 20 | + +# UNIQUE: Name: .stack_sizes +# UNIQUE: SectionData ( +# UNIQUE-NEXT: 0000: 30000000 00000000 40 | + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: '.stack_sizes [1]' + Type: SHT_PROGBITS + Entries: + - Address: 0x10 + Size: 0x20 + - Name: '.stack_sizes [2]' + Type: SHT_PROGBITS + Entries: + - Address: 0x30 + Size: 0x40