diff options
author | George Rimar <grimar@accesssoftek.com> | 2019-05-02 19:28:04 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2019-05-02 19:28:04 +0000 |
commit | 366212726a1a7caef08ebb1ebf84d511841d4f99 (patch) | |
tree | 53e8c025fe7db95d6b2536b4b0793a27a3629bcf | |
parent | d179ce99d68f0ffc45a3eb80aa955f3237eb6371 (diff) | |
download | bcm5719-llvm-366212726a1a7caef08ebb1ebf84d511841d4f99.tar.gz bcm5719-llvm-366212726a1a7caef08ebb1ebf84d511841d4f99.zip |
[yaml2obj] - Make interface of `NameToIdxMap` class be human friendly and fix users.
This patch inverses the values returned by `addName` and
`lookup` methods of the class mentioned so that they
now return true on success and false on failure.
Also, it does minor code cleanup.
Differential revision: https://reviews.llvm.org/D61190
llvm-svn: 359818
-rw-r--r-- | llvm/tools/yaml2obj/yaml2elf.cpp | 155 |
1 files changed, 78 insertions, 77 deletions
diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp index 697a1773084..574e5dbf0f1 100644 --- a/llvm/tools/yaml2obj/yaml2elf.cpp +++ b/llvm/tools/yaml2obj/yaml2elf.cpp @@ -57,33 +57,34 @@ public: } // end anonymous namespace // Used to keep track of section and symbol names, so that in the YAML file -// sections and symbols can be referenced by name instead of by index. -namespace { -class NameToIdxMap { - StringMap<int> Map; -public: - /// \returns true if name is already present in the map. - bool addName(StringRef Name, unsigned i) { - return !Map.insert(std::make_pair(Name, (int)i)).second; - } - /// \returns true if name is not present in the map - bool lookup(StringRef Name, unsigned &Idx) const { - StringMap<int>::const_iterator I = Map.find(Name); - if (I == Map.end()) - return true; - Idx = I->getValue(); - return false; - } - /// asserts if name is not present in the map - unsigned get(StringRef Name) const { - unsigned Idx = 0; - auto missing = lookup(Name, Idx); - (void)missing; - assert(!missing && "Expected section not found in index"); - return Idx; - } - unsigned size() const { return Map.size(); } -}; +// sections and symbols can be referenced by name instead of by index.
+namespace {
+class NameToIdxMap {
+ StringMap<unsigned> Map;
+
+public:
+ /// \Returns false if name is already present in the map.
+ bool addName(StringRef Name, unsigned Ndx) {
+ return Map.insert({Name, Ndx}).second;
+ }
+ /// \Returns false if name is not present in the map.
+ bool lookup(StringRef Name, unsigned &Idx) const {
+ auto I = Map.find(Name);
+ if (I == Map.end())
+ return false;
+ Idx = I->getValue();
+ return true;
+ }
+ /// Asserts if name is not present in the map.
+ unsigned get(StringRef Name) const {
+ unsigned Idx;
+ if (lookup(Name, Idx))
+ return Idx;
+ assert(false && "Expected section not found in index");
+ return 0;
+ }
+ unsigned size() const { return Map.size(); }
+};
} // end anonymous namespace template <class T> @@ -235,13 +236,13 @@ void ELFState<ELFT>::initProgramHeaders(std::vector<Elf_Phdr> &PHeaders) { PHeaders.push_back(Phdr); } } - -static bool convertSectionIndex(NameToIdxMap &SN2I, StringRef SecName, - StringRef IndexSrc, unsigned &IndexDest) { - if (SN2I.lookup(IndexSrc, IndexDest) && !to_integer(IndexSrc, IndexDest)) { - WithColor::error() << "Unknown section referenced: '" << IndexSrc - << "' at YAML section '" << SecName << "'.\n"; - return false; +
+static bool convertSectionIndex(NameToIdxMap &SN2I, StringRef SecName,
+ StringRef IndexSrc, unsigned &IndexDest) {
+ if (!SN2I.lookup(IndexSrc, IndexDest) && !to_integer(IndexSrc, IndexDest)) {
+ WithColor::error() << "Unknown section referenced: '" << IndexSrc
+ << "' at YAML section '" << SecName << "'.\n";
+ return false;
} return true; } @@ -392,13 +393,13 @@ void ELFState<ELFT>::setProgramHeaderLayout(std::vector<Elf_Phdr> &PHeaders, for (auto &YamlPhdr : Doc.ProgramHeaders) { Elf_Phdr &PHeader = PHeaders[PhdrIdx++]; - std::vector<Elf_Shdr *> Sections; - for (const ELFYAML::SectionName &SecName : YamlPhdr.Sections) { - unsigned Index; - if (SN2I.lookup(SecName.Section, Index)) { - WithColor::error() << "Unknown section referenced: '" << SecName.Section - << "' by program header.\n"; - exit(1); + std::vector<Elf_Shdr *> Sections;
+ for (const ELFYAML::SectionName &SecName : YamlPhdr.Sections) {
+ unsigned Index;
+ if (!SN2I.lookup(SecName.Section, Index)) {
+ WithColor::error() << "Unknown section referenced: '" << SecName.Section
+ << "' by program header.\n";
+ exit(1);
} Sections.push_back(&SHeaders[Index]); } @@ -469,13 +470,13 @@ void ELFState<ELFT>::addSymbols(ArrayRef<ELFYAML::Symbol> Symbols, zero(Symbol); 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.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) { @@ -543,13 +544,13 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader, auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); for (const auto &Rel : Section.Relocations) { - unsigned SymIdx = 0; - // If a relocation references a symbol, try to look one up in the symbol - // table. If it is not there, treat the value as a symbol index. - if (Rel.Symbol && SymN2I.lookup(*Rel.Symbol, SymIdx) && - !to_integer(*Rel.Symbol, SymIdx)) { - WithColor::error() << "Unknown symbol referenced: '" << *Rel.Symbol - << "' at YAML section '" << Section.Name << "'.\n"; + unsigned SymIdx = 0;
+ // If a relocation references a symbol, try to look one up in the symbol
+ // table. If it is not there, treat the value as a symbol index.
+ if (Rel.Symbol && !SymN2I.lookup(*Rel.Symbol, SymIdx) &&
+ !to_integer(*Rel.Symbol, SymIdx)) {
+ WithColor::error() << "Unknown symbol referenced: '" << *Rel.Symbol
+ << "' at YAML section '" << Section.Name << "'.\n";
return false; } @@ -579,13 +580,13 @@ bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader, "Section type is not SHT_GROUP"); SHeader.sh_entsize = 4; - SHeader.sh_size = SHeader.sh_entsize * Section.Members.size(); - - unsigned SymIdx; - if (SymN2I.lookup(Section.Signature, SymIdx) && - !to_integer(Section.Signature, SymIdx)) { - WithColor::error() << "Unknown symbol referenced: '" << Section.Signature - << "' at YAML section '" << Section.Name << "'.\n"; + SHeader.sh_size = SHeader.sh_entsize * Section.Members.size();
+
+ unsigned SymIdx;
+ if (!SymN2I.lookup(Section.Signature, SymIdx) &&
+ !to_integer(Section.Signature, SymIdx)) {
+ WithColor::error() << "Unknown symbol referenced: '" << Section.Signature
+ << "' at YAML section '" << Section.Name << "'.\n";
return false; } SHeader.sh_info = SymIdx; @@ -780,20 +781,20 @@ bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader, template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() { for (unsigned i = 0, e = Doc.Sections.size(); i != e; ++i) { - StringRef Name = Doc.Sections[i]->Name; - DotShStrtab.add(Name); - // "+ 1" to take into account the SHT_NULL entry. - if (SN2I.addName(Name, i + 1)) { - WithColor::error() << "Repeated section name: '" << Name - << "' at YAML section number " << i << ".\n"; - return false; + StringRef Name = Doc.Sections[i]->Name;
+ DotShStrtab.add(Name);
+ // "+ 1" to take into account the SHT_NULL entry.
+ if (!SN2I.addName(Name, i + 1)) {
+ WithColor::error() << "Repeated section name: '" << Name
+ << "' at YAML section number " << i << ".\n";
+ return false;
} } auto SecNo = 1 + Doc.Sections.size(); // Add special sections after input sections, if necessary. for (StringRef Name : implicitSectionNames()) - if (!SN2I.addName(Name, SecNo)) { + if (SN2I.addName(Name, SecNo)) { // Account for this section, since it wasn't in the Doc ++SecNo; DotShStrtab.add(Name); @@ -816,13 +817,13 @@ bool ELFState<ELFT>::buildSymbolIndex(ArrayRef<ELFYAML::Symbol> Symbols) { "' after global in Symbols list.\n"; return false; } - if (Sym.Binding.value != ELF::STB_LOCAL) - GlobalSymbolSeen = true; - - if (!Name.empty() && SymN2I.addName(Name, I)) { - WithColor::error() << "Repeated symbol name: '" << Name << "'.\n"; - return false; - } + if (Sym.Binding.value != ELF::STB_LOCAL)
+ GlobalSymbolSeen = true;
+
+ if (!Name.empty() && !SymN2I.addName(Name, I)) {
+ WithColor::error() << "Repeated symbol name: '" << Name << "'.\n";
+ return false;
+ }
} return true; } |