<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 25, 2016 at 12:47 PM, Hemant Kulkarni via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: khemant<br>
Date: Thu Feb 25 14:47:07 2016<br>
New Revision: 261927<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261927&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=261927&view=rev</a><br>
Log:<br>
Reverts change r261907 and r261918<br></blockquote><div><br></div><div>Please include the reason for reverting in revert commit messages - can help other people when they're doing history to understand what's happened/changed/if the original commit was responsible for issues they might be investigating.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Removed:<br>
    llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test<br>
    llvm/trunk/test/tools/llvm-readobj/gnu-sections.test<br>
Modified:<br>
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp<br>
    llvm/trunk/tools/llvm-readobj/StreamWriter.cpp<br>
    llvm/trunk/tools/llvm-readobj/StreamWriter.h<br>
<br>
Removed: llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test?rev=261926&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test?rev=261926&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test (original)<br>
+++ llvm/trunk/test/tools/llvm-readobj/gnu-relocations.test (removed)<br>
@@ -1,28 +0,0 @@<br>
-RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \<br>
-RUN:   | FileCheck %s -check-prefix ELF32<br>
-RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \<br>
-RUN:   | FileCheck %s -check-prefix ELF64<br>
-<br>
-ELF32:    Relocation section '.rel.text' at offset 0x318 contains 41 entries:<br>
-ELF32-NEXT:     Offset     Info    Type                Sym. Value  Symbol's Name<br>
-ELF32-NEXT:    00000002  00000500 R_386_NONE             00000000   sym<br>
-ELF32-NEXT:    00000008  00000501 R_386_32               00000000   sym<br>
-ELF32-NEXT:    0000000e  00000502 R_386_PC32             00000000   sym<br>
-ELF32-NEXT:    00000014  00000503 R_386_GOT32            00000000   sym<br>
-ELF32-NEXT:    0000001a  00000504 R_386_PLT32            00000000   sym<br>
-ELF32-NEXT:    00000020  00000505 R_386_COPY             00000000   sym<br>
-ELF32-NEXT:    00000026  00000506 R_386_GLOB_DAT         00000000   sym<br>
-ELF32-NEXT:    0000002c  00000507 R_386_JUMP_SLOT        00000000   sym<br>
-ELF32-NEXT:    00000032  00000508 R_386_RELATIVE         00000000   sym<br>
-ELF32-NEXT:    00000038  00000509 R_386_GOTOFF           00000000   sym<br>
-<br>
-ELF64:    Relocation section '.rela.text' at offset 0x430 contains 38 entries:<br>
-ELF64-NEXT:        Offset             Info             Type               Symbol's Value Symbol's Name + Addend<br>
-ELF64-NEXT:    0000000000000003  0000000500000000 R_X86_64_NONE          0000000000000000 sym - 4<br>
-ELF64-NEXT:    000000000000000a  0000000500000001 R_X86_64_64            0000000000000000 sym - 4<br>
-ELF64-NEXT:    0000000000000011  0000000500000002 R_X86_64_PC32          0000000000000000 sym - 4<br>
-ELF64-NEXT:    0000000000000018  0000000500000003 R_X86_64_GOT32         0000000000000000 sym - 4<br>
-ELF64-NEXT:    000000000000001f  0000000500000004 R_X86_64_PLT32         0000000000000000 sym - 4<br>
-ELF64-NEXT:    0000000000000026  0000000500000005 R_X86_64_COPY          0000000000000000 sym - 4<br>
-ELF64-NEXT:    000000000000002d  0000000500000006 R_X86_64_GLOB_DAT      0000000000000000 sym - 4<br>
-ELF64-NEXT:    0000000000000034  0000000500000007 R_X86_64_JUMP_SLOT     0000000000000000 sym - 4<br>
<br>
Removed: llvm/trunk/test/tools/llvm-readobj/gnu-sections.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/gnu-sections.test?rev=261926&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/gnu-sections.test?rev=261926&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-readobj/gnu-sections.test (original)<br>
+++ llvm/trunk/test/tools/llvm-readobj/gnu-sections.test (removed)<br>
@@ -1,35 +0,0 @@<br>
-RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \<br>
-RUN:   | FileCheck %s -check-prefix ELF32<br>
-RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \<br>
-RUN:   | FileCheck %s -check-prefix ELF64<br>
-<br>
-ELF32:    Section Headers:<br>
-ELF32-NEXT:      [Nr] Name              Type            Address  Off    Size   ES Flg Lk Inf Al<br>
-ELF32-NEXT:      [ 0]                   NULL            00000000 000000 000000 00      0   0  0<br>
-ELF32-NEXT:      [ 1] .text             PROGBITS        00000000 000034 0000f6 00  AX  0   0  4<br>
-ELF32-NEXT:      [ 2] .rel.text         REL             00000000 000318 000148 08      6   1  4<br>
-ELF32-NEXT:      [ 3] .data             PROGBITS        00000000 00012c 000000 00  WA  0   0  4<br>
-ELF32-NEXT:      [ 4] .bss              NOBITS          00000000 00012c 000000 00  WA  0   0  4<br>
-ELF32-NEXT:      [ 5] .shstrtab         STRTAB          00000000 00012c 000030 00      0   0  1<br>
-ELF32-NEXT:      [ 6] .symtab           SYMTAB          00000000 00029c 000060 10      7   4  4<br>
-ELF32-NEXT:      [ 7] .strtab           STRTAB          00000000 0002fc 00001b 00      0   0  1<br>
-ELF32-NEXT:    Key to Flags:<br>
-ELF32-NEXT:      W (write), A (alloc), X (execute), M (merge), S (strings), l (large)<br>
-ELF32-NEXT:      I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)<br>
-ELF32-NEXT:      O (extra OS processing required) o (OS specific), p (processor specific)<br>
-<br>
-ELF64:    There are 8 section headers, starting at offset 0x180:<br>
-ELF64:    Section Headers:<br>
-ELF64-NEXT:      [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al<br>
-ELF64-NEXT:      [ 0]                   NULL            0000000000000000 000000 000000 00     0   0  0<br>
-ELF64-NEXT:      [ 1] .text             PROGBITS        0000000000000000 000040 00010a 00  AX 0   0  4<br>
-ELF64-NEXT:      [ 2] .rela.text        RELA            0000000000000000 000430 000390 18     6   1  8<br>
-ELF64-NEXT:      [ 3] .data             PROGBITS        0000000000000000 00014c 000000 00  WA 0   0  4<br>
-ELF64-NEXT:      [ 4] .bss              NOBITS          0000000000000000 00014c 000000 00  WA 0   0  4<br>
-ELF64-NEXT:      [ 5] .shstrtab         STRTAB          0000000000000000 00014c 000031 00     0   0  1<br>
-ELF64-NEXT:      [ 6] .symtab           SYMTAB          0000000000000000 000380 000090 18     7   4  8<br>
-ELF64-NEXT:      [ 7] .strtab           STRTAB          0000000000000000 000410 00001b 00     0   0  1<br>
-ELF64-NEXT:    Key to Flags:<br>
-ELF64-NEXT:      W (write), A (alloc), X (execute), M (merge), S (strings), l (large)<br>
-ELF64-NEXT:      I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)<br>
-ELF64-NEXT:      O (extra OS processing required) o (OS specific), p (processor specific)<br>
<br>
Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=261927&r1=261926&r2=261927&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=261927&r1=261926&r2=261927&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)<br>
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Thu Feb 25 14:47:07 2016<br>
@@ -44,21 +44,6 @@ using namespace ELF;<br>
 #define ENUM_ENT_1(enum) \<br>
   { #enum, #enum, ELF::enum }<br>
<br>
-#define TYPEDEF_ELF_TYPES(ELFT)                                                \<br>
-  typedef ELFFile<ELFT> ELFO;                                                  \<br>
-  typedef typename ELFO::Elf_Shdr Elf_Shdr;                                    \<br>
-  typedef typename ELFO::Elf_Sym Elf_Sym;                                      \<br>
-  typedef typename ELFO::Elf_Dyn Elf_Dyn;                                      \<br>
-  typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;                          \<br>
-  typedef typename ELFO::Elf_Rel Elf_Rel;                                      \<br>
-  typedef typename ELFO::Elf_Rela Elf_Rela;                                    \<br>
-  typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range;                        \<br>
-  typedef typename ELFO::Elf_Phdr Elf_Phdr;                                    \<br>
-  typedef typename ELFO::Elf_Half Elf_Half;                                    \<br>
-  typedef typename ELFO::Elf_Ehdr Elf_Ehdr;                                    \<br>
-  typedef typename ELFO::Elf_Word Elf_Word;                                    \<br>
-  typedef typename ELFO::uintX_t uintX_t;<br>
-<br>
 namespace {<br>
<br>
 template <class ELFT> class DumpStyle;<br>
@@ -159,15 +144,21 @@ private:<br>
<br>
   void parseDynamicTable(ArrayRef<const Elf_Phdr *> LoadSegments);<br>
<br>
+  void printSymbolsHelper(bool IsDynamic);<br>
   void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym,<br>
                    StringRef StrTable, bool IsDynamic);<br>
<br>
+  void printDynamicRelocation(Elf_Rela Rel);<br>
+  void printRelocations(const Elf_Shdr *Sec);<br>
+  void printRelocation(Elf_Rela Rel, const Elf_Shdr *SymTab);<br>
   void printValue(uint64_t Type, uint64_t Value);<br>
<br>
+  Elf_Rel_Range dyn_rels() const;<br>
+  Elf_Rela_Range dyn_relas() const;<br>
   StringRef getDynamicString(uint64_t Offset) const;<br>
   StringRef getSymbolVersion(StringRef StrTab, const Elf_Sym *symb,<br>
-                             bool &IsDefault) const;<br>
-  void LoadVersionMap() const;<br>
+                             bool &IsDefault);<br>
+  void LoadVersionMap();<br>
   void LoadVersionNeeds(const Elf_Shdr *ec) const;<br>
   void LoadVersionDefs(const Elf_Shdr *sec) const;<br>
<br>
@@ -220,99 +211,45 @@ public:<br>
     return DynSymRegion.getAsRange<Elf_Sym>();<br>
   }<br>
<br>
-  Elf_Rel_Range dyn_rels() const;<br>
-  Elf_Rela_Range dyn_relas() const;<br>
   std::string getFullSymbolName(const Elf_Sym *Symbol, StringRef StrTable,<br>
-                                bool IsDynamic) const;<br>
+                                bool IsDynamic);<br>
   const Elf_Shdr *getDotSymtabSec() const { return DotSymtabSec; }<br>
-  ArrayRef<Elf_Word> getShndxTable() const { return ShndxTable; }<br>
+  ArrayRef<Elf_Word> getShndxTable() { return ShndxTable; }<br>
   StringRef getDynamicStringTable() const { return DynamicStringTable; }<br>
-  const DynRegionInfo &getDynRelRegion() const { return DynRelRegion; }<br>
-  const DynRegionInfo &getDynRelaRegion()const { return DynRelaRegion; }<br>
-  const DynRegionInfo &getDynPLTRelRegion()const { return DynPLTRelRegion; }<br>
 };<br>
<br>
 template <typename ELFT> class DumpStyle {<br>
 public:<br>
-  TYPEDEF_ELF_TYPES(ELFT)<br>
-  virtual void printFileHeaders(const ELFO *Obj) = 0;<br>
+  virtual void printFileHeaders(const ELFFile<ELFT> *Obj) = 0;<br>
   virtual ~DumpStyle() { }<br>
-  DumpStyle(ELFDumper<ELFT> *Dumper) : Dumper(Dumper) {}<br>
-  virtual void printRelocations(const ELFO *Obj) = 0;<br>
-  virtual void printSections(const ELFO *Obj) = 0;<br>
-  virtual void printSymbols(const ELFO *Obj) = 0;<br>
-  virtual void printDynamicSymbols(const ELFO *Obj) = 0;<br>
-  virtual void printDynamicRelocations(const ELFO *Obj) = 0;<br>
-  const ELFDumper<ELFT> *dumper() const { return Dumper; }<br>
-<br>
-private:<br>
-  const ELFDumper<ELFT> *Dumper;<br>
 };<br>
<br>
 template <typename ELFT> class GNUStyle : public DumpStyle<ELFT> {<br>
   formatted_raw_ostream OS;<br>
+<br>
 public:<br>
-  TYPEDEF_ELF_TYPES(ELFT)<br>
-  GNUStyle(StreamWriter &W, ELFDumper<ELFT> *Dumper)<br>
-      : DumpStyle<ELFT>(Dumper), OS(W.getOStream()) {}<br>
-  void printFileHeaders(const ELFO *Obj) override;<br>
-  void printRelocations(const ELFO *Obj) override;<br>
-  void printSections(const ELFO *Obj) override;<br>
-  void printSymbols(const ELFO *Obj) override;<br>
-  void printDynamicSymbols(const ELFO *Obj) override;<br>
-  void printDynamicRelocations(const ELFO *Obj) override;<br>
+  typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;<br>
+  GNUStyle(StreamWriter &W) : OS(W.getOStream()) {}<br>
+  void printFileHeaders(const ELFFile<ELFT> *Obj) override;<br>
<br>
 private:<br>
-  struct Field {<br>
-    StringRef Str;<br>
-    unsigned Column;<br>
-    Field(StringRef S, unsigned Col) : Str(S), Column(Col) {}<br>
-    Field(unsigned Col) : Str(""), Column(Col) {}<br>
-    Field &operator=(StringRef S) {<br>
-      Str = S;<br>
-      return *this;<br>
-    }<br>
-  };<br>
-<br>
   template <typename T, typename TEnum><br>
   std::string printEnum(T Value, ArrayRef<EnumEntry<TEnum>> EnumValues) {<br>
     for (const auto &EnumItem : EnumValues)<br>
       if (EnumItem.Value == Value)<br>
         return EnumItem.AltName;<br>
-    return to_hexString(Value, false);<br>
+    return to_hexString(Value);<br>
   }<br>
-  formatted_raw_ostream &printField(struct Field F) {<br>
-    if (F.Column != 0)<br>
-      OS.PadToColumn(F.Column);<br>
-    OS << F.Str;<br>
-    OS.flush();<br>
-    return OS;<br>
-  }<br>
-  void printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,<br>
-                       const Elf_Rela &R, bool IsRela);<br>
 };<br>
<br>
 template <typename ELFT> class LLVMStyle : public DumpStyle<ELFT> {<br>
 public:<br>
-  TYPEDEF_ELF_TYPES(ELFT)<br>
-  LLVMStyle(StreamWriter &W, ELFDumper<ELFT> *Dumper)<br>
-      : DumpStyle<ELFT>(Dumper), W(W) {}<br>
-<br>
-  void printFileHeaders(const ELFO *Obj) override;<br>
-  void printRelocations(const ELFO *Obj) override;<br>
-  void printRelocations(const Elf_Shdr *Sec, const ELFO *Obj);<br>
-  void printSections(const ELFO *Obj) override;<br>
-  void printSymbolsHelper(const ELFO *Obj, bool IsDynamic);<br>
-  void printSymbols(const ELFO *Obj) override;<br>
-  void printDynamicSymbols(const ELFO *Obj) override;<br>
-  void printDynamicRelocations(const ELFO *Obj) override;<br>
+  typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;<br>
+  LLVMStyle(StreamWriter &W) : W(W) {}<br>
<br>
-private:<br>
-  void printRelocation(const ELFO* Obj, Elf_Rela Rel, const Elf_Shdr *SymTab);<br>
-  void printSymbol(const ELFO *Obj, const Elf_Sym *Symbol, const Elf_Sym *First,<br>
-                   StringRef StrTable, bool IsDynamic);<br>
-  void printDynamicRelocation(const ELFO *Obj, Elf_Rela Rel);<br>
+  void printFileHeaders(const ELFFile<ELFT> *Obj) override;<br>
<br>
+private:<br>
   StreamWriter &W;<br>
 };<br>
<br>
@@ -411,7 +348,7 @@ void ELFDumper<ELFT>::LoadVersionDefs(co<br>
   }<br>
 }<br>
<br>
-template <class ELFT> void ELFDumper<ELFT>::LoadVersionMap() const {<br>
+template <class ELFT> void ELFDumper<ELFT>::LoadVersionMap() {<br>
   // If there is no dynamic symtab or version table, there is nothing to do.<br>
   if (!DynSymRegion.Addr || !dot_gnu_version_sec)<br>
     return;<br>
@@ -520,7 +457,7 @@ template <typename ELFT> void ELFDumper<<br>
 template <typename ELFT><br>
 StringRef ELFDumper<ELFT>::getSymbolVersion(StringRef StrTab,<br>
                                             const Elf_Sym *symb,<br>
-                                            bool &IsDefault) const {<br>
+                                            bool &IsDefault) {<br>
   // This is a dynamic symbol. Look in the GNU symbol version table.<br>
   if (!dot_gnu_version_sec) {<br>
     // No version table.<br>
@@ -569,7 +506,7 @@ StringRef ELFDumper<ELFT>::getSymbolVers<br>
 template <typename ELFT><br>
 std::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,<br>
                                                StringRef StrTable,<br>
-                                               bool IsDynamic) const {<br>
+                                               bool IsDynamic) {<br>
   StringRef SymbolName = unwrapOrError(Symbol->getName(StrTable));<br>
   if (!IsDynamic)<br>
     return SymbolName;<br>
@@ -956,56 +893,6 @@ static const EnumEntry<unsigned> ElfX86_<br>
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE)<br>
 };<br>
<br>
-static std::string getGNUFlags(uint64_t flags) {<br>
-  std::string str;<br>
-  for (auto entry : ElfSectionFlags) {<br>
-    uint64_t flag = entry.Value & flags;<br>
-    switch (flag) {<br>
-    case ELF::SHF_WRITE:<br>
-      str += "W";<br>
-      break;<br>
-    case ELF::SHF_ALLOC:<br>
-      str += "A";<br>
-      break;<br>
-    case ELF::SHF_EXECINSTR:<br>
-      str += "X";<br>
-      break;<br>
-    case ELF::SHF_MERGE:<br>
-      str += "M";<br>
-      break;<br>
-    case ELF::SHF_STRINGS:<br>
-      str += "S";<br>
-      break;<br>
-    case ELF::SHF_INFO_LINK:<br>
-      str += "I";<br>
-      break;<br>
-    case ELF::SHF_LINK_ORDER:<br>
-      str += "L";<br>
-      break;<br>
-    case ELF::SHF_OS_NONCONFORMING:<br>
-      str += "O";<br>
-      break;<br>
-    case ELF::SHF_GROUP:<br>
-      str += "G";<br>
-      break;<br>
-    case ELF::SHF_TLS:<br>
-      str += "T";<br>
-      break;<br>
-    case ELF::SHF_EXCLUDE:<br>
-      str += "E";<br>
-      break;<br>
-    default:<br>
-      if (flags & ELF::SHF_MASKOS)<br>
-        str += "o";<br>
-      else if (flags & ELF::SHF_MASKPROC)<br>
-        str += "p";<br>
-      else if (flag)<br>
-        str += "x";<br>
-    }<br>
-  }<br>
-  return str;<br>
-}<br>
-<br>
 static const char *getElfSegmentType(unsigned Arch, unsigned Type) {<br>
   // Check potentially overlapped processor-specific<br>
   // program header type.<br>
@@ -1153,9 +1040,9 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<br>
   parseDynamicTable(LoadSegments);<br>
<br>
   if (opts::Output == opts::GNU)<br>
-    ELFDumperStyle.reset(new GNUStyle<ELFT>(Writer, this));<br>
+    ELFDumperStyle.reset(new GNUStyle<ELFT>(Writer));<br>
   else<br>
-    ELFDumperStyle.reset(new LLVMStyle<ELFT>(Writer, this));<br>
+    ELFDumperStyle.reset(new LLVMStyle<ELFT>(Writer));<br>
 }<br>
<br>
 template <typename ELFT><br>
@@ -1258,29 +1145,261 @@ void ELFDumper<ELFT>::printFileHeaders()<br>
<br>
 template<class ELFT><br>
 void ELFDumper<ELFT>::printSections() {<br>
-  ELFDumperStyle->printSections(Obj);<br>
+  ListScope SectionsD(W, "Sections");<br>
+<br>
+  int SectionIndex = -1;<br>
+  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
+    ++SectionIndex;<br>
+<br>
+    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));<br>
+<br>
+    DictScope SectionD(W, "Section");<br>
+    W.printNumber("Index", SectionIndex);<br>
+    W.printNumber("Name", Name, Sec.sh_name);<br>
+    W.printHex("Type",<br>
+               getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),<br>
+               Sec.sh_type);<br>
+    std::vector<EnumEntry<unsigned>> SectionFlags(std::begin(ElfSectionFlags),<br>
+                                                  std::end(ElfSectionFlags));<br>
+    switch (Obj->getHeader()->e_machine) {<br>
+    case EM_AMDGPU:<br>
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfAMDGPUSectionFlags),<br>
+                          std::end(ElfAMDGPUSectionFlags));<br>
+      break;<br>
+    case EM_HEXAGON:<br>
+      SectionFlags.insert(SectionFlags.end(),<br>
+                          std::begin(ElfHexagonSectionFlags),<br>
+                          std::end(ElfHexagonSectionFlags));<br>
+      break;<br>
+    case EM_MIPS:<br>
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfMipsSectionFlags),<br>
+                          std::end(ElfMipsSectionFlags));<br>
+      break;<br>
+    case EM_X86_64:<br>
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfX86_64SectionFlags),<br>
+                          std::end(ElfX86_64SectionFlags));<br>
+      break;<br>
+    default:<br>
+      // Nothing to do.<br>
+      break;<br>
+    }<br>
+    W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags));<br>
+    W.printHex("Address", Sec.sh_addr);<br>
+    W.printHex("Offset", Sec.sh_offset);<br>
+    W.printNumber("Size", Sec.sh_size);<br>
+    W.printNumber("Link", Sec.sh_link);<br>
+    W.printNumber("Info", Sec.sh_info);<br>
+    W.printNumber("AddressAlignment", Sec.sh_addralign);<br>
+    W.printNumber("EntrySize", Sec.sh_entsize);<br>
+<br>
+    if (opts::SectionRelocations) {<br>
+      ListScope D(W, "Relocations");<br>
+      printRelocations(&Sec);<br>
+    }<br>
+<br>
+    if (opts::SectionSymbols) {<br>
+      ListScope D(W, "Symbols");<br>
+      const Elf_Shdr *Symtab = DotSymtabSec;<br>
+      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));<br>
+<br>
+      for (const Elf_Sym &Sym : Obj->symbols(Symtab)) {<br>
+        const Elf_Shdr *SymSec =<br>
+            unwrapOrError(Obj->getSection(&Sym, Symtab, ShndxTable));<br>
+        if (SymSec == &Sec)<br>
+          printSymbol(&Sym, Obj->symbol_begin(Symtab), StrTable, false);<br>
+      }<br>
+    }<br>
+<br>
+    if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {<br>
+      ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec));<br>
+      W.printBinaryBlock("SectionData",<br>
+                         StringRef((const char *)Data.data(), Data.size()));<br>
+    }<br>
+  }<br>
 }<br>
<br>
 template<class ELFT><br>
 void ELFDumper<ELFT>::printRelocations() {<br>
-  ELFDumperStyle->printRelocations(Obj);<br>
+  ListScope D(W, "Relocations");<br>
+<br>
+  int SectionNumber = -1;<br>
+  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
+    ++SectionNumber;<br>
+<br>
+    if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)<br>
+      continue;<br>
+<br>
+    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));<br>
+<br>
+    W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";<br>
+    W.indent();<br>
+<br>
+    printRelocations(&Sec);<br>
+<br>
+    W.unindent();<br>
+    W.startLine() << "}\n";<br>
+  }<br>
 }<br>
<br>
 template <class ELFT> void ELFDumper<ELFT>::printDynamicRelocations() {<br>
-  ELFDumperStyle->printDynamicRelocations(Obj);<br>
+  if (DynRelRegion.Size && DynRelaRegion.Size)<br>
+    report_fatal_error("There are both REL and RELA dynamic relocations");<br>
+  W.startLine() << "Dynamic Relocations {\n";<br>
+  W.indent();<br>
+  if (DynRelaRegion.Size > 0)<br>
+    for (const Elf_Rela &Rela : dyn_relas())<br>
+      printDynamicRelocation(Rela);<br>
+  else<br>
+    for (const Elf_Rel &Rel : dyn_rels()) {<br>
+      Elf_Rela Rela;<br>
+      Rela.r_offset = Rel.r_offset;<br>
+      Rela.r_info = Rel.r_info;<br>
+      Rela.r_addend = 0;<br>
+      printDynamicRelocation(Rela);<br>
+    }<br>
+  if (DynPLTRelRegion.EntSize == sizeof(Elf_Rela))<br>
+    for (const Elf_Rela &Rela : DynPLTRelRegion.getAsRange<Elf_Rela>())<br>
+      printDynamicRelocation(Rela);<br>
+  else<br>
+    for (const Elf_Rel &Rel : DynPLTRelRegion.getAsRange<Elf_Rel>()) {<br>
+      Elf_Rela Rela;<br>
+      Rela.r_offset = Rel.r_offset;<br>
+      Rela.r_info = Rel.r_info;<br>
+      Rela.r_addend = 0;<br>
+      printDynamicRelocation(Rela);<br>
+    }<br>
+  W.unindent();<br>
+  W.startLine() << "}\n";<br>
 }<br>
<br>
+template <class ELFT><br>
+void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) {<br>
+  const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link));<br>
+<br>
+  switch (Sec->sh_type) {<br>
+  case ELF::SHT_REL:<br>
+    for (const Elf_Rel &R : Obj->rels(Sec)) {<br>
+      Elf_Rela Rela;<br>
+      Rela.r_offset = R.r_offset;<br>
+      Rela.r_info = R.r_info;<br>
+      Rela.r_addend = 0;<br>
+      printRelocation(Rela, SymTab);<br>
+    }<br>
+    break;<br>
+  case ELF::SHT_RELA:<br>
+    for (const Elf_Rela &R : Obj->relas(Sec))<br>
+      printRelocation(R, SymTab);<br>
+    break;<br>
+  }<br>
+}<br>
+<br>
+template <class ELFT><br>
+void ELFDumper<ELFT>::printRelocation(Elf_Rela Rel, const Elf_Shdr *SymTab) {<br>
+  SmallString<32> RelocName;<br>
+  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);<br>
+  StringRef TargetName;<br>
+  const Elf_Sym *Sym = Obj->getRelocationSymbol(&Rel, SymTab);<br>
+  if (Sym && Sym->getType() == ELF::STT_SECTION) {<br>
+    const Elf_Shdr *Sec =<br>
+        unwrapOrError(Obj->getSection(Sym, SymTab, ShndxTable));<br>
+    TargetName = unwrapOrError(Obj->getSectionName(Sec));<br>
+  } else if (Sym) {<br>
+    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));<br>
+    TargetName = unwrapOrError(Sym->getName(StrTable));<br>
+  }<br>
+<br>
+  if (opts::ExpandRelocs) {<br>
+    DictScope Group(W, "Relocation");<br>
+    W.printHex("Offset", Rel.r_offset);<br>
+    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));<br>
+    W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-",<br>
+                  Rel.getSymbol(Obj->isMips64EL()));<br>
+    W.printHex("Addend", Rel.r_addend);<br>
+  } else {<br>
+    raw_ostream& OS = W.startLine();<br>
+    OS << W.hex(Rel.r_offset) << " " << RelocName << " "<br>
+       << (TargetName.size() > 0 ? TargetName : "-") << " "<br>
+       << W.hex(Rel.r_addend) << "\n";<br>
+  }<br>
+}<br>
+<br>
+template <class ELFT><br>
+void ELFDumper<ELFT>::printDynamicRelocation(Elf_Rela Rel) {<br>
+  SmallString<32> RelocName;<br>
+  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);<br>
+  StringRef SymbolName;<br>
+  uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());<br>
+  const Elf_Sym *Sym = dynamic_symbols().begin() + SymIndex;<br>
+  SymbolName = unwrapOrError(Sym->getName(DynamicStringTable));<br>
+  if (opts::ExpandRelocs) {<br>
+    DictScope Group(W, "Relocation");<br>
+    W.printHex("Offset", Rel.r_offset);<br>
+    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));<br>
+    W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");<br>
+    W.printHex("Addend", Rel.r_addend);<br>
+  } else {<br>
+    raw_ostream &OS = W.startLine();<br>
+    OS << W.hex(Rel.r_offset) << " " << RelocName << " "<br>
+       << (SymbolName.size() > 0 ? SymbolName : "-") << " "<br>
+       << W.hex(Rel.r_addend) << "\n";<br>
+  }<br>
+}<br>
+<br>
+template<class ELFT><br>
+void ELFDumper<ELFT>::printSymbolsHelper(bool IsDynamic) {<br>
+  StringRef StrTable;<br>
+  Elf_Sym_Range Syms(nullptr, nullptr);<br>
+<br>
+  if (IsDynamic) {<br>
+    StrTable = DynamicStringTable;<br>
+    Syms = dynamic_symbols();<br>
+  } else {<br>
+    if (!DotSymtabSec)<br>
+      return;<br>
+    StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec));<br>
+    Syms = Obj->symbols(DotSymtabSec);<br>
+  }<br>
+  for (const Elf_Sym &Sym : Syms)<br>
+    printSymbol(&Sym, Syms.begin(), StrTable, IsDynamic);<br>
+}<br>
<br>
 template<class ELFT><br>
 void ELFDumper<ELFT>::printSymbols() {<br>
-  ELFDumperStyle->printSymbols(Obj);<br>
+  ListScope Group(W, "Symbols");<br>
+  printSymbolsHelper(false);<br>
 }<br>
<br>
 template<class ELFT><br>
 void ELFDumper<ELFT>::printDynamicSymbols() {<br>
-  ELFDumperStyle->printDynamicSymbols(Obj);<br>
+  ListScope Group(W, "DynamicSymbols");<br>
+  printSymbolsHelper(true);<br>
 }<br>
<br>
+template <class ELFT><br>
+void ELFDumper<ELFT>::printSymbol(const Elf_Sym *Symbol,<br>
+                                  const Elf_Sym *FirstSym, StringRef StrTable,<br>
+                                  bool IsDynamic) {<br>
+  unsigned SectionIndex = 0;<br>
+  StringRef SectionName;<br>
+  getSectionNameIndex(*Obj, Symbol, FirstSym, ShndxTable, SectionName,<br>
+                      SectionIndex);<br>
+  std::string FullSymbolName = getFullSymbolName(Symbol, StrTable, IsDynamic);<br>
+  unsigned char SymbolType = Symbol->getType();<br>
+<br>
+  DictScope D(W, "Symbol");<br>
+  W.printNumber("Name", FullSymbolName, Symbol->st_name);<br>
+  W.printHex   ("Value", Symbol->st_value);<br>
+  W.printNumber("Size", Symbol->st_size);<br>
+  W.printEnum  ("Binding", Symbol->getBinding(),<br>
+                  makeArrayRef(ElfSymbolBindings));<br>
+  if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU &&<br>
+      SymbolType >= ELF::STT_LOOS && SymbolType < ELF::STT_HIOS)<br>
+    W.printEnum  ("Type", SymbolType, makeArrayRef(AMDGPUSymbolTypes));<br>
+  else<br>
+    W.printEnum  ("Type", SymbolType, makeArrayRef(ElfSymbolTypes));<br>
+  W.printNumber("Other", Symbol->st_other);<br>
+  W.printHex("Section", SectionName, SectionIndex);<br>
+}<br>
<br>
 #define LLVM_READOBJ_TYPE_CASE(name) \<br>
   case DT_##name: return #name<br>
@@ -2173,7 +2292,8 @@ static inline void printFields(formatted<br>
   OS.flush();<br>
 }<br>
<br>
-template <class ELFT> void GNUStyle<ELFT>::printFileHeaders(const ELFO *Obj) {<br>
+template <class ELFT><br>
+void GNUStyle<ELFT>::printFileHeaders(const ELFFile<ELFT> *Obj) {<br>
   const Elf_Ehdr *e = Obj->getHeader();<br>
   OS << "ELF Header:\n";<br>
   OS << "  Magic:  ";<br>
@@ -2226,275 +2346,7 @@ template <class ELFT> void GNUStyle<ELFT<br>
 }<br>
<br>
 template <class ELFT><br>
-void GNUStyle<ELFT>::printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,<br>
-                                     const Elf_Rela &R, bool IsRela) {<br>
-  std::string r_offset, r_info, r_addend = "", s_value;<br>
-  SmallString<32> RelocName;<br>
-  StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));<br>
-  StringRef TargetName;<br>
-  const Elf_Sym *Sym = nullptr;<br>
-  unsigned bias;<br>
-  const char *FmtCharHex;<br>
-  if (ELFT::Is64Bits) {<br>
-    bias = 8;<br>
-    FmtCharHex = "%016" PRIx64;<br>
-  } else {<br>
-    bias = 0;<br>
-    FmtCharHex = "%08" PRIx32;<br>
-  }<br>
-  Field fields[5] = {0, 10 + bias, 19 + 2 * bias, 42 + 2 * bias, 53 + 2 * bias};<br>
-  Obj->getRelocationTypeName(R.getType(Obj->isMips64EL()), RelocName);<br>
-  Sym = Obj->getRelocationSymbol(&R, SymTab);<br>
-  if (Sym && Sym->getType() == ELF::STT_SECTION) {<br>
-    const Elf_Shdr *Sec = unwrapOrError(<br>
-        Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable()));<br>
-    TargetName = unwrapOrError(Obj->getSectionName(Sec));<br>
-  } else if (Sym) {<br>
-    TargetName = unwrapOrError(Sym->getName(StrTable));<br>
-  }<br>
-<br>
-  if (Sym && IsRela) {<br>
-    if (R.r_addend < 0)<br>
-      r_addend = " - ";<br>
-    else<br>
-      r_addend = " + ";<br>
-  }<br>
-  r_offset = to_hexString(format(FmtCharHex, R.r_offset));<br>
-  r_info = to_hexString(format(FmtCharHex, R.r_info));<br>
-  if (IsRela)<br>
-    r_addend +=<br>
-        R.r_addend == 0 ? std::string("0") : to_hexString(std::abs(R.r_addend), false);<br>
-  if (Sym)<br>
-    s_value = to_hexString(format(FmtCharHex, Sym->getValue()));<br>
-<br>
-  fields[0] = r_offset;<br>
-  fields[1] = r_info;<br>
-  fields[2] = RelocName;<br>
-  fields[3] = s_value;<br>
-  fields[4] = TargetName;<br>
-  for (auto &field : fields)<br>
-    printField(field);<br>
-  if (IsRela)<br>
-    OS << r_addend;<br>
-  OS << "\n";<br>
-}<br>
-<br>
-template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {<br>
-  bool hasRelocSections = false;<br>
-  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
-    if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)<br>
-      continue;<br>
-    hasRelocSections = true;<br>
-    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));<br>
-    unsigned entries = Sec.getEntityCount();<br>
-    uintX_t offset = Sec.sh_offset;<br>
-    OS << "\nRelocation section '" << Name << "' at offset 0x"<br>
-       << to_hexString(offset, false) << " contains " << to_string(entries)<br>
-       << " entries:\n";<br>
-    if (ELFT::Is64Bits)<br>
-      OS << "    Offset             Info             Type"<br>
-         << "               Symbol's Value  Symbol's Name";<br>
-    else<br>
-      OS << " Offset     Info    Type                Sym. Value  "<br>
-         << "Symbol's Name";<br>
-    OS << ((Sec.sh_type == ELF::SHT_RELA) ? " + Addend" : "") << "\n";<br>
-<br>
-    const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec.sh_link));<br>
-    if (Sec.sh_type == ELF::SHT_REL) {<br>
-      for (const auto &R : Obj->rels(&Sec)) {<br>
-        Elf_Rela Rela;<br>
-        Rela.r_offset = R.r_offset;<br>
-        Rela.r_info = R.r_info;<br>
-        Rela.r_addend = 0;<br>
-        printRelocation(Obj, SymTab, Rela, false);<br>
-      }<br>
-    } else {<br>
-      for (const auto &R : Obj->relas(&Sec))<br>
-        printRelocation(Obj, SymTab, R, true);<br>
-    }<br>
-  }<br>
-  if (!hasRelocSections)<br>
-    OS << "\nThere are no relocations in this file.\n";<br>
-}<br>
-<br>
-std::string getSectiontypeString(unsigned arch, unsigned type) {<br>
-  using namespace ELF;<br>
-  switch (arch) {<br>
-  case EM_ARM:<br>
-    switch (type) {<br>
-    case SHT_ARM_EXIDX:<br>
-      return "ARM_EXIDX";<br>
-    case SHT_ARM_PREEMPTMAP:<br>
-      return "ARM_PREEMPTMAP";<br>
-    case SHT_ARM_ATTRIBUTES:<br>
-      return "ARM_ATTRIBUTES";<br>
-    case SHT_ARM_DEBUGOVERLAY:<br>
-      return "ARM_DEBUGOVERLAY";<br>
-    case SHT_ARM_OVERLAYSECTION:<br>
-      return "ARM_OVERLAYSECTION";<br>
-    }<br>
-  case EM_X86_64:<br>
-    switch (type) {<br>
-    case SHT_X86_64_UNWIND:<br>
-      return "X86_64_UNWIND";<br>
-    }<br>
-  case EM_MIPS:<br>
-  case EM_MIPS_RS3_LE:<br>
-    switch (type) {<br>
-    case SHT_MIPS_REGINFO:<br>
-      return "MIPS_REGINFO";<br>
-    case SHT_MIPS_OPTIONS:<br>
-      return "MIPS_OPTIONS";<br>
-    case SHT_MIPS_ABIFLAGS:<br>
-      return "MIPS_ABIFLAGS";<br>
-    }<br>
-  }<br>
-  switch (type) {<br>
-  case SHT_NULL:<br>
-    return "NULL";<br>
-  case SHT_PROGBITS:<br>
-    return "PROGBITS";<br>
-  case SHT_SYMTAB:<br>
-    return "SYMTAB";<br>
-  case SHT_STRTAB:<br>
-    return "STRTAB";<br>
-  case SHT_RELA:<br>
-    return "RELA";<br>
-  case SHT_HASH:<br>
-    return "HASH";<br>
-  case SHT_DYNAMIC:<br>
-    return "DYNAMIC";<br>
-  case SHT_NOTE:<br>
-    return "NOTE";<br>
-  case SHT_NOBITS:<br>
-    return "NOBITS";<br>
-  case SHT_REL:<br>
-    return "REL";<br>
-  case SHT_SHLIB:<br>
-    return "SHLIB";<br>
-  case SHT_DYNSYM:<br>
-    return "DYNSYM";<br>
-  case SHT_INIT_ARRAY:<br>
-    return "INIT_ARRAY";<br>
-  case SHT_FINI_ARRAY:<br>
-    return "FINI_ARRAY";<br>
-  case SHT_PREINIT_ARRAY:<br>
-    return "PREINIT_ARRAY";<br>
-  case SHT_GROUP:<br>
-    return "GROUP";<br>
-  case SHT_SYMTAB_SHNDX:<br>
-    return "SYMTAB SECTION INDICES";<br>
-  // FIXME: Parse processor specific GNU attributes<br>
-  case SHT_GNU_ATTRIBUTES:<br>
-    return "ATTRIBUTES";<br>
-  case SHT_GNU_HASH:<br>
-    return "GNU_HASH";<br>
-  case SHT_GNU_verdef:<br>
-    return "VERDEF";<br>
-  case SHT_GNU_verneed:<br>
-    return "VERNEED";<br>
-  case SHT_GNU_versym:<br>
-    return "VERSYM";<br>
-  default:<br>
-    return "";<br>
-  }<br>
-  return "";<br>
-}<br>
-<br>
-template <class ELFT> void GNUStyle<ELFT>::printSections(const ELFO *Obj) {<br>
-  size_t sectionIndex = 0;<br>
-  std::string number, type, size, address, offset, flags, link, info, entrysize,<br>
-      alignment;<br>
-  unsigned bias;<br>
-  const char *FmtChar;<br>
-<br>
-  if (ELFT::Is64Bits) {<br>
-    bias = 0;<br>
-    FmtChar = "%016" PRIx64;<br>
-  } else {<br>
-    bias = 8;<br>
-    FmtChar = "%08" PRIx32;<br>
-  }<br>
-  OS << "There are " << to_string(Obj->getHeader()->e_shnum)<br>
-     << " section headers, starting at offset "<br>
-     << "0x" << to_hexString(Obj->getHeader()->e_shoff, false) << ":\n\n";<br>
-  OS << "Section Headers:\n";<br>
-  Field fields[11] = {{"[Nr]", 2},<br>
-                      {"Name", 7},<br>
-                      {"Type", 25},<br>
-                      {"Address", 41},<br>
-                      {"Off", 58 - bias},<br>
-                      {"Size", 65 - bias},<br>
-                      {"ES", 72 - bias},<br>
-                      {"Flg", 75 - bias},<br>
-                      {"Lk", 79 - bias},<br>
-                      {"Inf", 82 - bias},<br>
-                      {"Al", 86 - bias}};<br>
-  for (auto &f : fields)<br>
-    printField(f);<br>
-  OS << "\n";<br>
-<br>
-  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
-    number = to_string(sectionIndex);<br>
-    fields[0] = number;<br>
-    fields[1] = unwrapOrError(Obj->getSectionName(&Sec));<br>
-    type = getSectiontypeString(Obj->getHeader()->e_machine, Sec.sh_type);<br>
-    fields[2] = type;<br>
-    address = to_hexString(format(FmtChar, Sec.sh_addr));<br>
-    fields[3] = address;<br>
-    offset = to_hexString(format("%6.6x", Sec.sh_offset));<br>
-    fields[4] = offset;<br>
-    size = to_hexString(format("%6.6x", Sec.sh_size));<br>
-    fields[5] = size;<br>
-    entrysize = to_hexString(format("%2.2x", Sec.sh_entsize));<br>
-    fields[6] = entrysize;<br>
-    flags = getGNUFlags(Sec.sh_flags);<br>
-    fields[7] = flags;<br>
-    link = to_string(Sec.sh_link);<br>
-    fields[8] = link;<br>
-    info = to_string(Sec.sh_info);<br>
-    fields[9] = info;<br>
-    alignment = to_string(Sec.sh_addralign);<br>
-    fields[10] = alignment;<br>
-    OS.PadToColumn(fields[0].Column);<br>
-    OS << "[" << right_justify(fields[0].Str, 2) << "]";<br>
-    for (int i = 1; i < 7; i++)<br>
-      printField(fields[i]);<br>
-    OS.PadToColumn(fields[7].Column);<br>
-    OS << right_justify(fields[7].Str, 3);<br>
-    OS.PadToColumn(fields[8].Column);<br>
-    OS << right_justify(fields[8].Str, 2);<br>
-    OS.PadToColumn(fields[9].Column);<br>
-    OS << right_justify(fields[9].Str, 3);<br>
-    OS.PadToColumn(fields[10].Column);<br>
-    OS << right_justify(fields[10].Str, 2);<br>
-    OS << "\n";<br>
-    ++sectionIndex;<br>
-  }<br>
-  OS << "Key to Flags:\n"<br>
-     << "  W (write), A (alloc), X (execute), M (merge), S (strings), l "<br>
-        "(large)\n"<br>
-     << "  I (info), L (link order), G (group), T (TLS), E (exclude),\<br>
- x (unknown)\n"<br>
-     << "  O (extra OS processing required) o (OS specific),\<br>
- p (processor specific)\n";<br>
-}<br>
-<br>
-template <class ELFT> void GNUStyle<ELFT>::printSymbols(const ELFO *Obj) {<br>
-  OS << "GNU style symbols not implemented!\n";<br>
-}<br>
-<br>
-template <class ELFT><br>
-void GNUStyle<ELFT>::printDynamicSymbols(const ELFO *Obj) {<br>
-  OS << "GNU style dynamic symbols not implemented!\n";<br>
-}<br>
-<br>
-template <class ELFT><br>
-void GNUStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {<br>
-  OS << "GNU style dynamic relocations not implemented!\n";<br>
-}<br>
-<br>
-template <class ELFT> void LLVMStyle<ELFT>::printFileHeaders(const ELFO *Obj) {<br>
+void LLVMStyle<ELFT>::printFileHeaders(const ELFFile<ELFT> *Obj) {<br>
   const Elf_Ehdr *e = Obj->getHeader();<br>
   {<br>
     DictScope D(W, "ElfHeader");<br>
@@ -2537,264 +2389,3 @@ template <class ELFT> void LLVMStyle<ELF<br>
     W.printNumber("StringTableSectionIndex", e->e_shstrndx);<br>
   }<br>
 }<br>
-<br>
-template <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {<br>
-  ListScope D(W, "Relocations");<br>
-<br>
-  int SectionNumber = -1;<br>
-  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
-    ++SectionNumber;<br>
-<br>
-    if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)<br>
-      continue;<br>
-<br>
-    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));<br>
-<br>
-    W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";<br>
-    W.indent();<br>
-<br>
-    printRelocations(&Sec, Obj);<br>
-<br>
-    W.unindent();<br>
-    W.startLine() << "}\n";<br>
-  }<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printRelocations(const Elf_Shdr *Sec, const ELFO *Obj) {<br>
-  const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link));<br>
-<br>
-  switch (Sec->sh_type) {<br>
-  case ELF::SHT_REL:<br>
-    for (const Elf_Rel &R : Obj->rels(Sec)) {<br>
-      Elf_Rela Rela;<br>
-      Rela.r_offset = R.r_offset;<br>
-      Rela.r_info = R.r_info;<br>
-      Rela.r_addend = 0;<br>
-      printRelocation(Obj, Rela, SymTab);<br>
-    }<br>
-    break;<br>
-  case ELF::SHT_RELA:<br>
-    for (const Elf_Rela &R : Obj->relas(Sec))<br>
-      printRelocation(Obj, R, SymTab);<br>
-    break;<br>
-  }<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printRelocation(const ELFO *Obj, Elf_Rela Rel,<br>
-                                      const Elf_Shdr *SymTab) {<br>
-  SmallString<32> RelocName;<br>
-  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);<br>
-  StringRef TargetName;<br>
-  const Elf_Sym *Sym = Obj->getRelocationSymbol(&Rel, SymTab);<br>
-  if (Sym && Sym->getType() == ELF::STT_SECTION) {<br>
-    const Elf_Shdr *Sec = unwrapOrError(<br>
-        Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable()));<br>
-    TargetName = unwrapOrError(Obj->getSectionName(Sec));<br>
-  } else if (Sym) {<br>
-    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));<br>
-    TargetName = unwrapOrError(Sym->getName(StrTable));<br>
-  }<br>
-<br>
-  if (opts::ExpandRelocs) {<br>
-    DictScope Group(W, "Relocation");<br>
-    W.printHex("Offset", Rel.r_offset);<br>
-    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));<br>
-    W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-",<br>
-                  Rel.getSymbol(Obj->isMips64EL()));<br>
-    W.printHex("Addend", Rel.r_addend);<br>
-  } else {<br>
-    raw_ostream &OS = W.startLine();<br>
-    OS << W.hex(Rel.r_offset) << " " << RelocName << " "<br>
-       << (TargetName.size() > 0 ? TargetName : "-") << " "<br>
-       << W.hex(Rel.r_addend) << "\n";<br>
-  }<br>
-}<br>
-<br>
-template <class ELFT> void LLVMStyle<ELFT>::printSections(const ELFO *Obj) {<br>
-  ListScope SectionsD(W, "Sections");<br>
-<br>
-  int SectionIndex = -1;<br>
-  for (const Elf_Shdr &Sec : Obj->sections()) {<br>
-    ++SectionIndex;<br>
-<br>
-    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));<br>
-<br>
-    DictScope SectionD(W, "Section");<br>
-    W.printNumber("Index", SectionIndex);<br>
-    W.printNumber("Name", Name, Sec.sh_name);<br>
-    W.printHex("Type",<br>
-               getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),<br>
-               Sec.sh_type);<br>
-    std::vector<EnumEntry<unsigned>> SectionFlags(std::begin(ElfSectionFlags),<br>
-                                                  std::end(ElfSectionFlags));<br>
-    switch (Obj->getHeader()->e_machine) {<br>
-    case EM_AMDGPU:<br>
-      SectionFlags.insert(SectionFlags.end(), std::begin(ElfAMDGPUSectionFlags),<br>
-                          std::end(ElfAMDGPUSectionFlags));<br>
-      break;<br>
-    case EM_HEXAGON:<br>
-      SectionFlags.insert(SectionFlags.end(),<br>
-                          std::begin(ElfHexagonSectionFlags),<br>
-                          std::end(ElfHexagonSectionFlags));<br>
-      break;<br>
-    case EM_MIPS:<br>
-      SectionFlags.insert(SectionFlags.end(), std::begin(ElfMipsSectionFlags),<br>
-                          std::end(ElfMipsSectionFlags));<br>
-      break;<br>
-    case EM_X86_64:<br>
-      SectionFlags.insert(SectionFlags.end(), std::begin(ElfX86_64SectionFlags),<br>
-                          std::end(ElfX86_64SectionFlags));<br>
-      break;<br>
-    default:<br>
-      // Nothing to do.<br>
-      break;<br>
-    }<br>
-    W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags));<br>
-    W.printHex("Address", Sec.sh_addr);<br>
-    W.printHex("Offset", Sec.sh_offset);<br>
-    W.printNumber("Size", Sec.sh_size);<br>
-    W.printNumber("Link", Sec.sh_link);<br>
-    W.printNumber("Info", Sec.sh_info);<br>
-    W.printNumber("AddressAlignment", Sec.sh_addralign);<br>
-    W.printNumber("EntrySize", Sec.sh_entsize);<br>
-<br>
-    if (opts::SectionRelocations) {<br>
-      ListScope D(W, "Relocations");<br>
-      printRelocations(&Sec, Obj);<br>
-    }<br>
-<br>
-    if (opts::SectionSymbols) {<br>
-      ListScope D(W, "Symbols");<br>
-      const Elf_Shdr *Symtab = this->dumper()->getDotSymtabSec();<br>
-      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));<br>
-<br>
-      for (const Elf_Sym &Sym : Obj->symbols(Symtab)) {<br>
-        const Elf_Shdr *SymSec = unwrapOrError(<br>
-            Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable()));<br>
-        if (SymSec == &Sec)<br>
-          printSymbol(Obj, &Sym, Obj->symbol_begin(Symtab), StrTable, false);<br>
-      }<br>
-    }<br>
-<br>
-    if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {<br>
-      ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec));<br>
-      W.printBinaryBlock("SectionData",<br>
-                         StringRef((const char *)Data.data(), Data.size()));<br>
-    }<br>
-  }<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printSymbol(const ELFO *Obj, const Elf_Sym *Symbol,<br>
-                                  const Elf_Sym *First, StringRef StrTable,<br>
-                                  bool IsDynamic) {<br>
-  unsigned SectionIndex = 0;<br>
-  StringRef SectionName;<br>
-  getSectionNameIndex(*Obj, Symbol, First, this->dumper()->getShndxTable(),<br>
-                      SectionName, SectionIndex);<br>
-  std::string FullSymbolName =<br>
-      this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic);<br>
-  unsigned char SymbolType = Symbol->getType();<br>
-<br>
-  DictScope D(W, "Symbol");<br>
-  W.printNumber("Name", FullSymbolName, Symbol->st_name);<br>
-  W.printHex("Value", Symbol->st_value);<br>
-  W.printNumber("Size", Symbol->st_size);<br>
-  W.printEnum("Binding", Symbol->getBinding(), makeArrayRef(ElfSymbolBindings));<br>
-  if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU &&<br>
-      SymbolType >= ELF::STT_LOOS && SymbolType < ELF::STT_HIOS)<br>
-    W.printEnum("Type", SymbolType, makeArrayRef(AMDGPUSymbolTypes));<br>
-  else<br>
-    W.printEnum("Type", SymbolType, makeArrayRef(ElfSymbolTypes));<br>
-  W.printNumber("Other", Symbol->st_other);<br>
-  W.printHex("Section", SectionName, SectionIndex);<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printSymbolsHelper(const ELFO *Obj, bool IsDynamic) {<br>
-  StringRef StrTable;<br>
-  typename ELFO::Elf_Sym_Range Syms(nullptr, nullptr);<br>
-  if (IsDynamic) {<br>
-    StrTable = this->dumper()->getDynamicStringTable();<br>
-    Syms = this->dumper()->dynamic_symbols();<br>
-  } else {<br>
-    if (!this->dumper()->getDotSymtabSec())<br>
-      return;<br>
-    const auto DotSymtabSec = this->dumper()->getDotSymtabSec();<br>
-    StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec));<br>
-    Syms = Obj->symbols(DotSymtabSec);<br>
-  }<br>
-  for (const Elf_Sym &Sym : Syms)<br>
-    printSymbol(Obj, &Sym, Syms.begin(), StrTable, IsDynamic);<br>
-}<br>
-<br>
-template <class ELFT> void LLVMStyle<ELFT>::printSymbols(const ELFO *Obj) {<br>
-  ListScope Group(W, "Symbols");<br>
-  printSymbolsHelper(Obj, false);<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printDynamicSymbols(const ELFO *Obj) {<br>
-  ListScope Group(W, "DynamicSymbols");<br>
-  printSymbolsHelper(Obj, true);<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {<br>
-  const DynRegionInfo &DynRelRegion = this->dumper()->getDynRelRegion();<br>
-  const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion();<br>
-  const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion();<br>
-  if (DynRelRegion.Size && DynRelaRegion.Size)<br>
-    report_fatal_error("There are both REL and RELA dynamic relocations");<br>
-  W.startLine() << "Dynamic Relocations {\n";<br>
-  W.indent();<br>
-  if (DynRelaRegion.Size > 0)<br>
-    for (const Elf_Rela &Rela : this->dumper()->dyn_relas())<br>
-      printDynamicRelocation(Obj, Rela);<br>
-  else<br>
-    for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) {<br>
-      Elf_Rela Rela;<br>
-      Rela.r_offset = Rel.r_offset;<br>
-      Rela.r_info = Rel.r_info;<br>
-      Rela.r_addend = 0;<br>
-      printDynamicRelocation(Obj, Rela);<br>
-    }<br>
-  if (DynPLTRelRegion.EntSize == sizeof(Elf_Rela))<br>
-    for (const Elf_Rela &Rela : DynPLTRelRegion.getAsRange<Elf_Rela>())<br>
-      printDynamicRelocation(Obj, Rela);<br>
-  else<br>
-    for (const Elf_Rel &Rel : DynPLTRelRegion.getAsRange<Elf_Rel>()) {<br>
-      Elf_Rela Rela;<br>
-      Rela.r_offset = Rel.r_offset;<br>
-      Rela.r_info = Rel.r_info;<br>
-      Rela.r_addend = 0;<br>
-      printDynamicRelocation(Obj, Rela);<br>
-    }<br>
-  W.unindent();<br>
-  W.startLine() << "}\n";<br>
-}<br>
-<br>
-template <class ELFT><br>
-void LLVMStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela Rel) {<br>
-  SmallString<32> RelocName;<br>
-  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);<br>
-  StringRef SymbolName;<br>
-  uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());<br>
-  const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex;<br>
-  SymbolName =<br>
-      unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable()));<br>
-  if (opts::ExpandRelocs) {<br>
-    DictScope Group(W, "Relocation");<br>
-    W.printHex("Offset", Rel.r_offset);<br>
-    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));<br>
-    W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");<br>
-    W.printHex("Addend", Rel.r_addend);<br>
-  } else {<br>
-    raw_ostream &OS = W.startLine();<br>
-    OS << W.hex(Rel.r_offset) << " " << RelocName << " "<br>
-       << (SymbolName.size() > 0 ? SymbolName : "-") << " "<br>
-       << W.hex(Rel.r_addend) << "\n";<br>
-  }<br>
-}<br>
<br>
Modified: llvm/trunk/tools/llvm-readobj/StreamWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/StreamWriter.cpp?rev=261927&r1=261926&r2=261927&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/StreamWriter.cpp?rev=261927&r1=261926&r2=261927&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-readobj/StreamWriter.cpp (original)<br>
+++ llvm/trunk/tools/llvm-readobj/StreamWriter.cpp Thu Feb 25 14:47:07 2016<br>
@@ -26,13 +26,6 @@ const std::string to_string(uint64_t Val<br>
   return stream.str();<br>
 }<br>
<br>
-const std::string to_hexString(const format_object_base &obj) {<br>
-  std::string number;<br>
-  llvm::raw_string_ostream stream(number);<br>
-  stream << obj;<br>
-  return stream.str();<br>
-}<br>
-<br>
 void StreamWriter::printBinaryImpl(StringRef Label, StringRef Str,<br>
                                    ArrayRef<uint8_t> Data, bool Block) {<br>
   if (Data.size() > 16)<br>
<br>
Modified: llvm/trunk/tools/llvm-readobj/StreamWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/StreamWriter.h?rev=261927&r1=261926&r2=261927&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/StreamWriter.h?rev=261927&r1=261926&r2=261927&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-readobj/StreamWriter.h (original)<br>
+++ llvm/trunk/tools/llvm-readobj/StreamWriter.h Thu Feb 25 14:47:07 2016<br>
@@ -62,7 +62,6 @@ raw_ostream &operator<<(raw_ostream &OS,<br>
 const std::string to_hexString(uint64_t Value, bool UpperCase = true);<br>
 const std::string to_string(uint64_t Value);<br>
<br>
-const std::string to_hexString(const format_object_base &obj);<br>
 class StreamWriter {<br>
 public:<br>
   StreamWriter(raw_ostream &OS)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>