From 890c305c41abd507e18f62abd7eec88d9594d5a5 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 20 Jun 2019 14:44:48 +0000 Subject: [PATCH] [yaml2obj] - Convert `ELFState::addSymbols` method to `toELFSymbols` helper. NFCI. ELFState::addSymbols method looks a bit strange. User code have to create the destination symbols vector outside, add a null symbol and then pass it to addSymbols when it seems the more natural logic is to isolate all work with symbols inside some function, build the list right there and return it. Differential revision: https://reviews.llvm.org/D63493 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363930 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/yaml2obj/yaml2elf.cpp | 91 ++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 47 deletions(-) diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 6bba732f9fe..43d51de4431 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -151,8 +151,6 @@ class ELFState { ELFYAML::Section *YAMLSec); void setProgramHeaderLayout(std::vector &PHeaders, std::vector &SHeaders); - void addSymbols(ArrayRef Symbols, std::vector &Syms, - const StringTableBuilder &Strtab); bool writeSectionContent(Elf_Shdr &SHeader, const ELFYAML::RawContentSection &Section, ContiguousBlobAccumulator &CBA); @@ -374,6 +372,48 @@ static uint64_t writeRawSectionData(raw_ostream &OS, return *RawSec.Size; } +template +static std::vector +toELFSymbols(NameToIdxMap &SN2I, ArrayRef Symbols, + const StringTableBuilder &Strtab) { + using Elf_Sym = typename ELFT::Sym; + + std::vector Ret; + Ret.resize(Symbols.size() + 1); + + size_t I = 0; + for (const auto &Sym : Symbols) { + Elf_Sym &Symbol = Ret[++I]; + + // If NameIndex, which contains the name offset, is explicitly specified, we + // use it. This is useful for preparing broken objects. Otherwise, we add + // the specified Name to the string table builder to get its offset. + if (Sym.NameIndex) + Symbol.st_name = *Sym.NameIndex; + else if (!Sym.Name.empty()) + Symbol.st_name = Strtab.getOffset(Sym.Name); + + Symbol.setBindingAndType(Sym.Binding, Sym.Type); + if (!Sym.Section.empty()) { + unsigned Index; + if (!SN2I.lookup(Sym.Section, Index)) { + WithColor::error() << "Unknown section referenced: '" << Sym.Section + << "' by YAML symbol " << Sym.Name << ".\n"; + exit(1); + } + Symbol.st_shndx = Index; + } else if (Sym.Index) { + Symbol.st_shndx = *Sym.Index; + } + // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier. + Symbol.st_value = Sym.Value; + Symbol.st_other = Sym.Other; + Symbol.st_size = Sym.Size; + } + + return Ret; +} + template void ELFState::initSymtabSectionHeader(Elf_Shdr &SHeader, SymtabType STType, @@ -451,15 +491,8 @@ void ELFState::initSymtabSectionHeader(Elf_Shdr &SHeader, return; } - std::vector Syms; - { - // Ensure STN_UNDEF is present - Elf_Sym Sym; - zero(Sym); - Syms.push_back(Sym); - } - - addSymbols(Symbols, Syms, IsStatic ? DotStrtab : DotDynstr); + std::vector Syms = + toELFSymbols(SN2I, Symbols, IsStatic ? DotStrtab : DotDynstr); writeArrayData(OS, makeArrayRef(Syms)); SHeader.sh_size = arrayDataSize(makeArrayRef(Syms)); } @@ -577,42 +610,6 @@ void ELFState::setProgramHeaderLayout(std::vector &PHeaders, } } -template -void ELFState::addSymbols(ArrayRef Symbols, - std::vector &Syms, - const StringTableBuilder &Strtab) { - for (const auto &Sym : Symbols) { - Elf_Sym Symbol; - zero(Symbol); - - // If NameIndex, which contains the name offset, is explicitly specified, we - // use it. This is useful for preparing broken objects. Otherwise, we add - // the specified Name to the string table builder to get its offset. - if (Sym.NameIndex) - Symbol.st_name = *Sym.NameIndex; - else if (!Sym.Name.empty()) - Symbol.st_name = Strtab.getOffset(Sym.Name); - - Symbol.setBindingAndType(Sym.Binding, Sym.Type); - if (!Sym.Section.empty()) { - unsigned Index; - if (!SN2I.lookup(Sym.Section, Index)) { - WithColor::error() << "Unknown section referenced: '" << Sym.Section - << "' by YAML symbol " << Sym.Name << ".\n"; - exit(1); - } - Symbol.st_shndx = Index; - } else if (Sym.Index) { - Symbol.st_shndx = *Sym.Index; - } - // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier. - Symbol.st_value = Sym.Value; - Symbol.st_other = Sym.Other; - Symbol.st_size = Sym.Size; - Syms.push_back(Symbol); - } -} - template bool ELFState::writeSectionContent( Elf_Shdr &SHeader, const ELFYAML::RawContentSection &Section, -- 2.50.1