[llvm] r313235 - Revert r313234 "[llvm-readobj] - Refactor printGroupSections methods."

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 14 00:26:14 PDT 2017


Author: grimar
Date: Thu Sep 14 00:26:14 2017
New Revision: 313235

URL: http://llvm.org/viewvc/llvm-project?rev=313235&view=rev
Log:
Revert r313234 "[llvm-readobj] - Refactor printGroupSections methods."

It broke BB.

Modified:
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp

Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=313235&r1=313234&r2=313235&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Thu Sep 14 00:26:14 2017
@@ -2441,69 +2441,34 @@ template <class ELFT> void GNUStyle<ELFT
   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<GroupMember> Members;
-};
-
-template <class ELFT>
-std::vector<GroupSection> getGroups(const ELFFile<ELFT> *Obj) {
-  using Elf_Shdr = typename ELFFile<ELFT>::Elf_Shdr;
-  using Elf_Sym = typename ELFFile<ELFT>::Elf_Sym;
-  using Elf_Word = typename ELFFile<ELFT>::Elf_Word;
-
-  std::vector<GroupSection> Ret;
-  uint64_t I = 0;
+template <class ELFT> void GNUStyle<ELFT>::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<Elf_Sym>(Symtab, Sec.sh_info));
-    auto Data =
-        unwrapOrError(Obj->template getSectionContentsAsArray<Elf_Word>(&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<GroupMember> &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<Elf_Sym>(Symtab, Sec.sh_info));
+      ArrayRef<Elf_Word> Data = unwrapOrError(
+          Obj->template getSectionContentsAsArray<Elf_Word>(&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 <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) {
-  std::vector<GroupSection> V = getGroups<ELFT>(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 <class ELFT> void LLVMStyle<ELF
 template <class ELFT>
 void LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) {
   DictScope Lists(W, "Groups");
-  std::vector<GroupSection> V = getGroups<ELFT>(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<Elf_Sym>(Symtab, Sec.sh_info));
+      auto Data = unwrapOrError(
+          Obj->template getSectionContentsAsArray<Elf_Word>(&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 <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {
   ListScope D(W, "Relocations");
 




More information about the llvm-commits mailing list