From 505ab7db23ae7a182810199190f7b41c7c9e1fdd Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 14 Sep 2017 07:26:14 +0000 Subject: [PATCH] Revert r313234 "[llvm-readobj] - Refactor printGroupSections methods." It broke BB. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313235 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-readobj/ELFDumper.cpp | 128 +++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 73 deletions(-) diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index e07999d878c..5698420bbcc 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -2441,69 +2441,34 @@ template void GNUStyle::printFileHeaders(const ELFO *Obj) { printFields(OS, "Section header string table index:", Str); } -namespace { -struct GroupMember { - StringRef Name; - uint64_t Index; -}; - -struct GroupSection { - StringRef Name; - StringRef Signature; - uint64_t ShName; - uint64_t Index; - uint32_t Type; - std::vector Members; -}; - -template -std::vector getGroups(const ELFFile *Obj) { - using Elf_Shdr = typename ELFFile::Elf_Shdr; - using Elf_Sym = typename ELFFile::Elf_Sym; - using Elf_Word = typename ELFFile::Elf_Word; - - std::vector Ret; - uint64_t I = 0; +template void GNUStyle::printGroupSections(const ELFO *Obj) { + uint32_t SectionIndex = 0; + bool HasGroups = false; for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { - ++I; - if (Sec.sh_type != ELF::SHT_GROUP) - continue; - - const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); - StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); - const Elf_Sym *Sym = - unwrapOrError(Obj->template getEntry(Symtab, Sec.sh_info)); - auto Data = - unwrapOrError(Obj->template getSectionContentsAsArray(&Sec)); - - StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); - StringRef Signature = StrTable.data() + Sym->st_name; - Ret.push_back({Name, Signature, Sec.sh_name, I - 1, Data[0], {}}); - - std::vector &GM = Ret.back().Members; - for (uint32_t Ndx : Data.slice(1)) { - auto Sec = unwrapOrError(Obj->getSection(Ndx)); - const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); - GM.push_back({Name, Ndx}); + if (Sec.sh_type == ELF::SHT_GROUP) { + HasGroups = true; + const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); + StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); + const Elf_Sym *Signature = + unwrapOrError(Obj->template getEntry(Symtab, Sec.sh_info)); + ArrayRef Data = unwrapOrError( + Obj->template getSectionContentsAsArray(&Sec)); + StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); + OS << "\n" << getGroupType(Data[0]) << " group section [" + << format_decimal(SectionIndex, 5) << "] `" << Name << "' [" + << StrTable.data() + Signature->st_name << "] contains " + << (Data.size() - 1) << " sections:\n" + << " [Index] Name\n"; + for (auto &Ndx : Data.slice(1)) { + auto Sec = unwrapOrError(Obj->getSection(Ndx)); + const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); + OS << " [" << format_decimal(Ndx, 5) << "] " << Name + << "\n"; + } } + ++SectionIndex; } - return Ret; -} -} // namespace - -template void GNUStyle::printGroupSections(const ELFO *Obj) { - std::vector V = getGroups(Obj); - for (const GroupSection &G : V) { - OS << "\n" - << G.Type << " group section [" << format_decimal(G.Index, 5) << "] `" - << G.Name << "' [" << G.Signature << "] contains " << G.Members.size() - << " sections:\n" - << " [Index] Name\n"; - for (const GroupMember &GM : G.Members) - OS << " [" << GM.Index << "] " << GM.Name << "\n"; - } - - if (V.empty()) + if (!HasGroups) OS << "There are no section groups in this file.\n"; } @@ -3524,22 +3489,39 @@ template void LLVMStyle::printFileHeaders(const ELFO *Obj) { template void LLVMStyle::printGroupSections(const ELFO *Obj) { DictScope Lists(W, "Groups"); - std::vector V = getGroups(Obj); - for (const GroupSection &G : V) { - DictScope D(W, "Group"); - W.printNumber("Name", G.Name, G.ShName); - W.printNumber("Index", G.Index); - W.printHex("Type", getGroupType(G.Type), G.Type); - W.startLine() << "Signature: " << G.Signature << "\n"; - - ListScope L(W, "Section(s) in group"); - for (const GroupMember &GM : G.Members) - W.startLine() << GM.Name << " (" << GM.Index << ")\n"; + uint32_t SectionIndex = 0; + bool HasGroups = false; + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { + if (Sec.sh_type == ELF::SHT_GROUP) { + HasGroups = true; + const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); + StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); + const Elf_Sym *Sym = + unwrapOrError(Obj->template getEntry(Symtab, Sec.sh_info)); + auto Data = unwrapOrError( + Obj->template getSectionContentsAsArray(&Sec)); + DictScope D(W, "Group"); + StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); + W.printNumber("Name", Name, Sec.sh_name); + W.printNumber("Index", SectionIndex); + W.printHex("Type", getGroupType(Data[0]), Data[0]); + W.startLine() << "Signature: " << StrTable.data() + Sym->st_name << "\n"; + { + ListScope L(W, "Section(s) in group"); + size_t Member = 1; + while (Member < Data.size()) { + auto Sec = unwrapOrError(Obj->getSection(Data[Member])); + const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); + W.startLine() << Name << " (" << Data[Member++] << ")\n"; + } + } + } + ++SectionIndex; } - - if (V.empty()) + if (!HasGroups) W.startLine() << "There are no group sections in the file.\n"; } + template void LLVMStyle::printRelocations(const ELFO *Obj) { ListScope D(W, "Relocations"); -- 2.11.0