176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===//
276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//
376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//                     The LLVM Compiler Infrastructure
476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//
576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// This file is distributed under the University of Illinois Open Source
676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// License. See LICENSE.TXT for details.
776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//
876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===----------------------------------------------------------------------===//
976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher///
1076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// \file
1176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// \brief This file implements the ELF-specific dumper for llvm-readobj.
1276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher///
1376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===----------------------------------------------------------------------===//
1476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "ARMAttributeParser.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "ARMEHABIPrinter.h"
1776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "Error.h"
1876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "ObjDumper.h"
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "StackMapPrinter.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm-readobj.h"
21c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/ADT/Optional.h"
2276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/ADT/SmallString.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringExtras.h"
24081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer#include "llvm/Object/ELFObjectFile.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ARMBuildAttributes.h"
2676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Compiler.h"
2776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Format.h"
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/FormattedStream.h"
2976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/MathExtras.h"
306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/MipsABIFlags.h"
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/ScopedPrinter.h"
3276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/raw_ostream.h"
3376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm;
3576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm::object;
3676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace ELF;
3776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#define LLVM_READOBJ_ENUM_CASE(ns, enum) \
3976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case ns::enum: return #enum;
4076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define ENUM_ENT(enum, altName) \
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  { #enum, altName, ELF::enum }
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define ENUM_ENT_1(enum) \
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  { #enum, #enum, ELF::enum }
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_READOBJ_PHDR_ENUM(ns, enum)                                       \
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ns::enum:                                                               \
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::string(#enum).substr(3);
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define TYPEDEF_ELF_TYPES(ELFT)                                                \
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef ELFFile<ELFT> ELFO;                                                  \
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Shdr Elf_Shdr;                                    \
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Sym Elf_Sym;                                      \
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Dyn Elf_Dyn;                                      \
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;                          \
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Rel Elf_Rel;                                      \
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Rela Elf_Rela;                                    \
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range;                        \
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Phdr Elf_Phdr;                                    \
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Half Elf_Half;                                    \
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Ehdr Elf_Ehdr;                                    \
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Word Elf_Word;                                    \
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Hash Elf_Hash;                                    \
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_GnuHash Elf_GnuHash;                              \
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::uintX_t uintX_t;
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
6876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace {
6976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> class DumpStyle;
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Represents a contiguous uniform range in the file. We cannot just create a
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// range directly because when creating one of these from the .dynamic table
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// the size, entity size and virtual address are different entries in arbitrary
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// order (DT_REL, DT_RELSZ, DT_RELENT for example).
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct DynRegionInfo {
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo() : Addr(nullptr), Size(0), EntSize(0) {}
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo(const void *A, uint64_t S, uint64_t ES)
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : Addr(A), Size(S), EntSize(ES) {}
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// \brief Address in current address space.
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const void *Addr;
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// \brief Size in bytes of the region.
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Size;
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// \brief Size of each entity in the region.
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t EntSize;
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  template <typename Type> ArrayRef<Type> getAsArrayRef() const {
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Type *Start = reinterpret_cast<const Type *>(Addr);
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Start)
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return {Start, Start};
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EntSize != sizeof(Type) || Size % EntSize)
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      reportError("Invalid entity size");
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return {Start, Start + (Size / EntSize)};
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
9776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<typename ELFT>
9876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherclass ELFDumper : public ObjDumper {
9976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherpublic:
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer);
10176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printFileHeaders() override;
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSections() override;
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printRelocations() override;
105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printDynamicRelocations() override;
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSymbols() override;
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDynamicSymbols() override;
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printUnwindInfo() override;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDynamicTable() override;
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printNeededLibraries() override;
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printProgramHeaders() override;
113f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printHashTable() override;
114f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printGnuHashTable() override;
115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printLoadName() override;
116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printVersionInfo() override;
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printGroupSections() override;
11876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printAttributes() override;
120c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void printMipsPLTGOT() override;
1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void printMipsABIFlags() override;
122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printMipsReginfo() override;
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printMipsOptions() override;
124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printStackMap() const override;
12676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printHashHistogram() override;
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
12976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherprivate:
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<DumpStyle<ELFT>> ELFDumperStyle;
131081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  typedef ELFFile<ELFT> ELFO;
132cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  typedef typename ELFO::Elf_Shdr Elf_Shdr;
133cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  typedef typename ELFO::Elf_Sym Elf_Sym;
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Sym_Range Elf_Sym_Range;
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Dyn Elf_Dyn;
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;
137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Rel Elf_Rel;
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Rela Elf_Rela;
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Rel_Range Elf_Rel_Range;
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range;
141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Phdr Elf_Phdr;
142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Half Elf_Half;
143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Hash Elf_Hash;
144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_GnuHash Elf_GnuHash;
145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Ehdr Elf_Ehdr;
146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Word Elf_Word;
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::uintX_t uintX_t;
148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Versym Elf_Versym;
149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Verneed Elf_Verneed;
150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Vernaux Elf_Vernaux;
151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Verdef Elf_Verdef;
152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Verdaux Elf_Verdaux;
153f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo checkDRI(DynRegionInfo DRI) {
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (DRI.Addr < Obj->base() ||
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        (const uint8_t *)DRI.Addr + DRI.Size > Obj->base() + Obj->getBufSize())
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      error(llvm::object::object_error::parse_failed);
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DRI;
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo createDRIFrom(const Elf_Phdr *P, uintX_t EntSize) {
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return checkDRI({Obj->base() + P->p_offset, P->p_filesz, EntSize});
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
164f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo createDRIFrom(const Elf_Shdr *S) {
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return checkDRI({Obj->base() + S->sh_offset, S->sh_size, S->sh_entsize});
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void parseDynamicTable(ArrayRef<const Elf_Phdr *> LoadSegments);
17076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printValue(uint64_t Type, uint64_t Value);
172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
173f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef getDynamicString(uint64_t Offset) const;
174f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef getSymbolVersion(StringRef StrTab, const Elf_Sym *symb,
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             bool &IsDefault) const;
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void LoadVersionMap() const;
177f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void LoadVersionNeeds(const Elf_Shdr *ec) const;
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void LoadVersionDefs(const Elf_Shdr *sec) const;
17976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
180cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  const ELFO *Obj;
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo DynRelRegion;
182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DynRegionInfo DynRelaRegion;
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo DynPLTRelRegion;
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo DynSymRegion;
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DynRegionInfo DynamicTable;
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef DynamicStringTable;
187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef SOName;
188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Hash *HashTable = nullptr;
189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_GnuHash *GnuHashTable = nullptr;
190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *DotSymtabSec = nullptr;
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef DynSymtabName;
192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ArrayRef<Elf_Word> ShndxTable;
193f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
194f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *dot_gnu_version_sec = nullptr;   // .gnu.version
195f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *dot_gnu_version_r_sec = nullptr; // .gnu.version_r
196f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *dot_gnu_version_d_sec = nullptr; // .gnu.version_d
197f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
198f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Records for each version index the corresponding Verdef or Vernaux entry.
199f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // This is filled the first time LoadVersionMap() is called.
200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class VersionMapEntry : public PointerIntPair<const void *, 1> {
201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
202f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // If the integer is 0, this is an Elf_Verdef*.
203f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // If the integer is 1, this is an Elf_Vernaux*.
204f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    VersionMapEntry() : PointerIntPair<const void *, 1>(nullptr, 0) {}
205f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    VersionMapEntry(const Elf_Verdef *verdef)
206f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : PointerIntPair<const void *, 1>(verdef, 0) {}
207f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    VersionMapEntry(const Elf_Vernaux *vernaux)
208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : PointerIntPair<const void *, 1>(vernaux, 1) {}
209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool isNull() const { return getPointer() == nullptr; }
210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool isVerdef() const { return !isNull() && getInt() == 0; }
211f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool isVernaux() const { return !isNull() && getInt() == 1; }
212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Verdef *getVerdef() const {
213f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return isVerdef() ? (const Elf_Verdef *)getPointer() : nullptr;
214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Vernaux *getVernaux() const {
216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return isVernaux() ? (const Elf_Vernaux *)getPointer() : nullptr;
217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
218f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
219f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  mutable SmallVector<VersionMapEntry, 16> VersionMap;
220f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Elf_Dyn_Range dynamic_table() const {
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DynamicTable.getAsArrayRef<Elf_Dyn>();
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Elf_Sym_Range dynamic_symbols() const {
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return DynSymRegion.getAsArrayRef<Elf_Sym>();
228f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
229f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Elf_Rel_Range dyn_rels() const;
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Elf_Rela_Range dyn_relas() const;
232f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::string getFullSymbolName(const Elf_Sym *Symbol, StringRef StrTable,
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                bool IsDynamic) const;
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSymbolsHelper(bool IsDynamic) const;
236f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *getDotSymtabSec() const { return DotSymtabSec; }
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<Elf_Word> getShndxTable() const { return ShndxTable; }
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef getDynamicStringTable() const { return DynamicStringTable; }
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &getDynRelRegion() const { return DynRelRegion; }
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &getDynRelaRegion() const { return DynRelaRegion; }
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &getDynPLTRelRegion() const { return DynPLTRelRegion; }
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Hash *getHashTable() const { return HashTable; }
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_GnuHash *getGnuHashTable() const { return GnuHashTable; }
24476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
24576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ELFDumper<ELFT>::printSymbolsHelper(bool IsDynamic) const {
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef StrTable, SymtabName;
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  size_t Entries = 0;
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Elf_Sym_Range Syms(nullptr, nullptr);
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IsDynamic) {
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StrTable = DynamicStringTable;
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Syms = dynamic_symbols();
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymtabName = DynSymtabName;
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (DynSymRegion.Addr)
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Entries = DynSymRegion.Size / DynSymRegion.EntSize;
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!DotSymtabSec)
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec));
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Syms = Obj->symbols(DotSymtabSec);
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymtabName = unwrapOrError(Obj->getSectionName(DotSymtabSec));
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Entries = DotSymtabSec->getEntityCount();
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Syms.begin() == Syms.end())
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printSymtabMessage(Obj, SymtabName, Entries);
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const auto &Sym : Syms)
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ELFDumperStyle->printSymbol(Obj, &Sym, Syms.begin(), StrTable, IsDynamic);
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename ELFT> class DumpStyle {
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  using Elf_Shdr = typename ELFFile<ELFT>::Elf_Shdr;
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  using Elf_Sym =  typename ELFFile<ELFT>::Elf_Sym;
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DumpStyle(ELFDumper<ELFT> *Dumper) : Dumper(Dumper) {}
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual ~DumpStyle() {}
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printFileHeaders(const ELFFile<ELFT> *Obj) = 0;
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printGroupSections(const ELFFile<ELFT> *Obj) = 0;
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printRelocations(const ELFFile<ELFT> *Obj) = 0;
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printSections(const ELFFile<ELFT> *Obj) = 0;
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printSymbols(const ELFFile<ELFT> *Obj) = 0;
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printDynamicSymbols(const ELFFile<ELFT> *Obj) = 0;
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printDynamicRelocations(const ELFFile<ELFT> *Obj) = 0;
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printSymtabMessage(const ELFFile<ELFT> *obj, StringRef Name,
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  size_t Offset) {
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
289081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  }
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printSymbol(const ELFFile<ELFT> *Obj, const Elf_Sym *Symbol,
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           const Elf_Sym *FirstSym, StringRef StrTable,
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           bool IsDynamic) = 0;
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printProgramHeaders(const ELFFile<ELFT> *Obj) = 0;
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printHashHistogram(const ELFFile<ELFT> *Obj) = 0;
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const ELFDumper<ELFT> *dumper() const { return Dumper; }
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const ELFDumper<ELFT> *Dumper;
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename ELFT> class GNUStyle : public DumpStyle<ELFT> {
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  formatted_raw_ostream OS;
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TYPEDEF_ELF_TYPES(ELFT)
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  GNUStyle(ScopedPrinter &W, ELFDumper<ELFT> *Dumper)
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : DumpStyle<ELFT>(Dumper), OS(W.getOStream()) {}
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printFileHeaders(const ELFO *Obj) override;
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printGroupSections(const ELFFile<ELFT> *Obj) override;
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printRelocations(const ELFO *Obj) override;
309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSections(const ELFO *Obj) override;
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSymbols(const ELFO *Obj) override;
311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicSymbols(const ELFO *Obj) override;
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicRelocations(const ELFO *Obj) override;
313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual void printSymtabMessage(const ELFO *Obj, StringRef Name,
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  size_t Offset) override;
315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printProgramHeaders(const ELFO *Obj) override;
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printHashHistogram(const ELFFile<ELFT> *Obj) override;
317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct Field {
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Str;
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Column;
322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Field(StringRef S, unsigned Col) : Str(S), Column(Col) {}
323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Field(unsigned Col) : Str(""), Column(Col) {}
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  template <typename T, typename TEnum>
327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string printEnum(T Value, ArrayRef<EnumEntry<TEnum>> EnumValues) {
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const auto &EnumItem : EnumValues)
329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (EnumItem.Value == Value)
330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return EnumItem.AltName;
331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return to_hexString(Value, false);
332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  formatted_raw_ostream &printField(struct Field F) {
335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (F.Column != 0)
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS.PadToColumn(F.Column);
337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << F.Str;
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.flush();
339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return OS;
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       const Elf_Rela &R, bool IsRela);
343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSymbol(const ELFO *Obj, const Elf_Sym *Symbol, const Elf_Sym *First,
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   StringRef StrTable, bool IsDynamic) override;
345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string getSymbolSectionNdx(const ELFO *Obj, const Elf_Sym *Symbol,
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  const Elf_Sym *FirstSym);
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicRelocation(const ELFO *Obj, Elf_Rela R, bool IsRela);
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool checkTLSSections(const Elf_Phdr &Phdr, const Elf_Shdr &Sec);
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool checkoffsets(const Elf_Phdr &Phdr, const Elf_Shdr &Sec);
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool checkVMA(const Elf_Phdr &Phdr, const Elf_Shdr &Sec);
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool checkPTDynamic(const Elf_Phdr &Phdr, const Elf_Shdr &Sec);
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename ELFT> class LLVMStyle : public DumpStyle<ELFT> {
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TYPEDEF_ELF_TYPES(ELFT)
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVMStyle(ScopedPrinter &W, ELFDumper<ELFT> *Dumper)
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : DumpStyle<ELFT>(Dumper), W(W) {}
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printFileHeaders(const ELFO *Obj) override;
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printGroupSections(const ELFFile<ELFT> *Obj) override;
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printRelocations(const ELFO *Obj) override;
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printRelocations(const Elf_Shdr *Sec, const ELFO *Obj);
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSections(const ELFO *Obj) override;
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSymbols(const ELFO *Obj) override;
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicSymbols(const ELFO *Obj) override;
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicRelocations(const ELFO *Obj) override;
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printProgramHeaders(const ELFO *Obj) override;
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printHashHistogram(const ELFFile<ELFT> *Obj) override;
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printRelocation(const ELFO *Obj, Elf_Rela Rel, const Elf_Shdr *SymTab);
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printDynamicRelocation(const ELFO *Obj, Elf_Rela Rel);
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printSymbol(const ELFO *Obj, const Elf_Sym *Symbol, const Elf_Sym *First,
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   StringRef StrTable, bool IsDynamic) override;
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopedPrinter &W;
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
37876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
379081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer} // namespace
38076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
38176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace llvm {
38276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
383bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatemplate <class ELFT>
384c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstatic std::error_code createELFDumper(const ELFFile<ELFT> *Obj,
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ScopedPrinter &Writer,
386c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                       std::unique_ptr<ObjDumper> &Result) {
387bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  Result.reset(new ELFDumper<ELFT>(Obj, Writer));
388bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  return readobj_error::success;
389bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola}
390bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola
391c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstd::error_code createELFDumper(const object::ObjectFile *Obj,
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                ScopedPrinter &Writer,
393c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                std::unique_ptr<ObjDumper> &Result) {
39476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Little-endian 32-bit
395bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
396081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    return createELFDumper(ELFObj->getELFFile(), Writer, Result);
39776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
39876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Big-endian 32-bit
399bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
400081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    return createELFDumper(ELFObj->getELFFile(), Writer, Result);
40176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
40276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Little-endian 64-bit
403bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
404081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    return createELFDumper(ELFObj->getELFFile(), Writer, Result);
40576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
40676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Big-endian 64-bit
407bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
408081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    return createELFDumper(ELFObj->getELFFile(), Writer, Result);
40976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
41076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  return readobj_error::unsupported_obj_file_format;
41176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
41276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
41376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace llvm
41476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// Iterate through the versions needed section, and place each Elf_Vernaux
416f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// in the VersionMap according to its index.
417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT>
418f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ELFDumper<ELFT>::LoadVersionNeeds(const Elf_Shdr *sec) const {
419f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned vn_size = sec->sh_size;  // Size of section in bytes
420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned vn_count = sec->sh_info; // Number of Verneed entries
421f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *sec_start = (const char *)Obj->base() + sec->sh_offset;
422f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *sec_end = sec_start + vn_size;
423f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // The first Verneed entry is at the start of the section.
424f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *p = sec_start;
425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (unsigned i = 0; i < vn_count; i++) {
426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (p + sizeof(Elf_Verneed) > sec_end)
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Section ended unexpectedly while scanning "
428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         "version needed records.");
429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Verneed *vn = reinterpret_cast<const Elf_Verneed *>(p);
430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (vn->vn_version != ELF::VER_NEED_CURRENT)
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Unexpected verneed version");
432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Iterate through the Vernaux entries
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const char *paux = p + vn->vn_aux;
434f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (unsigned j = 0; j < vn->vn_cnt; j++) {
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (paux + sizeof(Elf_Vernaux) > sec_end)
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        report_fatal_error("Section ended unexpected while scanning auxiliary "
437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           "version needed records.");
438f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      const Elf_Vernaux *vna = reinterpret_cast<const Elf_Vernaux *>(paux);
439f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      size_t index = vna->vna_other & ELF::VERSYM_VERSION;
440f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (index >= VersionMap.size())
441f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        VersionMap.resize(index + 1);
442f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      VersionMap[index] = VersionMapEntry(vna);
443f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      paux += vna->vna_next;
444f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
445f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    p += vn->vn_next;
446f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// Iterate through the version definitions, and place each Elf_Verdef
450f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// in the VersionMap according to its index.
451f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT>
452f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ELFDumper<ELFT>::LoadVersionDefs(const Elf_Shdr *sec) const {
453f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned vd_size = sec->sh_size;  // Size of section in bytes
454f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned vd_count = sec->sh_info; // Number of Verdef entries
455f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *sec_start = (const char *)Obj->base() + sec->sh_offset;
456f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *sec_end = sec_start + vd_size;
457f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // The first Verdef entry is at the start of the section.
458f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *p = sec_start;
459f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (unsigned i = 0; i < vd_count; i++) {
460f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (p + sizeof(Elf_Verdef) > sec_end)
461f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Section ended unexpectedly while scanning "
462f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         "version definitions.");
463f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Verdef *vd = reinterpret_cast<const Elf_Verdef *>(p);
464f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (vd->vd_version != ELF::VER_DEF_CURRENT)
465f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Unexpected verdef version");
466f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    size_t index = vd->vd_ndx & ELF::VERSYM_VERSION;
467f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (index >= VersionMap.size())
468f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      VersionMap.resize(index + 1);
469f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    VersionMap[index] = VersionMapEntry(vd);
470f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    p += vd->vd_next;
471f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
472f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
473f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::LoadVersionMap() const {
475f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // If there is no dynamic symtab or version table, there is nothing to do.
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!DynSymRegion.Addr || !dot_gnu_version_sec)
477f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
478f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
479f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Has the VersionMap already been loaded?
480f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (VersionMap.size() > 0)
481f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
482f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
483f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // The first two version indexes are reserved.
484f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Index 0 is LOCAL, index 1 is GLOBAL.
485f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  VersionMap.push_back(VersionMapEntry());
486f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  VersionMap.push_back(VersionMapEntry());
487f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
488f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (dot_gnu_version_d_sec)
489f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LoadVersionDefs(dot_gnu_version_d_sec);
490f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
491f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (dot_gnu_version_r_sec)
492f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LoadVersionNeeds(dot_gnu_version_r_sec);
493f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
494f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
495f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFO, class ELFT>
496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void printVersionSymbolSection(ELFDumper<ELFT> *Dumper, const ELFO *Obj,
497f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                      const typename ELFO::Elf_Shdr *Sec,
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      ScopedPrinter &W) {
499f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope SS(W, "Version symbols");
500f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Sec)
501f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
503f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Section Name", Name, Sec->sh_name);
504f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Address", Sec->sh_addr);
505f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Offset", Sec->sh_offset);
506f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Link", Sec->sh_link);
507f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
508f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const uint8_t *P = (const uint8_t *)Obj->base() + Sec->sh_offset;
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef StrTable = Dumper->getDynamicStringTable();
510f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
511f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Same number of entries in the dynamic symbol table (DT_SYMTAB).
512f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ListScope Syms(W, "Symbols");
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const typename ELFO::Elf_Sym &Sym : Dumper->dynamic_symbols()) {
514f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    DictScope S(W, "Symbol");
515f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    std::string FullSymbolName =
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Dumper->getFullSymbolName(&Sym, StrTable, true /* IsDynamic */);
517f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.printNumber("Version", *P);
518f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.printString("Name", FullSymbolName);
519f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    P += sizeof(typename ELFO::Elf_Half);
520f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
521f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
522f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> SymVersionFlags[] = {
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Base", "BASE", VER_FLG_BASE},
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Weak", "WEAK", VER_FLG_WEAK},
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Info", "INFO", VER_FLG_INFO}};
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
528f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFO, class ELFT>
529f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic void printVersionDefinitionSection(ELFDumper<ELFT> *Dumper,
530f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const ELFO *Obj,
531f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const typename ELFO::Elf_Shdr *Sec,
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ScopedPrinter &W) {
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Verdef VerDef;
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Verdaux VerdAux;
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope SD(W, "SHT_GNU_verdef");
537f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Sec)
538f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
539f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
540f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // The number of entries in the section SHT_GNU_verdef
541f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // is determined by DT_VERDEFNUM tag.
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned VerDefsNum = 0;
543f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const typename ELFO::Elf_Dyn &Dyn : Dumper->dynamic_table()) {
544f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Dyn.d_tag == DT_VERDEFNUM)
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      VerDefsNum = Dyn.d_un.d_val;
546f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
547f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const uint8_t *SecStartAddress =
548f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      (const uint8_t *)Obj->base() + Sec->sh_offset;
549f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const uint8_t *SecEndAddress = SecStartAddress + Sec->sh_size;
550f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const uint8_t *P = SecStartAddress;
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const typename ELFO::Elf_Shdr *StrTab =
552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Obj->getSection(Sec->sh_link));
553f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  while (VerDefsNum--) {
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (P + sizeof(VerDef) > SecEndAddress)
556f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("invalid offset in the section");
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto *VD = reinterpret_cast<const VerDef *>(P);
559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope Def(W, "Definition");
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Version", VD->vd_version);
561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printEnum("Flags", VD->vd_flags, makeArrayRef(SymVersionFlags));
562f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.printNumber("Index", VD->vd_ndx);
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Hash", VD->vd_hash);
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("Name",
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  StringRef((const char *)(Obj->base() + StrTab->sh_offset +
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           VD->getAux()->vda_name)));
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!VD->vd_cnt)
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      report_fatal_error("at least one definition string must exist");
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (VD->vd_cnt > 2)
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      report_fatal_error("more than one predecessor is not expected");
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (VD->vd_cnt == 2) {
573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const uint8_t *PAux = P + VD->vd_aux + VD->getAux()->vda_next;
574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const VerdAux *Aux = reinterpret_cast<const VerdAux *>(PAux);
575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printString("Predecessor",
576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    StringRef((const char *)(Obj->base() + StrTab->sh_offset +
577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             Aux->vda_name)));
578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
580f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    P += VD->vd_next;
581f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
582f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
583f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename ELFO, class ELFT>
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void printVersionDependencySection(ELFDumper<ELFT> *Dumper,
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          const ELFO *Obj,
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          const typename ELFO::Elf_Shdr *Sec,
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ScopedPrinter &W) {
589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Verneed VerNeed;
590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef typename ELFO::Elf_Vernaux VernAux;
591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope SD(W, "SHT_GNU_verneed");
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Sec)
594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned VerNeedNum = 0;
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const typename ELFO::Elf_Dyn &Dyn : Dumper->dynamic_table())
598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Dyn.d_tag == DT_VERNEEDNUM)
599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      VerNeedNum = Dyn.d_un.d_val;
600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const uint8_t *SecData = (const uint8_t *)Obj->base() + Sec->sh_offset;
602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const typename ELFO::Elf_Shdr *StrTab =
603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Obj->getSection(Sec->sh_link));
604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const uint8_t *P = SecData;
606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (unsigned I = 0; I < VerNeedNum; ++I) {
607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const VerNeed *Need = reinterpret_cast<const VerNeed *>(P);
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope Entry(W, "Dependency");
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Version", Need->vn_version);
610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Count", Need->vn_cnt);
611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("FileName",
612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  StringRef((const char *)(Obj->base() + StrTab->sh_offset +
613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           Need->vn_file)));
614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const uint8_t *PAux = P + Need->vn_aux;
616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (unsigned J = 0; J < Need->vn_cnt; ++J) {
617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const VernAux *Aux = reinterpret_cast<const VernAux *>(PAux);
618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DictScope Entry(W, "Entry");
619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("Hash", Aux->vna_hash);
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printEnum("Flags", Aux->vna_flags, makeArrayRef(SymVersionFlags));
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("Index", Aux->vna_other);
622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printString("Name",
623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    StringRef((const char *)(Obj->base() + StrTab->sh_offset +
624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             Aux->vna_name)));
625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      PAux += Aux->vna_next;
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    P += Need->vn_next;
628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
631f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT> void ELFDumper<ELFT>::printVersionInfo() {
632f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Dump version symbol section.
633f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  printVersionSymbolSection(this, Obj, dot_gnu_version_sec, W);
634f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
635f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Dump version definition section.
636f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  printVersionDefinitionSection(this, Obj, dot_gnu_version_d_sec, W);
637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Dump version dependency section.
639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printVersionDependencySection(this, Obj, dot_gnu_version_r_sec, W);
640f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
641f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
642f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
643f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarStringRef ELFDumper<ELFT>::getSymbolVersion(StringRef StrTab,
644f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                            const Elf_Sym *symb,
645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            bool &IsDefault) const {
646f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // This is a dynamic symbol. Look in the GNU symbol version table.
647f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!dot_gnu_version_sec) {
648f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // No version table.
649f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    IsDefault = false;
650f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return StringRef("");
651f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
652f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
653f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Determine the position in the symbol table of this entry.
654f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  size_t entry_index = (reinterpret_cast<uintptr_t>(symb) -
655de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                        reinterpret_cast<uintptr_t>(DynSymRegion.Addr)) /
656f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                       sizeof(Elf_Sym);
657f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
658f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Get the corresponding version index entry
659f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Versym *vs =
660f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Obj->template getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index);
661f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  size_t version_index = vs->vs_index & ELF::VERSYM_VERSION;
662f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
663f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Special markers for unversioned symbols.
664f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (version_index == ELF::VER_NDX_LOCAL ||
665f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      version_index == ELF::VER_NDX_GLOBAL) {
666f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    IsDefault = false;
667f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return StringRef("");
668f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
669f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
670f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Lookup this symbol in the version table
671f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LoadVersionMap();
672f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (version_index >= VersionMap.size() || VersionMap[version_index].isNull())
673f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    reportError("Invalid version entry");
674f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const VersionMapEntry &entry = VersionMap[version_index];
675f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
676f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Get the version name string
677f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  size_t name_offset;
678f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (entry.isVerdef()) {
679f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // The first Verdaux entry holds the name.
680f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    name_offset = entry.getVerdef()->getAux()->vda_name;
681f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    IsDefault = !(vs->vs_index & ELF::VERSYM_HIDDEN);
682f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  } else {
683f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    name_offset = entry.getVernaux()->vna_name;
684f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    IsDefault = false;
685f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
686f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (name_offset >= StrTab.size())
687f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    reportError("Invalid string offset");
688f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return StringRef(StrTab.data() + name_offset);
689f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
690f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
691f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
692f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstd::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,
693f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                               StringRef StrTable,
694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               bool IsDynamic) const {
695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef SymbolName = unwrapOrError(Symbol->getName(StrTable));
696f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!IsDynamic)
697c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return SymbolName;
698c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
699c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::string FullSymbolName(SymbolName);
700c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
701c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool IsDefault;
702f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef Version = getSymbolVersion(StrTable, &*Symbol, IsDefault);
703f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FullSymbolName += (IsDefault ? "@@" : "@");
704f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FullSymbolName += Version;
705c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return FullSymbolName;
706c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
707c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
708c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <typename ELFO>
709c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstatic void
710f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainargetSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol,
711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    const typename ELFO::Elf_Sym *FirstSym,
712f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                    ArrayRef<typename ELFO::Elf_Word> ShndxTable,
713c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                    StringRef &SectionName, unsigned &SectionIndex) {
714c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SectionIndex = Symbol->st_shndx;
7156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Symbol->isUndefined())
716c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    SectionName = "Undefined";
7176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Symbol->isProcessorSpecific())
718c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    SectionName = "Processor Specific";
7196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Symbol->isOSSpecific())
720c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    SectionName = "Operating System Specific";
7216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Symbol->isAbsolute())
722c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    SectionName = "Absolute";
7236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Symbol->isCommon())
724c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    SectionName = "Common";
7256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Symbol->isReserved() && SectionIndex != SHN_XINDEX)
7266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    SectionName = "Reserved";
7276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else {
728c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (SectionIndex == SHN_XINDEX)
729f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      SectionIndex =
730de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Obj.getExtendedSymbolTableIndex(Symbol, FirstSym, ShndxTable);
731de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const typename ELFO::Elf_Shdr *Sec =
732de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        unwrapOrError(Obj.getSection(SectionIndex));
733de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SectionName = unwrapOrError(Obj.getSectionName(Sec));
734c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
735c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
736c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
737f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFO>
738de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const typename ELFO::Elf_Shdr *
739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarfindNotEmptySectionByAddress(const ELFO *Obj, uint64_t Addr) {
740c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  for (const auto &Shdr : Obj->sections())
741de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Shdr.sh_addr == Addr && Shdr.sh_size > 0)
742c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      return &Shdr;
743c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return nullptr;
744c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
745c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
746f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFO>
747f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic const typename ELFO::Elf_Shdr *findSectionByName(const ELFO &Obj,
748f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                                        StringRef Name) {
7496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (const auto &Shdr : Obj.sections()) {
750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Name == unwrapOrError(Obj.getSectionName(&Shdr)))
7516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return &Shdr;
7526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
7536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return nullptr;
7546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
7556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
75676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfClass[] = {
757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"None",   "none",   ELF::ELFCLASSNONE},
758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"32-bit", "ELF32",  ELF::ELFCLASS32},
759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"64-bit", "ELF64",  ELF::ELFCLASS64},
76076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
76176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
76276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfDataEncoding[] = {
763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"None",         "none",                          ELF::ELFDATANONE},
764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"LittleEndian", "2's complement, little endian", ELF::ELFDATA2LSB},
765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"BigEndian",    "2's complement, big endian",    ELF::ELFDATA2MSB},
76676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
76776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
76876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfObjectFileType[] = {
769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"None",         "NONE (none)",              ELF::ET_NONE},
770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Relocatable",  "REL (Relocatable file)",   ELF::ET_REL},
771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Executable",   "EXEC (Executable file)",   ELF::ET_EXEC},
772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"SharedObject", "DYN (Shared object file)", ELF::ET_DYN},
773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Core",         "CORE (Core file)",         ELF::ET_CORE},
77476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
77576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
77676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfOSABI[] = {
777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"SystemV",      "UNIX - System V",      ELF::ELFOSABI_NONE},
778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"HPUX",         "UNIX - HP-UX",         ELF::ELFOSABI_HPUX},
779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"NetBSD",       "UNIX - NetBSD",        ELF::ELFOSABI_NETBSD},
780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"GNU/Linux",    "UNIX - GNU",           ELF::ELFOSABI_LINUX},
781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"GNU/Hurd",     "GNU/Hurd",             ELF::ELFOSABI_HURD},
782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Solaris",      "UNIX - Solaris",       ELF::ELFOSABI_SOLARIS},
783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"AIX",          "UNIX - AIX",           ELF::ELFOSABI_AIX},
784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"IRIX",         "UNIX - IRIX",          ELF::ELFOSABI_IRIX},
785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"FreeBSD",      "UNIX - FreeBSD",       ELF::ELFOSABI_FREEBSD},
786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"TRU64",        "UNIX - TRU64",         ELF::ELFOSABI_TRU64},
787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Modesto",      "Novell - Modesto",     ELF::ELFOSABI_MODESTO},
788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"OpenBSD",      "UNIX - OpenBSD",       ELF::ELFOSABI_OPENBSD},
789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"OpenVMS",      "VMS - OpenVMS",        ELF::ELFOSABI_OPENVMS},
790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"NSK",          "HP - Non-Stop Kernel", ELF::ELFOSABI_NSK},
791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"AROS",         "AROS",                 ELF::ELFOSABI_AROS},
792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"FenixOS",      "FenixOS",              ELF::ELFOSABI_FENIXOS},
793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"CloudABI",     "CloudABI",             ELF::ELFOSABI_CLOUDABI},
794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"C6000_ELFABI", "Bare-metal C6000",     ELF::ELFOSABI_C6000_ELFABI},
795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"C6000_LINUX",  "Linux C6000",          ELF::ELFOSABI_C6000_LINUX},
796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"ARM",          "ARM",                  ELF::ELFOSABI_ARM},
797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {"Standalone",   "Standalone App",       ELF::ELFOSABI_STANDALONE}
79876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
79976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
80076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfMachineType[] = {
801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_NONE,          "None"),
802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_M32,           "WE32100"),
803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SPARC,         "Sparc"),
804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_386,           "Intel 80386"),
805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68K,           "MC68000"),
806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_88K,           "MC88000"),
807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_IAMCU,         "EM_IAMCU"),
808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_860,           "Intel 80860"),
809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MIPS,          "MIPS R3000"),
810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_S370,          "IBM System/370"),
811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MIPS_RS3_LE,   "MIPS R3000 little-endian"),
812de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PARISC,        "HPPA"),
813de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_VPP500,        "Fujitsu VPP500"),
814de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SPARC32PLUS,   "Sparc v8+"),
815de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_960,           "Intel 80960"),
816de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PPC,           "PowerPC"),
817de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PPC64,         "PowerPC64"),
818de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_S390,          "IBM S/390"),
819de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SPU,           "SPU"),
820de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_V800,          "NEC V800 series"),
821de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_FR20,          "Fujistsu FR20"),
822de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_RH32,          "TRW RH-32"),
823de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_RCE,           "Motorola RCE"),
824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ARM,           "ARM"),
825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ALPHA,         "EM_ALPHA"),
826de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SH,            "Hitachi SH"),
827de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SPARCV9,       "Sparc v9"),
828de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TRICORE,       "Siemens Tricore"),
829de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ARC,           "ARC"),
830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_H8_300,        "Hitachi H8/300"),
831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_H8_300H,       "Hitachi H8/300H"),
832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_H8S,           "Hitachi H8S"),
833de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_H8_500,        "Hitachi H8/500"),
834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_IA_64,         "Intel IA-64"),
835de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MIPS_X,        "Stanford MIPS-X"),
836de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_COLDFIRE,      "Motorola Coldfire"),
837de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68HC12,        "Motorola MC68HC12 Microcontroller"),
838de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MMA,           "Fujitsu Multimedia Accelerator"),
839de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PCP,           "Siemens PCP"),
840de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_NCPU,          "Sony nCPU embedded RISC processor"),
841de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_NDR1,          "Denso NDR1 microprocesspr"),
842de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_STARCORE,      "Motorola Star*Core processor"),
843de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ME16,          "Toyota ME16 processor"),
844de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ST100,         "STMicroelectronics ST100 processor"),
845de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TINYJ,         "Advanced Logic Corp. TinyJ embedded processor"),
846de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_X86_64,        "Advanced Micro Devices X86-64"),
847de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PDSP,          "Sony DSP processor"),
848de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PDP10,         "Digital Equipment Corp. PDP-10"),
849de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PDP11,         "Digital Equipment Corp. PDP-11"),
850de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_FX66,          "Siemens FX66 microcontroller"),
851de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ST9PLUS,       "STMicroelectronics ST9+ 8/16 bit microcontroller"),
852de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ST7,           "STMicroelectronics ST7 8-bit microcontroller"),
853de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68HC16,        "Motorola MC68HC16 Microcontroller"),
854de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68HC11,        "Motorola MC68HC11 Microcontroller"),
855de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68HC08,        "Motorola MC68HC08 Microcontroller"),
856de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_68HC05,        "Motorola MC68HC05 Microcontroller"),
857de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SVX,           "Silicon Graphics SVx"),
858de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ST19,          "STMicroelectronics ST19 8-bit microcontroller"),
859de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_VAX,           "Digital VAX"),
860de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CRIS,          "Axis Communications 32-bit embedded processor"),
861de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_JAVELIN,       "Infineon Technologies 32-bit embedded cpu"),
862de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_FIREPATH,      "Element 14 64-bit DSP processor"),
863de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ZSP,           "LSI Logic's 16-bit DSP processor"),
864de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MMIX,          "Donald Knuth's educational 64-bit processor"),
865de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_HUANY,         "Harvard Universitys's machine-independent object format"),
866de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PRISM,         "Vitesse Prism"),
867de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_AVR,           "Atmel AVR 8-bit microcontroller"),
868de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_FR30,          "Fujitsu FR30"),
869de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_D10V,          "Mitsubishi D10V"),
870de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_D30V,          "Mitsubishi D30V"),
871de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_V850,          "NEC v850"),
872de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_M32R,          "Renesas M32R (formerly Mitsubishi M32r)"),
873de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MN10300,       "Matsushita MN10300"),
874de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MN10200,       "Matsushita MN10200"),
875de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_PJ,            "picoJava"),
876de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_OPENRISC,      "OpenRISC 32-bit embedded processor"),
877de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ARC_COMPACT,   "EM_ARC_COMPACT"),
878de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_XTENSA,        "Tensilica Xtensa Processor"),
879de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_VIDEOCORE,     "Alphamosaic VideoCore processor"),
880de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TMM_GPP,       "Thompson Multimedia General Purpose Processor"),
881de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_NS32K,         "National Semiconductor 32000 series"),
882de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TPC,           "Tenor Network TPC processor"),
883de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SNP1K,         "EM_SNP1K"),
884de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ST200,         "STMicroelectronics ST200 microcontroller"),
885de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_IP2K,          "Ubicom IP2xxx 8-bit microcontrollers"),
886de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MAX,           "MAX Processor"),
887de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CR,            "National Semiconductor CompactRISC"),
888de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_F2MC16,        "Fujitsu F2MC16"),
889de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MSP430,        "Texas Instruments msp430 microcontroller"),
890de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_BLACKFIN,      "Analog Devices Blackfin"),
891de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SE_C33,        "S1C33 Family of Seiko Epson processors"),
892de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SEP,           "Sharp embedded microprocessor"),
893de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ARCA,          "Arca RISC microprocessor"),
894de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_UNICORE,       "Unicore"),
895de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_EXCESS,        "eXcess 16/32/64-bit configurable embedded CPU"),
896de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_DXP,           "Icera Semiconductor Inc. Deep Execution Processor"),
897de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ALTERA_NIOS2,  "Altera Nios"),
898de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CRX,           "National Semiconductor CRX microprocessor"),
899de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_XGATE,         "Motorola XGATE embedded processor"),
900de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_C166,          "Infineon Technologies xc16x"),
901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_M16C,          "Renesas M16C"),
902de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_DSPIC30F,      "Microchip Technology dsPIC30F Digital Signal Controller"),
903de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CE,            "Freescale Communication Engine RISC core"),
904de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_M32C,          "Renesas M32C"),
905de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TSK3000,       "Altium TSK3000 core"),
906de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_RS08,          "Freescale RS08 embedded processor"),
907de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SHARC,         "EM_SHARC"),
908de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ECOG2,         "Cyan Technology eCOG2 microprocessor"),
909de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SCORE7,        "SUNPLUS S+Core"),
910de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_DSP24,         "New Japan Radio (NJR) 24-bit DSP Processor"),
911de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_VIDEOCORE3,    "Broadcom VideoCore III processor"),
912de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_LATTICEMICO32, "Lattice Mico32"),
913de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SE_C17,        "Seiko Epson C17 family"),
914de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TI_C6000,      "Texas Instruments TMS320C6000 DSP family"),
915de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TI_C2000,      "Texas Instruments TMS320C2000 DSP family"),
916de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TI_C5500,      "Texas Instruments TMS320C55x DSP family"),
917de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MMDSP_PLUS,    "STMicroelectronics 64bit VLIW Data Signal Processor"),
918de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CYPRESS_M8C,   "Cypress M8C microprocessor"),
919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_R32C,          "Renesas R32C series microprocessors"),
920de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TRIMEDIA,      "NXP Semiconductors TriMedia architecture family"),
921de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_HEXAGON,       "Qualcomm Hexagon"),
922de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_8051,          "Intel 8051 and variants"),
923de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_STXP7X,        "STMicroelectronics STxP7x family"),
924de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_NDS32,         "Andes Technology compact code size embedded RISC processor family"),
925de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ECOG1,         "Cyan Technology eCOG1 microprocessor"),
926de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ECOG1X,        "Cyan Technology eCOG1X family"),
927de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MAXQ30,        "Dallas Semiconductor MAXQ30 Core microcontrollers"),
928de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_XIMO16,        "New Japan Radio (NJR) 16-bit DSP Processor"),
929de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MANIK,         "M2000 Reconfigurable RISC Microprocessor"),
930de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CRAYNV2,       "Cray Inc. NV2 vector architecture"),
931de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_RX,            "Renesas RX"),
932de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_METAG,         "Imagination Technologies Meta processor architecture"),
933de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_MCST_ELBRUS,   "MCST Elbrus general purpose hardware architecture"),
934de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ECOG16,        "Cyan Technology eCOG16 family"),
935de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CR16,          "Xilinx MicroBlaze"),
936de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ETPU,          "Freescale Extended Time Processing Unit"),
937de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_SLE9X,         "Infineon Technologies SLE9X core"),
938de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_L10M,          "EM_L10M"),
939de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_K10M,          "EM_K10M"),
940de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_AARCH64,       "AArch64"),
941de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_AVR32,         "Atmel AVR 8-bit microcontroller"),
942de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_STM8,          "STMicroeletronics STM8 8-bit microcontroller"),
943de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TILE64,        "Tilera TILE64 multicore architecture family"),
944de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TILEPRO,       "Tilera TILEPro multicore architecture family"),
945de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CUDA,          "NVIDIA CUDA architecture"),
946de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_TILEGX,        "Tilera TILE-Gx multicore architecture family"),
947de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_CLOUDSHIELD,   "EM_CLOUDSHIELD"),
948de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_COREA_1ST,     "EM_COREA_1ST"),
949de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_COREA_2ND,     "EM_COREA_2ND"),
950de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_ARC_COMPACT2,  "EM_ARC_COMPACT2"),
951de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_OPEN8,         "EM_OPEN8"),
952de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_RL78,          "Renesas RL78"),
953de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_VIDEOCORE5,    "Broadcom VideoCore V processor"),
954de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_78KOR,         "EM_78KOR"),
955de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_56800EX,       "EM_56800EX"),
956de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_AMDGPU,        "EM_AMDGPU"),
957de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_WEBASSEMBLY,   "EM_WEBASSEMBLY"),
958de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(EM_LANAI,         "EM_LANAI"),
95976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
96076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
96176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolBindings[] = {
962de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Local",  "LOCAL",  ELF::STB_LOCAL},
963de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Global", "GLOBAL", ELF::STB_GLOBAL},
964de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Weak",   "WEAK",   ELF::STB_WEAK},
965de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Unique", "UNIQUE", ELF::STB_GNU_UNIQUE}};
966de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
967de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfSymbolVisibilities[] = {
968de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"DEFAULT",   "DEFAULT",   ELF::STV_DEFAULT},
969de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"INTERNAL",  "INTERNAL",  ELF::STV_INTERNAL},
970de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"HIDDEN",    "HIDDEN",    ELF::STV_HIDDEN},
971de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"PROTECTED", "PROTECTED", ELF::STV_PROTECTED}};
97276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
97376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolTypes[] = {
974de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"None",      "NOTYPE",  ELF::STT_NOTYPE},
975de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Object",    "OBJECT",  ELF::STT_OBJECT},
976de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Function",  "FUNC",    ELF::STT_FUNC},
977de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Section",   "SECTION", ELF::STT_SECTION},
978de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"File",      "FILE",    ELF::STT_FILE},
979de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"Common",    "COMMON",  ELF::STT_COMMON},
980de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"TLS",       "TLS",     ELF::STT_TLS},
981de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {"GNU_IFunc", "IFUNC",   ELF::STT_GNU_IFUNC}};
98276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
983f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic const EnumEntry<unsigned> AMDGPUSymbolTypes[] = {
984f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  { "AMDGPU_HSA_KERNEL",            ELF::STT_AMDGPU_HSA_KERNEL },
985f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  { "AMDGPU_HSA_INDIRECT_FUNCTION", ELF::STT_AMDGPU_HSA_INDIRECT_FUNCTION },
986f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  { "AMDGPU_HSA_METADATA",          ELF::STT_AMDGPU_HSA_METADATA }
987f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
988f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
98976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getElfSectionType(unsigned Arch, unsigned Type) {
99076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Arch) {
991081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  case ELF::EM_ARM:
99276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
99376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX);
99476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
99576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
99676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
99776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
99876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
999081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  case ELF::EM_HEXAGON:
1000081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
1001081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  case ELF::EM_X86_64:
1002081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer    switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
1003081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  case ELF::EM_MIPS:
1004081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  case ELF::EM_MIPS_RS3_LE:
100576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
100676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
100776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
100837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
100976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
101076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
101176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
101276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
101376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL              );
101476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS          );
101576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB            );
101676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB            );
101776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA              );
101876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH              );
101976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC           );
102076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE              );
102176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS            );
102276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL               );
102376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB             );
102476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM            );
102576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY        );
102676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY        );
102776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY     );
102876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP             );
102976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX      );
103076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES    );
103176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH          );
103276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef        );
103376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed       );
103476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym        );
103576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  default: return "";
103676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
103776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
103876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1039de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const char *getGroupType(uint32_t Flag) {
1040de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Flag & ELF::GRP_COMDAT)
1041de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "COMDAT";
1042de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
1043de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "(unknown)";
1044de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1045de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
104676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSectionFlags[] = {
1047de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_WRITE,            "W"),
1048de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_ALLOC,            "A"),
1049de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_EXCLUDE,          "E"),
1050de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_EXECINSTR,        "X"),
1051de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_MERGE,            "M"),
1052de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_STRINGS,          "S"),
1053de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_INFO_LINK,        "I"),
1054de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_LINK_ORDER,       "L"),
1055de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_OS_NONCONFORMING, "o"),
1056de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_GROUP,            "G"),
1057de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_TLS,              "T"),
1058de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_MASKOS,           "o"),
1059de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT(SHF_MASKPROC,         "p"),
1060de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ENUM_ENT_1(SHF_COMPRESSED),
1061de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1062de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1063de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfXCoreSectionFlags[] = {
106476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
1065de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION)
1066de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1067de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1068de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfAMDGPUSectionFlags[] = {
1069f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_GLOBAL),
1070f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_READONLY),
1071f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_CODE),
1072f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_AGENT)
107376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
107476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1075de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfHexagonSectionFlags[] = {
1076de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_HEX_GPREL)
1077de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1078de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1079de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsSectionFlags[] = {
1080de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NODUPES),
1081de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NAMES  ),
1082de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_LOCAL  ),
1083de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP),
1084de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_GPREL  ),
1085de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_MERGE  ),
1086de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_ADDR   ),
1087de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_STRING )
1088de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1089de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1090de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfX86_64SectionFlags[] = {
1091de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE)
1092de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1093de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1094de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic std::string getGNUFlags(uint64_t Flags) {
1095de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Str;
1096de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto Entry : ElfSectionFlags) {
1097de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint64_t Flag = Entry.Value & Flags;
1098de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Flags &= ~Entry.Value;
1099de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Flag) {
1100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_WRITE:
1101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_ALLOC:
1102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_EXECINSTR:
1103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_MERGE:
1104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_STRINGS:
1105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_INFO_LINK:
1106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_LINK_ORDER:
1107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_OS_NONCONFORMING:
1108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_GROUP:
1109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_TLS:
1110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHF_EXCLUDE:
1111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Str += Entry.AltName;
1112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
1114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (Flag & ELF::SHF_MASKOS)
1115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Str += "o";
1116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else if (Flag & ELF::SHF_MASKPROC)
1117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Str += "p";
1118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else if (Flag)
1119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Str += "x";
1120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
1121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Str;
1123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1125c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyanstatic const char *getElfSegmentType(unsigned Arch, unsigned Type) {
1126c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  // Check potentially overlapped processor-specific
1127c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  // program header type.
1128c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  switch (Arch) {
1129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  case ELF::EM_AMDGPU:
1130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    switch (Type) {
1131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM);
1132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT);
1133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_READONLY_AGENT);
1134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_CODE_AGENT);
1135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
1136c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  case ELF::EM_ARM:
1137c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    switch (Type) {
1138c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX);
1139c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    }
1140c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  case ELF::EM_MIPS:
1141c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  case ELF::EM_MIPS_RS3_LE:
1142c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    switch (Type) {
1143c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO);
1144c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC);
1145c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS);
11466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_ABIFLAGS);
1147c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan    }
1148c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  }
1149c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan
1150c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  switch (Type) {
1151c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL   );
1152c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD   );
1153c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC);
1154c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP );
1155c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE   );
1156c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB  );
1157c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR   );
1158c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS    );
1159c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan
1160c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME);
1161c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND);
1162c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan
1163c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK);
1164c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO);
1165c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  default: return "";
1166c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan  }
1167c84c742eddc0c57c34271471f332c9857d79e672Simon Atanasyan}
1168cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
1169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic std::string getElfPtType(unsigned Arch, unsigned Type) {
1170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (Type) {
1171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_NULL)
1172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_LOAD)
1173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_DYNAMIC)
1174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_INTERP)
1175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_NOTE)
1176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_SHLIB)
1177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_PHDR)
1178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_TLS)
1179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_GNU_EH_FRAME)
1180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_SUNW_UNWIND)
1181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_GNU_STACK)
1182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVM_READOBJ_PHDR_ENUM(ELF, PT_GNU_RELRO)
1183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  default:
1184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // All machine specific PT_* types
1185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Arch) {
1186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::EM_AMDGPU:
1187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (Type) {
1188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM);
1189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT);
1190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_READONLY_AGENT);
1191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_CODE_AGENT);
1192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
1193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "";
1194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::EM_ARM:
1195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (Type == ELF::PT_ARM_EXIDX)
1196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return "EXIDX";
1197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "";
1198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::EM_MIPS:
1199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::EM_MIPS_RS3_LE:
1200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (Type) {
1201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case PT_MIPS_REGINFO:
1202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return "REGINFO";
1203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case PT_MIPS_RTPROC:
1204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return "RTPROC";
1205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case PT_MIPS_OPTIONS:
1206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return "OPTIONS";
1207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case PT_MIPS_ABIFLAGS:
1208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return "ABIFLAGS";
1209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
1210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "";
1211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
1212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return std::string("<unknown>: ") + to_string(format_hex(Type, 1));
1214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1216cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckstatic const EnumEntry<unsigned> ElfSegmentFlags[] = {
1217cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_X),
1218cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_W),
1219cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_R)
1220cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck};
1221cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
1222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic const EnumEntry<unsigned> ElfHeaderMipsFlags[] = {
1223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NOREORDER),
1224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_PIC),
1225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_CPIC),
1226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI2),
1227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_32BITMODE),
12286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_FP64),
1229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NAN2008),
1230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O32),
12316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O64),
12326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI32),
12336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI64),
12346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_3900),
12356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4010),
12366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4100),
12376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4650),
12386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4120),
12396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4111),
12406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_SB1),
12416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON),
12426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_XLR),
12436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON2),
12446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON3),
12456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5400),
12466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5900),
12476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5500),
12486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_9000),
12496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2E),
12506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2F),
12516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS3A),
1252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MICROMIPS),
1253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_M16),
12546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_MDMX),
1255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_1),
1256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_2),
1257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_3),
1258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_4),
1259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_5),
1260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32),
1261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64),
1262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R2),
1263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R2),
1264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R6),
1265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R6)
1266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
1267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfSymOtherFlags[] = {
1269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STV_INTERNAL),
1270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STV_HIDDEN),
1271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STV_PROTECTED)
1272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsSymOtherFlags[] = {
1275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_OPTIONAL),
1276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_PLT),
1277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_PIC),
1278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_MICROMIPS)
1279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMips16SymOtherFlags[] = {
1282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_OPTIONAL),
1283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_PLT),
1284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_ENT(ELF, STO_MIPS_MIPS16)
1285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
1286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const char *getElfMipsOptionsOdkType(unsigned Odk) {
1288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (Odk) {
1289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_NULL);
1290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_REGINFO);
1291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_EXCEPTIONS);
1292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_PAD);
1293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_HWPATCH);
1294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_FILL);
1295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_TAGS);
1296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_HWAND);
1297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_HWOR);
1298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_GP_GROUP);
1299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_IDENT);
1300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_ENUM_CASE(ELF, ODK_PAGESIZE);
1301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  default:
1302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "Unknown";
1303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1306f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
1307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer)
1308f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : ObjDumper(Writer), Obj(Obj) {
1309f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1310f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  SmallVector<const Elf_Phdr *, 4> LoadSegments;
1311f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const Elf_Phdr &Phdr : Obj->program_headers()) {
1312f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Phdr.p_type == ELF::PT_DYNAMIC) {
1313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynamicTable = createDRIFrom(&Phdr, sizeof(Elf_Dyn));
1314f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      continue;
1315f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
1316f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Phdr.p_type != ELF::PT_LOAD || Phdr.p_filesz == 0)
1317f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      continue;
1318f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LoadSegments.push_back(&Phdr);
1319f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1320f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
1322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Sec.sh_type) {
1323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_SYMTAB:
1324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (DotSymtabSec != nullptr)
1325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError("Multilpe SHT_SYMTAB");
1326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DotSymtabSec = &Sec;
1327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_DYNSYM:
1329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (DynSymRegion.Size)
1330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError("Multilpe SHT_DYNSYM");
1331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynSymRegion = createDRIFrom(&Sec);
1332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // This is only used (if Elf_Shdr present)for naming section in GNU style
1333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynSymtabName = unwrapOrError(Obj->getSectionName(&Sec));
1334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_SYMTAB_SHNDX:
1336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ShndxTable = unwrapOrError(Obj->getSHNDXTable(Sec));
1337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_GNU_versym:
1339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (dot_gnu_version_sec != nullptr)
1340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError("Multiple SHT_GNU_versym");
1341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      dot_gnu_version_sec = &Sec;
1342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_GNU_verdef:
1344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (dot_gnu_version_d_sec != nullptr)
1345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError("Multiple SHT_GNU_verdef");
1346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      dot_gnu_version_d_sec = &Sec;
1347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::SHT_GNU_verneed:
1349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (dot_gnu_version_r_sec != nullptr)
1350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError("Multilpe SHT_GNU_verneed");
1351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      dot_gnu_version_r_sec = &Sec;
1352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
1354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
1355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  parseDynamicTable(LoadSegments);
1357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (opts::Output == opts::GNU)
1359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ELFDumperStyle.reset(new GNUStyle<ELFT>(Writer, this));
1360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
1361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ELFDumperStyle.reset(new LLVMStyle<ELFT>(Writer, this));
1362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename ELFT>
1365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ELFDumper<ELFT>::parseDynamicTable(
1366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<const Elf_Phdr *> LoadSegments) {
1367f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * {
1368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Elf_Phdr *const *I = std::upper_bound(
1369f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        LoadSegments.begin(), LoadSegments.end(), VAddr, compareAddr<ELFT>);
1370f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (I == LoadSegments.begin())
1371f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Virtual address is not in any segment");
1372f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    --I;
1373f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Phdr &Phdr = **I;
1374f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint64_t Delta = VAddr - Phdr.p_vaddr;
1375f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Delta >= Phdr.p_filesz)
1376f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      report_fatal_error("Virtual address is not in any segment");
1377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return Obj->base() + Phdr.p_offset + Delta;
1378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
1379f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1380f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t SONameOffset = 0;
1381f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const char *StringTableBegin = nullptr;
1382f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t StringTableSize = 0;
1383f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const Elf_Dyn &Dyn : dynamic_table()) {
1384f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    switch (Dyn.d_tag) {
1385f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_HASH:
1386f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      HashTable =
1387f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          reinterpret_cast<const Elf_Hash *>(toMappedAddr(Dyn.getPtr()));
1388f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1389f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_GNU_HASH:
1390f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      GnuHashTable =
1391f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          reinterpret_cast<const Elf_GnuHash *>(toMappedAddr(Dyn.getPtr()));
1392f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_STRTAB:
1394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringTableBegin = (const char *)toMappedAddr(Dyn.getPtr());
1395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_STRSZ:
1397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringTableSize = Dyn.getVal();
1398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_SYMTAB:
1400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynSymRegion.Addr = toMappedAddr(Dyn.getPtr());
1401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynSymRegion.EntSize = sizeof(Elf_Sym);
1402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1403f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_RELA:
1404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DynRelaRegion.Addr = toMappedAddr(Dyn.getPtr());
1405f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1406f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_RELASZ:
1407f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DynRelaRegion.Size = Dyn.getVal();
1408f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1409f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_RELAENT:
1410f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DynRelaRegion.EntSize = Dyn.getVal();
1411f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1412f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_SONAME:
1413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      SONameOffset = Dyn.getVal();
1414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_REL:
1416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynRelRegion.Addr = toMappedAddr(Dyn.getPtr());
1417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_RELSZ:
1419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynRelRegion.Size = Dyn.getVal();
1420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_RELENT:
1422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynRelRegion.EntSize = Dyn.getVal();
1423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_PLTREL:
1425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (Dyn.getVal() == DT_REL)
1426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        DynPLTRelRegion.EntSize = sizeof(Elf_Rel);
1427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else if (Dyn.getVal() == DT_RELA)
1428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        DynPLTRelRegion.EntSize = sizeof(Elf_Rela);
1429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else
1430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reportError(Twine("unknown DT_PLTREL value of ") +
1431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    Twine((uint64_t)Dyn.getVal()));
1432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_JMPREL:
1434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynPLTRelRegion.Addr = toMappedAddr(Dyn.getPtr());
1435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
1436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ELF::DT_PLTRELSZ:
1437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DynPLTRelRegion.Size = Dyn.getVal();
1438f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1439f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
1440f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1441f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (StringTableBegin)
1442f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    DynamicStringTable = StringRef(StringTableBegin, StringTableSize);
1443f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (SONameOffset)
1444f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    SOName = getDynamicString(SONameOffset);
1445f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1446f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
1448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartypename ELFDumper<ELFT>::Elf_Rel_Range ELFDumper<ELFT>::dyn_rels() const {
1449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return DynRelRegion.getAsArrayRef<Elf_Rel>();
1450f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1451f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1452f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
1453f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartypename ELFDumper<ELFT>::Elf_Rela_Range ELFDumper<ELFT>::dyn_relas() const {
1454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return DynRelaRegion.getAsArrayRef<Elf_Rela>();
1455f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1456f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
145776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
145876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printFileHeaders() {
1459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printFileHeaders(Obj);
146076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
146176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
146276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
146376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSections() {
1464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printSections(Obj);
1465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
146676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate<class ELFT>
1468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ELFDumper<ELFT>::printRelocations() {
1469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printRelocations(Obj);
1470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
147176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printProgramHeaders() {
1473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printProgramHeaders(Obj);
1474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1475f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printDynamicRelocations() {
1477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printDynamicRelocations(Obj);
1478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
147976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate<class ELFT>
1481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ELFDumper<ELFT>::printSymbols() {
1482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printSymbols(Obj);
148376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
148476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
148576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
1486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ELFDumper<ELFT>::printDynamicSymbols() {
1487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printDynamicSymbols(Obj);
1488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
148976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printHashHistogram() {
1491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printHashHistogram(Obj);
1492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
1493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_READOBJ_TYPE_CASE(name) \
1494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case DT_##name: return #name
149576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
149676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getTypeString(uint64_t Type) {
149776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
149876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(BIND_NOW);
149976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(DEBUG);
150076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI);
150176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI_ARRAY);
150276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ);
150376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FLAGS);
15046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(FLAGS_1);
150576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(HASH);
150676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT);
150776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT_ARRAY);
150876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ);
150976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY);
151076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ);
151176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(JMPREL);
151276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(NEEDED);
151376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(NULL);
151476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTGOT);
151576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTREL);
151676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTRELSZ);
151776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(REL);
151876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELA);
151976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELENT);
152076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELSZ);
152176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELAENT);
152276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELASZ);
152376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RPATH);
152476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RUNPATH);
152576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SONAME);
152676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(STRSZ);
152776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(STRTAB);
152876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMBOLIC);
152976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMENT);
153076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMTAB);
153176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(TEXTREL);
1532f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(VERDEF);
1533f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(VERDEFNUM);
1534fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(VERNEED);
1535fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(VERNEEDNUM);
1536fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(VERSYM);
1537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(RELACOUNT);
1538dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_TYPE_CASE(RELCOUNT);
1539dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_TYPE_CASE(GNU_HASH);
1540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(TLSDESC_PLT);
1541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(TLSDESC_GOT);
1542fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION);
1543f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP_REL);
1544fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS);
1545fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS);
1546fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO);
1547fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO);
1548fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO);
1549fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM);
155036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP);
155136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT);
15526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_TYPE_CASE(MIPS_OPTIONS);
155376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  default: return "unknown";
155476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
155576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
155676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
155776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#undef LLVM_READOBJ_TYPE_CASE
155876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define LLVM_READOBJ_DT_FLAG_ENT(prefix, enum) \
1560dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  { #enum, prefix##_##enum }
1561dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1562dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic const EnumEntry<unsigned> ElfDynamicDTFlags[] = {
1563dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN),
1564dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC),
1565dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL),
1566dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW),
1567dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS)
1568dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
1569dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
15706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfDynamicDTFlags1[] = {
15716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOW),
15726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAL),
15736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, GROUP),
15746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODELETE),
15756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, LOADFLTR),
15766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, INITFIRST),
15776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOOPEN),
15786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, ORIGIN),
15796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, DIRECT),
15806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, TRANS),
15816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, INTERPOSE),
15826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODEFLIB),
15836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODUMP),
15846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, CONFALT),
15856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, ENDFILTEE),
15866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, DISPRELDNE),
15876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODIRECT),
15886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, IGNMULDEF),
15896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOKSYMS),
15906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOHDR),
15916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, EDITED),
15926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, NORELOC),
15936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, SYMINTPOSE),
15946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAUDIT),
15956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LLVM_READOBJ_DT_FLAG_ENT(DF_1, SINGLETON)
15966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
15976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1598dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic const EnumEntry<unsigned> ElfDynamicDTMipsFlags[] = {
1599dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE),
1600dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART),
1601dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT),
1602dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT),
1603dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE),
1604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY),
1605dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT),
1606dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS),
1607dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT),
1608dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE),
1609dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD),
1610dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART),
1611dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED),
1612dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD),
1613dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF),
1614dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE)
1615dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
1616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1617dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#undef LLVM_READOBJ_DT_FLAG_ENT
1618dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1619dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate <typename T, typename TFlag>
1620dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) {
1621dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  typedef EnumEntry<TFlag> FlagEntry;
1622dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  typedef SmallVector<FlagEntry, 10> FlagVector;
1623dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  FlagVector SetFlags;
1624dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1625dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (const auto &Flag : Flags) {
1626dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (Flag.Value == 0)
1627dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      continue;
1628dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1629dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if ((Value & Flag.Value) == Flag.Value)
1630dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      SetFlags.push_back(Flag);
1631dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
1632dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1633dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (const auto &Flag : SetFlags) {
1634dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    OS << Flag.Name << " ";
1635dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
1636dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
1637dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1638081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencertemplate <class ELFT>
1639f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarStringRef ELFDumper<ELFT>::getDynamicString(uint64_t Value) const {
1640f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (Value >= DynamicStringTable.size())
1641f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    reportError("Invalid dynamic string table reference");
1642f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return StringRef(DynamicStringTable.data() + Value);
1643f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1644f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1645f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT>
1646f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ELFDumper<ELFT>::printValue(uint64_t Type, uint64_t Value) {
1647f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  raw_ostream &OS = W.getOStream();
1648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const char* ConvChar = (opts::Output == opts::GNU) ? "0x%" PRIx64 : "0x%" PRIX64;
164976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
165076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTREL:
165176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (Value == DT_REL) {
165276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      OS << "REL";
165376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      break;
165476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    } else if (Value == DT_RELA) {
165576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      OS << "RELA";
165676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      break;
165776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
165876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Fallthrough.
165976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTGOT:
166076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_HASH:
166176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_STRTAB:
166276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SYMTAB:
166376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELA:
166476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT:
166576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI:
166676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_REL:
166776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_JMPREL:
166876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT_ARRAY:
166976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI_ARRAY:
167076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PREINIT_ARRAY:
167176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_DEBUG:
1672f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  case DT_VERDEF:
1673fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_VERNEED:
1674fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_VERSYM:
1675dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case DT_GNU_HASH:
167676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_NULL:
1677fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_BASE_ADDRESS:
1678fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_GOTSYM:
167936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case DT_MIPS_RLD_MAP:
1680f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  case DT_MIPS_RLD_MAP_REL:
168136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case DT_MIPS_PLTGOT:
16826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case DT_MIPS_OPTIONS:
1683de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << format(ConvChar, Value);
168476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
1685de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case DT_RELACOUNT:
1686dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case DT_RELCOUNT:
1687f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  case DT_VERDEFNUM:
1688fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_VERNEEDNUM:
1689fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_RLD_VERSION:
1690fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_LOCAL_GOTNO:
1691fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_SYMTABNO:
1692fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan  case DT_MIPS_UNREFEXTNO:
1693fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan    OS << Value;
1694fe9ce427d076627beed834d5c322e61323dfd1fcSimon Atanasyan    break;
169576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTRELSZ:
169676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELASZ:
169776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELAENT:
169876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_STRSZ:
169976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SYMENT:
170076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELSZ:
170176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELENT:
170276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT_ARRAYSZ:
170376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI_ARRAYSZ:
170476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PREINIT_ARRAYSZ:
170576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << Value << " (bytes)";
170676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
170776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_NEEDED:
1708f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    OS << "SharedLibrary (" << getDynamicString(Value) << ")";
170976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
171076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SONAME:
1711f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    OS << "LibrarySoname (" << getDynamicString(Value) << ")";
171276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
17136217187ff202cb919257abc32782faa35c29f5d9Joerg Sonnenberger  case DT_RPATH:
17146217187ff202cb919257abc32782faa35c29f5d9Joerg Sonnenberger  case DT_RUNPATH:
1715f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    OS << getDynamicString(Value);
17166217187ff202cb919257abc32782faa35c29f5d9Joerg Sonnenberger    break;
1717dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case DT_MIPS_FLAGS:
1718dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS);
1719dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
1720dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case DT_FLAGS:
1721dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS);
1722dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
17236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case DT_FLAGS_1:
17246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    printFlags(Value, makeArrayRef(ElfDynamicDTFlags1), OS);
17256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
1726f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  default:
1727de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << format(ConvChar, Value);
1728f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    break;
172976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
173076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
173176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
173276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
173376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printUnwindInfo() {
173476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "UnwindInfo not implemented.\n";
173576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
173676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
173736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace {
17386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <> void ELFDumper<ELFType<support::little, false>>::printUnwindInfo() {
173936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const unsigned Machine = Obj->getHeader()->e_machine;
174036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Machine == EM_ARM) {
1741f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ARM::EHABI::PrinterContext<ELFType<support::little, false>> Ctx(
1742f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        W, Obj, DotSymtabSec);
174336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return Ctx.PrintUnwindInformation();
174436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
174536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  W.startLine() << "UnwindInfo not implemented.\n";
174636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
174736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
174836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
174976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
175076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printDynamicTable() {
1751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto I = dynamic_table().begin();
1752de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto E = dynamic_table().end();
1753f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1754f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (I == E)
1755f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1756f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1757f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  --E;
1758f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  while (I != E && E->getTag() == ELF::DT_NULL)
1759f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    --E;
1760f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (E->getTag() != ELF::DT_NULL)
1761f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ++E;
1762f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ++E;
176376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1764f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ptrdiff_t Total = std::distance(I, E);
1765c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (Total == 0)
176676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    return;
176776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
176876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  raw_ostream &OS = W.getOStream();
176976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "DynamicSection [ (" << Total << " entries)\n";
177076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1771081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  bool Is64 = ELFT::Is64Bits;
177276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
177376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine()
177476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher     << "  Tag" << (Is64 ? "                " : "        ") << "Type"
177576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher     << "                 " << "Name/Value\n";
1776f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  while (I != E) {
1777f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Dyn &Entry = *I;
1778f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uintX_t Tag = Entry.getTag();
1779f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ++I;
1780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "  " << format_hex(Tag, Is64 ? 18 : 10, opts::Output != opts::GNU) << " "
1781f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                  << format("%-21s", getTypeString(Tag));
1782f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    printValue(Tag, Entry.getVal());
178376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << "\n";
178476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
178576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
178676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "]\n";
178776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
178876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
178976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
179076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printNeededLibraries() {
179176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope D(W, "NeededLibraries");
179276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1793081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  typedef std::vector<StringRef> LibsTy;
179476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LibsTy Libs;
179576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1796f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &Entry : dynamic_table())
1797c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (Entry.d_tag == ELF::DT_NEEDED)
1798f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Libs.push_back(getDynamicString(Entry.d_un.d_val));
179976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1800081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer  std::stable_sort(Libs.begin(), Libs.end());
180176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
1802f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &L : Libs) {
1803f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    outs() << "  " << L << "\n";
180476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
180576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
1806cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
180736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1808f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
1809f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ELFDumper<ELFT>::printHashTable() {
1810f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope D(W, "HashTable");
1811f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!HashTable)
1812f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1813f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Num Buckets", HashTable->nbucket);
1814f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Num Chains", HashTable->nchain);
1815f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printList("Buckets", HashTable->buckets());
1816f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printList("Chains", HashTable->chains());
1817f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1818f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1819f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT>
1820f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ELFDumper<ELFT>::printGnuHashTable() {
1821f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope D(W, "GnuHashTable");
1822f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!GnuHashTable)
1823f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1824f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Num Buckets", GnuHashTable->nbuckets);
1825f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("First Hashed Symbol Index", GnuHashTable->symndx);
1826f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Num Mask Words", GnuHashTable->maskwords);
1827f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Shift Count", GnuHashTable->shift2);
1828f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHexList("Bloom Filter", GnuHashTable->filter());
1829f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printList("Buckets", GnuHashTable->buckets());
1830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Elf_Sym_Range Syms = dynamic_symbols();
1831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned NumSyms = std::distance(Syms.begin(), Syms.end());
1832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!NumSyms)
1833f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    reportError("No dynamic symbol section");
1834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHexList("Values", GnuHashTable->values(NumSyms));
1835f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1836f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1837f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ELFT> void ELFDumper<ELFT>::printLoadName() {
1838f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  outs() << "LoadName: " << SOName << '\n';
1839f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1840f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
184136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class ELFT>
184236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid ELFDumper<ELFT>::printAttributes() {
184336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  W.startLine() << "Attributes not implemented.\n";
184436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
184536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
184636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace {
18476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <> void ELFDumper<ELFType<support::little, false>>::printAttributes() {
184836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Obj->getHeader()->e_machine != EM_ARM) {
184936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    W.startLine() << "Attributes not implemented.\n";
185036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return;
185136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
185236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
185336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DictScope BA(W, "BuildAttributes");
1854f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const ELFO::Elf_Shdr &Sec : Obj->sections()) {
1855f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES)
185636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      continue;
185736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1858de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<uint8_t> Contents = unwrapOrError(Obj->getSectionContents(&Sec));
1859de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Contents[0] != ARMBuildAttrs::Format_Version) {
1860de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << "unrecognised FormatVersion: 0x" << utohexstr(Contents[0])
186136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines             << '\n';
186236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      continue;
186336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
186436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1865de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("FormatVersion", Contents[0]);
1866de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Contents.size() == 1)
186736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      continue;
186836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1869de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ARMAttributeParser(W).Parse(Contents);
187036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
187136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
187236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
187336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1874c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesnamespace {
1875c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT> class MipsGOTParser {
1876c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinespublic:
1877f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef object::ELFFile<ELFT> ELFO;
1878f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Shdr Elf_Shdr;
1879f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Sym Elf_Sym;
1880f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;
1881f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Addr GOTEntry;
1882f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Rel Elf_Rel;
1883f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef typename ELFO::Elf_Rela Elf_Rela;
1884c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1885f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MipsGOTParser(ELFDumper<ELFT> *Dumper, const ELFO *Obj,
1886de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                Elf_Dyn_Range DynTable, ScopedPrinter &W);
1887c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1888f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void parseGOT();
1889f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void parsePLT();
1890c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1891c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesprivate:
1892f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ELFDumper<ELFT> *Dumper;
1893f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const ELFO *Obj;
1894de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopedPrinter &W;
1895f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::Optional<uint64_t> DtPltGot;
1896f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::Optional<uint64_t> DtLocalGotNum;
1897f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::Optional<uint64_t> DtGotSym;
1898f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::Optional<uint64_t> DtMipsPltGot;
1899f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::Optional<uint64_t> DtJmpRel;
1900c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1901c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::size_t getGOTTotal(ArrayRef<uint8_t> GOT) const;
1902f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const GOTEntry *makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum);
1903f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1904f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printGotEntry(uint64_t GotAddr, const GOTEntry *BeginIt,
1905f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                     const GOTEntry *It);
1906f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printGlobalGotEntry(uint64_t GotAddr, const GOTEntry *BeginIt,
1907f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           const GOTEntry *It, const Elf_Sym *Sym,
1908f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           StringRef StrTable, bool IsDynamic);
1909f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printPLTEntry(uint64_t PLTAddr, const GOTEntry *BeginIt,
1910f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                     const GOTEntry *It, StringRef Purpose);
1911f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void printPLTEntry(uint64_t PLTAddr, const GOTEntry *BeginIt,
1912f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                     const GOTEntry *It, StringRef StrTable,
1913f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                     const Elf_Sym *Sym);
1914c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines};
1915c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
1916c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1917c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
1918f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarMipsGOTParser<ELFT>::MipsGOTParser(ELFDumper<ELFT> *Dumper, const ELFO *Obj,
1919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                   Elf_Dyn_Range DynTable, ScopedPrinter &W)
1920f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : Dumper(Dumper), Obj(Obj), W(W) {
1921f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &Entry : DynTable) {
1922f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    switch (Entry.getTag()) {
1923f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_PLTGOT:
1924f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DtPltGot = Entry.getVal();
1925f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1926f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_MIPS_LOCAL_GOTNO:
1927f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DtLocalGotNum = Entry.getVal();
1928f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1929f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_MIPS_GOTSYM:
1930f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DtGotSym = Entry.getVal();
1931f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1932f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_MIPS_PLTGOT:
1933f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DtMipsPltGot = Entry.getVal();
1934f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1935f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::DT_JMPREL:
1936f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      DtJmpRel = Entry.getVal();
1937f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
1938f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
1939f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1940f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
1941f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1942f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT> void MipsGOTParser<ELFT>::parseGOT() {
1943c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // See "Global Offset Table" in Chapter 5 in the following document
1944c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // for detailed GOT description.
1945c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
1946f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DtPltGot) {
1947f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "Cannot find PLTGOT dynamic table tag.\n";
1948f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1949f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1950f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DtLocalGotNum) {
1951f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "Cannot find MIPS_LOCAL_GOTNO dynamic table tag.\n";
1952f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1953f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1954f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DtGotSym) {
1955f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "Cannot find MIPS_GOTSYM dynamic table tag.\n";
1956f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
1957f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1958c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1959de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef StrTable = Dumper->getDynamicStringTable();
1960de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *DynSymBegin = Dumper->dynamic_symbols().begin();
1961de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *DynSymEnd = Dumper->dynamic_symbols().end();
1962c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::size_t DynSymTotal = std::size_t(std::distance(DynSymBegin, DynSymEnd));
1963c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1964de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (*DtGotSym > DynSymTotal)
1965de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("MIPS_GOTSYM exceeds a number of dynamic symbols");
1966c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1967f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::size_t GlobalGotNum = DynSymTotal - *DtGotSym;
1968c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1969de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (*DtLocalGotNum + GlobalGotNum == 0) {
1970de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "GOT is empty.\n";
1971c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return;
1972c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
1973c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1974de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *GOTShdr = findNotEmptySectionByAddress(Obj, *DtPltGot);
1975de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!GOTShdr)
1976de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("There is no not empty GOT section at 0x" +
1977de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       Twine::utohexstr(*DtPltGot));
1978de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1979de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> GOT = unwrapOrError(Obj->getSectionContents(GOTShdr));
1980de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1981de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (*DtLocalGotNum + GlobalGotNum > getGOTTotal(GOT))
1982de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("Number of GOT entries exceeds the size of GOT section");
1983de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1984de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GOTEntry *GotBegin = makeGOTIter(GOT, 0);
1985de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GOTEntry *GotLocalEnd = makeGOTIter(GOT, *DtLocalGotNum);
1986f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const GOTEntry *It = GotBegin;
1987c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1988c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  DictScope GS(W, "Primary GOT");
1989c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1990f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Canonical gp value", GOTShdr->sh_addr + 0x7ff0);
1991c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  {
1992c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ListScope RS(W, "Reserved entries");
1993c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1994c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    {
1995c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      DictScope D(W, "Entry");
1996f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
1997c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      W.printString("Purpose", StringRef("Lazy resolver"));
1998c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
1999c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2000c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (It != GotLocalEnd && (*It >> (sizeof(GOTEntry) * 8 - 1)) != 0) {
2001c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      DictScope D(W, "Entry");
2002f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
2003c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      W.printString("Purpose", StringRef("Module pointer (GNU extension)"));
2004c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
2005c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
2006c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  {
2007c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ListScope LS(W, "Local entries");
2008c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    for (; It != GotLocalEnd; ++It) {
2009c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      DictScope D(W, "Entry");
2010f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      printGotEntry(GOTShdr->sh_addr, GotBegin, It);
2011c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
2012c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
2013c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  {
2014c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ListScope GS(W, "Global entries");
2015c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2016f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const GOTEntry *GotGlobalEnd =
2017de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        makeGOTIter(GOT, *DtLocalGotNum + GlobalGotNum);
2018f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Sym *GotDynSym = DynSymBegin + *DtGotSym;
2019c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    for (; It != GotGlobalEnd; ++It) {
2020c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      DictScope D(W, "Entry");
2021de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printGlobalGotEntry(GOTShdr->sh_addr, GotBegin, It, GotDynSym++, StrTable,
2022de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          true);
2023c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
2024c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
2025c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2026de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::size_t SpecGotNum = getGOTTotal(GOT) - *DtLocalGotNum - GlobalGotNum;
2027c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum));
2028c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2029c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2030f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT> void MipsGOTParser<ELFT>::parsePLT() {
2031f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DtMipsPltGot) {
2032f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "Cannot find MIPS_PLTGOT dynamic table tag.\n";
2033f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2034f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2035f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DtJmpRel) {
2036f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "Cannot find JMPREL dynamic table tag.\n";
2037f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2038f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2039f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2040de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *PLTShdr = findNotEmptySectionByAddress(Obj, *DtMipsPltGot);
2041de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!PLTShdr)
2042de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("There is no not empty PLTGOT section at 0x " +
2043de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       Twine::utohexstr(*DtMipsPltGot));
2044de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> PLT = unwrapOrError(Obj->getSectionContents(PLTShdr));
2045f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2046de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *PLTRelShdr = findNotEmptySectionByAddress(Obj, *DtJmpRel);
2047de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!PLTRelShdr)
2048de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("There is no not empty RELPLT section at 0x" +
2049de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       Twine::utohexstr(*DtJmpRel));
2050de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *SymTable =
2051de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Obj->getSection(PLTRelShdr->sh_link));
2052de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTable));
2053f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2054de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GOTEntry *PLTBegin = makeGOTIter(PLT, 0);
2055de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GOTEntry *PLTEnd = makeGOTIter(PLT, getGOTTotal(PLT));
2056f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const GOTEntry *It = PLTBegin;
2057f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2058f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope GS(W, "PLT GOT");
2059f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  {
2060f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ListScope RS(W, "Reserved entries");
2061f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "PLT lazy resolver");
2062f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (It != PLTEnd)
2063f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "Module pointer");
2064f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2065f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  {
2066f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ListScope GS(W, "Entries");
2067f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2068f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    switch (PLTRelShdr->sh_type) {
2069f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::SHT_REL:
2070f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      for (const Elf_Rel *RI = Obj->rel_begin(PLTRelShdr),
2071f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         *RE = Obj->rel_end(PLTRelShdr);
2072f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           RI != RE && It != PLTEnd; ++RI, ++It) {
2073f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable);
2074de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym);
2075f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
2076f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
2077f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    case ELF::SHT_RELA:
2078f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      for (const Elf_Rela *RI = Obj->rela_begin(PLTRelShdr),
2079f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                          *RE = Obj->rela_end(PLTRelShdr);
2080f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           RI != RE && It != PLTEnd; ++RI, ++It) {
2081f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable);
2082de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym);
2083f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
2084f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
2085f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
2086f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2087f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
2088f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2089c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
2090c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstd::size_t MipsGOTParser<ELFT>::getGOTTotal(ArrayRef<uint8_t> GOT) const {
2091c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return GOT.size() / sizeof(GOTEntry);
2092c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2093c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2094c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
2095f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst typename MipsGOTParser<ELFT>::GOTEntry *
2096c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesMipsGOTParser<ELFT>::makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum) {
2097c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  const char *Data = reinterpret_cast<const char *>(GOT.data());
2098f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return reinterpret_cast<const GOTEntry *>(Data + EntryNum * sizeof(GOTEntry));
2099c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2100c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2101c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
2102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid MipsGOTParser<ELFT>::printGotEntry(uint64_t GotAddr,
2103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *BeginIt,
2104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *It) {
2105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
2106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Address", GotAddr + Offset);
2107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Access", Offset - 0x7ff0);
2108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Initial", *It);
2109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
2110c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT>
2112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid MipsGOTParser<ELFT>::printGlobalGotEntry(
2113f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint64_t GotAddr, const GOTEntry *BeginIt, const GOTEntry *It,
2114f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Elf_Sym *Sym, StringRef StrTable, bool IsDynamic) {
2115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  printGotEntry(GotAddr, BeginIt, It);
2116c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Value", Sym->st_value);
2118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
2119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned SectionIndex = 0;
2121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef SectionName;
2122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getSectionNameIndex(*Obj, Sym, Dumper->dynamic_symbols().begin(),
2123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      Dumper->getShndxTable(), SectionName, SectionIndex);
2124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Section", SectionName, SectionIndex);
2125c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::string FullSymbolName =
2127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Dumper->getFullSymbolName(Sym, StrTable, IsDynamic);
2128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printNumber("Name", FullSymbolName, Sym->st_name);
2129c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2131c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
2132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr,
2133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *BeginIt,
2134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *It, StringRef Purpose) {
2135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope D(W, "Entry");
2136c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
2137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Address", PLTAddr + Offset);
2138c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printHex("Initial", *It);
2139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printString("Purpose", Purpose);
2140c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2141c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2142c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT>
2143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr,
2144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *BeginIt,
2145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const GOTEntry *It, StringRef StrTable,
2146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        const Elf_Sym *Sym) {
2147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DictScope D(W, "Entry");
2148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
2149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Address", PLTAddr + Offset);
2150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  W.printHex("Initial", *It);
2151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printHex("Value", Sym->st_value);
2152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
2153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  unsigned SectionIndex = 0;
2155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  StringRef SectionName;
2156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getSectionNameIndex(*Obj, Sym, Dumper->dynamic_symbols().begin(),
2157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      Dumper->getShndxTable(), SectionName, SectionIndex);
2158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printHex("Section", SectionName, SectionIndex);
2159c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::string FullSymbolName = Dumper->getFullSymbolName(Sym, StrTable, true);
2161c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  W.printNumber("Name", FullSymbolName, Sym->st_name);
2162c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
2163c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2164c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestemplate <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() {
2165c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (Obj->getHeader()->e_machine != EM_MIPS) {
2166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    W.startLine() << "MIPS PLT GOT is available for MIPS targets only.\n";
2167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return;
2168c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
2169c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
2170f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MipsGOTParser<ELFT> GOTParser(this, Obj, dynamic_table(), W);
2171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  GOTParser.parseGOT();
2172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  GOTParser.parsePLT();
2173c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
21746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
21756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsISAExtType[] = {
21766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"None",                    Mips::AFL_EXT_NONE},
21776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Broadcom SB-1",           Mips::AFL_EXT_SB1},
21786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Cavium Networks Octeon",  Mips::AFL_EXT_OCTEON},
21796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Cavium Networks Octeon2", Mips::AFL_EXT_OCTEON2},
21806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Cavium Networks OcteonP", Mips::AFL_EXT_OCTEONP},
21816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Cavium Networks Octeon3", Mips::AFL_EXT_OCTEON3},
21826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"LSI R4010",               Mips::AFL_EXT_4010},
21836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Loongson 2E",             Mips::AFL_EXT_LOONGSON_2E},
21846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Loongson 2F",             Mips::AFL_EXT_LOONGSON_2F},
21856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Loongson 3A",             Mips::AFL_EXT_LOONGSON_3A},
21866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MIPS R4650",              Mips::AFL_EXT_4650},
21876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MIPS R5900",              Mips::AFL_EXT_5900},
21886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MIPS R10000",             Mips::AFL_EXT_10000},
21896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"NEC VR4100",              Mips::AFL_EXT_4100},
21906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"NEC VR4111/VR4181",       Mips::AFL_EXT_4111},
21916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"NEC VR4120",              Mips::AFL_EXT_4120},
21926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"NEC VR5400",              Mips::AFL_EXT_5400},
21936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"NEC VR5500",              Mips::AFL_EXT_5500},
21946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"RMI Xlr",                 Mips::AFL_EXT_XLR},
21956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Toshiba R3900",           Mips::AFL_EXT_3900}
21966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
21976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
21986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsASEFlags[] = {
21996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"DSP",                Mips::AFL_ASE_DSP},
22006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"DSPR2",              Mips::AFL_ASE_DSPR2},
22016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Enhanced VA Scheme", Mips::AFL_ASE_EVA},
22026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MCU",                Mips::AFL_ASE_MCU},
22036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MDMX",               Mips::AFL_ASE_MDMX},
22046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MIPS-3D",            Mips::AFL_ASE_MIPS3D},
22056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MT",                 Mips::AFL_ASE_MT},
22066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"SmartMIPS",          Mips::AFL_ASE_SMARTMIPS},
22076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"VZ",                 Mips::AFL_ASE_VIRT},
22086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MSA",                Mips::AFL_ASE_MSA},
22096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"MIPS16",             Mips::AFL_ASE_MIPS16},
22106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"microMIPS",          Mips::AFL_ASE_MICROMIPS},
22116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"XPA",                Mips::AFL_ASE_XPA}
22126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
22136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsFpABIType[] = {
22156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard or soft float",                  Mips::Val_GNU_MIPS_ABI_FP_ANY},
22166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float (double precision)",       Mips::Val_GNU_MIPS_ABI_FP_DOUBLE},
22176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float (single precision)",       Mips::Val_GNU_MIPS_ABI_FP_SINGLE},
22186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Soft float",                          Mips::Val_GNU_MIPS_ABI_FP_SOFT},
22196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float (MIPS32r2 64-bit FPU 12 callee-saved)",
22206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar   Mips::Val_GNU_MIPS_ABI_FP_OLD_64},
22216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float (32-bit CPU, Any FPU)",    Mips::Val_GNU_MIPS_ABI_FP_XX},
22226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float (32-bit CPU, 64-bit FPU)", Mips::Val_GNU_MIPS_ABI_FP_64},
22236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"Hard float compat (32-bit CPU, 64-bit FPU)",
22246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar   Mips::Val_GNU_MIPS_ABI_FP_64A}
22256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
22266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic const EnumEntry<unsigned> ElfMipsFlags1[] {
22286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  {"ODDSPREG", Mips::AFL_FLAGS1_ODDSPREG},
22296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
22306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic int getMipsRegisterSize(uint8_t Flag) {
22326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  switch (Flag) {
22336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Mips::AFL_REG_NONE:
22346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return 0;
22356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Mips::AFL_REG_32:
22366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return 32;
22376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Mips::AFL_REG_64:
22386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return 64;
22396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case Mips::AFL_REG_128:
22406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return 128;
22416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  default:
22426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return -1;
22436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
22446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
22456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printMipsABIFlags() {
22476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.abiflags");
22486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!Shdr) {
22496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    W.startLine() << "There is no .MIPS.abiflags section in the file.\n";
22506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
22516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
2252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr));
2253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sec.size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {
22546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    W.startLine() << "The .MIPS.abiflags section has a wrong size.\n";
22556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
22566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
22576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto *Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Sec.data());
22596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  raw_ostream &OS = W.getOStream();
22616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DictScope GS(W, "MIPS ABI Flags");
22626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
22636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printNumber("Version", Flags->version);
22646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.startLine() << "ISA: ";
22656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Flags->isa_rev <= 1)
22666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OS << format("MIPS%u", Flags->isa_level);
22676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else
22686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OS << format("MIPS%ur%u", Flags->isa_level, Flags->isa_rev);
22696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OS << "\n";
22706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printEnum("ISA Extension", Flags->isa_ext, makeArrayRef(ElfMipsISAExtType));
22716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printFlags("ASEs", Flags->ases, makeArrayRef(ElfMipsASEFlags));
22726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printEnum("FP ABI", Flags->fp_abi, makeArrayRef(ElfMipsFpABIType));
22736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printNumber("GPR size", getMipsRegisterSize(Flags->gpr_size));
22746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printNumber("CPR1 size", getMipsRegisterSize(Flags->cpr1_size));
22756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printNumber("CPR2 size", getMipsRegisterSize(Flags->cpr2_size));
22766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printFlags("Flags 1", Flags->flags1, makeArrayRef(ElfMipsFlags1));
22776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  W.printHex("Flags 2", Flags->flags2);
22786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
2279f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void printMipsReginfoData(ScopedPrinter &W,
2282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                 const Elf_Mips_RegInfo<ELFT> &Reginfo) {
2283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("GP", Reginfo.ri_gp_value);
2284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("General Mask", Reginfo.ri_gprmask);
2285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Co-Proc Mask0", Reginfo.ri_cprmask[0]);
2286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Co-Proc Mask1", Reginfo.ri_cprmask[1]);
2287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Co-Proc Mask2", Reginfo.ri_cprmask[2]);
2288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Co-Proc Mask3", Reginfo.ri_cprmask[3]);
2289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2291f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {
2292f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".reginfo");
2293f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Shdr) {
2294f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    W.startLine() << "There is no .reginfo section in the file.\n";
2295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2296f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr));
2298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sec.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {
2299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "The .reginfo section has a wrong size.\n";
2300f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2301f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope GS(W, "MIPS RegInfo");
2304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto *Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Sec.data());
2305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printMipsReginfoData(W, *Reginfo);
2306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printMipsOptions() {
2309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.options");
2310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Shdr) {
2311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "There is no .MIPS.options section in the file.\n";
2312f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2313f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2314f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope GS(W, "MIPS Options");
2316f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr));
2318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  while (!Sec.empty()) {
2319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.size() < sizeof(Elf_Mips_Options<ELFT>)) {
2320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.startLine() << "The .MIPS.options section has a wrong size.\n";
2321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
2322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto *O = reinterpret_cast<const Elf_Mips_Options<ELFT> *>(Sec.data());
2324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope GS(W, getElfMipsOptionsOdkType(O->kind));
2325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (O->kind) {
2326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case ODK_REGINFO:
2327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printMipsReginfoData(W, O->getRegInfo());
2328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
2329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
2330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.startLine() << "Unsupported MIPS options tag.\n";
2331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
2332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Sec = Sec.slice(O->size);
2334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
2336f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2337f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
2338f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Elf_Shdr *StackMapSection = nullptr;
2339f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &Sec : Obj->sections()) {
2340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
2341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Name == ".llvm_stackmaps") {
2342f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      StackMapSection = &Sec;
2343f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      break;
2344f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
2345f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2346f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2347f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!StackMapSection)
2348f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
2349f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2350f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringRef StackMapContents;
2351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<uint8_t> StackMapContentsArray =
2352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Obj->getSectionContents(StackMapSection));
2353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  prettyPrintStackMap(llvm::outs(), StackMapV1Parser<ELFT::TargetEndianness>(
2355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        StackMapContentsArray));
2356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void ELFDumper<ELFT>::printGroupSections() {
2359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ELFDumperStyle->printGroupSections(Obj);
2360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic inline void printFields(formatted_raw_ostream &OS, StringRef Str1,
2363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                               StringRef Str2) {
2364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS.PadToColumn(2u);
2365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << Str1;
2366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS.PadToColumn(37u);
2367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << Str2 << "\n";
2368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS.flush();
2369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void GNUStyle<ELFT>::printFileHeaders(const ELFO *Obj) {
2372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Ehdr *e = Obj->getHeader();
2373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "ELF Header:\n";
2374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "  Magic:  ";
2375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Str;
2376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (int i = 0; i < ELF::EI_NIDENT; i++)
2377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << format(" %02x", static_cast<int>(e->e_ident[i]));
2378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = printEnum(e->e_ident[ELF::EI_CLASS], makeArrayRef(ElfClass));
2380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Class:", Str);
2381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = printEnum(e->e_ident[ELF::EI_DATA], makeArrayRef(ElfDataEncoding));
2382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Data:", Str);
2383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS.PadToColumn(2u);
2384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "Version:";
2385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS.PadToColumn(37u);
2386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << to_hexString(e->e_ident[ELF::EI_VERSION]);
2387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (e->e_version == ELF::EV_CURRENT)
2388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << " (current)";
2389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = printEnum(e->e_ident[ELF::EI_OSABI], makeArrayRef(ElfOSABI));
2391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "OS/ABI:", Str);
2392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = "0x" + to_hexString(e->e_version);
2393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_hexString(e->e_ident[ELF::EI_ABIVERSION]);
2394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "ABI Version:", Str);
2395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = printEnum(e->e_type, makeArrayRef(ElfObjectFileType));
2396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Type:", Str);
2397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = printEnum(e->e_machine, makeArrayRef(ElfMachineType));
2398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Machine:", Str);
2399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = "0x" + to_hexString(e->e_version);
2400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Version:", Str);
2401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = "0x" + to_hexString(e->e_entry);
2402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Entry point address:", Str);
2403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_phoff) + " (bytes into file)";
2404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Start of program headers:", Str);
2405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_shoff) + " (bytes into file)";
2406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Start of section headers:", Str);
2407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = "0x" + to_hexString(e->e_flags);
2408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Flags:", Str);
2409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_ehsize) + " (bytes)";
2410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Size of this header:", Str);
2411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_phentsize) + " (bytes)";
2412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Size of program headers:", Str);
2413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_phnum);
2414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Number of program headers:", Str);
2415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_shentsize) + " (bytes)";
2416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Size of section headers:", Str);
2417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_shnum);
2418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Number of section headers:", Str);
2419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = to_string(e->e_shstrndx);
2420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printFields(OS, "Section header string table index:", Str);
2421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) {
2424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t SectionIndex = 0;
2425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool HasGroups = false;
2426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
2427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.sh_type == ELF::SHT_GROUP) {
2428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      HasGroups = true;
2429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
2430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
2431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const Elf_Sym *Signature =
2432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
2433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ArrayRef<Elf_Word> Data = unwrapOrError(
2434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
2435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
2436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << "\n" << getGroupType(Data[0]) << " group section ["
2437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         << format_decimal(SectionIndex, 5) << "] `" << Name << "' ["
2438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         << StrTable.data() + Signature->st_name << "] contains "
2439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         << (Data.size() - 1) << " sections:\n"
2440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         << "   [Index]    Name\n";
2441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (auto &Ndx : Data.slice(1)) {
2442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto Sec = unwrapOrError(Obj->getSection(Ndx));
2443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
2444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        OS << "   [" << format_decimal(Ndx, 5) << "]   " << Name
2445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           << "\n";
2446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
2447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++SectionIndex;
2449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!HasGroups)
2451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "There are no section groups in this file.\n";
2452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,
2456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     const Elf_Rela &R, bool IsRela) {
2457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Offset, Info, Addend = "", Value;
2458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallString<32> RelocName;
2459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));
2460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef TargetName;
2461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *Sym = nullptr;
2462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Width = ELFT::Is64Bits ? 16 : 8;
2463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Bias = ELFT::Is64Bits ? 8 : 0;
2464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // First two fields are bit width dependent. The rest of them are after are
2466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // fixed width.
2467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Field Fields[5] = {0, 10 + Bias, 19 + 2 * Bias, 42 + 2 * Bias, 53 + 2 * Bias};
2468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Obj->getRelocationTypeName(R.getType(Obj->isMips64EL()), RelocName);
2469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Sym = Obj->getRelocationSymbol(&R, SymTab);
2470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sym && Sym->getType() == ELF::STT_SECTION) {
2471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Elf_Shdr *Sec = unwrapOrError(
2472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable()));
2473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TargetName = unwrapOrError(Obj->getSectionName(Sec));
2474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (Sym) {
2475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TargetName = unwrapOrError(Sym->getName(StrTable));
2476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2477f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sym && IsRela) {
2479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (R.r_addend < 0)
2480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Addend = " - ";
2481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
2482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Addend = " + ";
2483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Offset = to_string(format_hex_no_prefix(R.r_offset, Width));
2486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info = to_string(format_hex_no_prefix(R.r_info, Width));
2487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t RelAddend = R.r_addend;
2489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IsRela)
2490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Addend += to_hexString(std::abs(RelAddend), false);
2491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sym)
2493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = to_string(format_hex_no_prefix(Sym->getValue(), Width));
2494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[0].Str = Offset;
2496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[1].Str = Info;
2497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[2].Str = RelocName;
2498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[3].Str = Value;
2499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[4].Str = TargetName;
2500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &field : Fields)
2501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printField(field);
2502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << Addend;
2503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic inline void printRelocHeader(raw_ostream &OS, bool Is64, bool IsRela) {
2507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Is64)
2508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "    Offset             Info             Type"
2509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << "               Symbol's Value  Symbol's Name";
2510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << " Offset     Info    Type                Sym. Value  "
2512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << "Symbol's Name";
2513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IsRela)
2514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << (IsRela ? " + Addend" : "");
2515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {
2519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool HasRelocSections = false;
2520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
2521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)
2522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      continue;
2523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    HasRelocSections = true;
2524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
2525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Entries = Sec.getEntityCount();
2526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uintX_t Offset = Sec.sh_offset;
2527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\nRelocation section '" << Name << "' at offset 0x"
2528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << to_hexString(Offset, false) << " contains " << Entries
2529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " entries:\n";
2530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocHeader(OS,  ELFT::Is64Bits, (Sec.sh_type == ELF::SHT_RELA));
2531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec.sh_link));
2532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.sh_type == ELF::SHT_REL) {
2533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (const auto &R : Obj->rels(&Sec)) {
2534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Elf_Rela Rela;
2535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Rela.r_offset = R.r_offset;
2536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Rela.r_info = R.r_info;
2537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Rela.r_addend = 0;
2538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        printRelocation(Obj, SymTab, Rela, false);
2539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
2540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else {
2541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (const auto &R : Obj->relas(&Sec))
2542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        printRelocation(Obj, SymTab, R, true);
2543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!HasRelocSections)
2546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\nThere are no relocations in this file.\n";
2547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::string getSectionTypeString(unsigned Arch, unsigned Type) {
2550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  using namespace ELF;
2551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (Arch) {
2552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case EM_ARM:
2553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Type) {
2554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_ARM_EXIDX:
2555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "ARM_EXIDX";
2556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_ARM_PREEMPTMAP:
2557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "ARM_PREEMPTMAP";
2558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_ARM_ATTRIBUTES:
2559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "ARM_ATTRIBUTES";
2560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_ARM_DEBUGOVERLAY:
2561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "ARM_DEBUGOVERLAY";
2562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_ARM_OVERLAYSECTION:
2563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "ARM_OVERLAYSECTION";
2564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case EM_X86_64:
2566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Type) {
2567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_X86_64_UNWIND:
2568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "X86_64_UNWIND";
2569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case EM_MIPS:
2571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case EM_MIPS_RS3_LE:
2572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Type) {
2573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_MIPS_REGINFO:
2574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "MIPS_REGINFO";
2575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_MIPS_OPTIONS:
2576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "MIPS_OPTIONS";
2577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case SHT_MIPS_ABIFLAGS:
2578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return "MIPS_ABIFLAGS";
2579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (Type) {
2582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_NULL:
2583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "NULL";
2584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_PROGBITS:
2585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "PROGBITS";
2586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_SYMTAB:
2587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "SYMTAB";
2588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_STRTAB:
2589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "STRTAB";
2590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_RELA:
2591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "RELA";
2592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_HASH:
2593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "HASH";
2594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_DYNAMIC:
2595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "DYNAMIC";
2596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_NOTE:
2597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "NOTE";
2598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_NOBITS:
2599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "NOBITS";
2600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_REL:
2601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "REL";
2602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_SHLIB:
2603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "SHLIB";
2604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_DYNSYM:
2605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "DYNSYM";
2606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_INIT_ARRAY:
2607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "INIT_ARRAY";
2608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_FINI_ARRAY:
2609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "FINI_ARRAY";
2610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_PREINIT_ARRAY:
2611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "PREINIT_ARRAY";
2612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GROUP:
2613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "GROUP";
2614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_SYMTAB_SHNDX:
2615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "SYMTAB SECTION INDICES";
2616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME: Parse processor specific GNU attributes
2617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GNU_ATTRIBUTES:
2618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "ATTRIBUTES";
2619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GNU_HASH:
2620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "GNU_HASH";
2621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GNU_verdef:
2622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "VERDEF";
2623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GNU_verneed:
2624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "VERNEED";
2625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SHT_GNU_versym:
2626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "VERSYM";
2627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  default:
2628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "";
2629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return "";
2631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2633de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void GNUStyle<ELFT>::printSections(const ELFO *Obj) {
2634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  size_t SectionIndex = 0;
2635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Number, Type, Size, Address, Offset, Flags, Link, Info, EntrySize,
2636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Alignment;
2637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Bias;
2638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Width;
2639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ELFT::Is64Bits) {
2641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Bias = 0;
2642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Width = 16;
2643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
2644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Bias = 8;
2645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Width = 8;
2646de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "There are " << to_string(Obj->getHeader()->e_shnum)
2648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << " section headers, starting at offset "
2649de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "0x" << to_hexString(Obj->getHeader()->e_shoff, false) << ":\n\n";
2650de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "Section Headers:\n";
2651de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Field Fields[11] = {{"[Nr]", 2},
2652de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Name", 7},
2653de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Type", 25},
2654de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Address", 41},
2655de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Off", 58 - Bias},
2656de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Size", 65 - Bias},
2657de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"ES", 72 - Bias},
2658de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Flg", 75 - Bias},
2659de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Lk", 79 - Bias},
2660de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Inf", 82 - Bias},
2661de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      {"Al", 86 - Bias}};
2662de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &f : Fields)
2663de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printField(f);
2664de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2665de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2666de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
2667de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Number = to_string(SectionIndex);
2668de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[0].Str = Number;
2669de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[1].Str = unwrapOrError(Obj->getSectionName(&Sec));
2670de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Type = getSectionTypeString(Obj->getHeader()->e_machine, Sec.sh_type);
2671de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[2].Str = Type;
2672de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Address = to_string(format_hex_no_prefix(Sec.sh_addr, Width));
2673de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[3].Str = Address;
2674de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Offset = to_string(format_hex_no_prefix(Sec.sh_offset, 6));
2675de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[4].Str = Offset;
2676de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Size = to_string(format_hex_no_prefix(Sec.sh_size, 6));
2677de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[5].Str = Size;
2678de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    EntrySize = to_string(format_hex_no_prefix(Sec.sh_entsize, 2));
2679de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[6].Str = EntrySize;
2680de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Flags = getGNUFlags(Sec.sh_flags);
2681de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[7].Str = Flags;
2682de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Link = to_string(Sec.sh_link);
2683de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[8].Str = Link;
2684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Info = to_string(Sec.sh_info);
2685de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[9].Str = Info;
2686de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Alignment = to_string(Sec.sh_addralign);
2687de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[10].Str = Alignment;
2688de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.PadToColumn(Fields[0].Column);
2689de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "[" << right_justify(Fields[0].Str, 2) << "]";
2690de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (int i = 1; i < 7; i++)
2691de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printField(Fields[i]);
2692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.PadToColumn(Fields[7].Column);
2693de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << right_justify(Fields[7].Str, 3);
2694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.PadToColumn(Fields[8].Column);
2695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << right_justify(Fields[8].Str, 2);
2696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.PadToColumn(Fields[9].Column);
2697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << right_justify(Fields[9].Str, 3);
2698de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.PadToColumn(Fields[10].Column);
2699de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << right_justify(Fields[10].Str, 2);
2700de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n";
2701de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++SectionIndex;
2702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "Key to Flags:\n"
2704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "  W (write), A (alloc), X (execute), M (merge), S (strings), l "
2705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        "(large)\n"
2706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "  I (info), L (link order), G (group), T (TLS), E (exclude),\
2707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar x (unknown)\n"
2708de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "  O (extra OS processing required) o (OS specific),\
2709de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar p (processor specific)\n";
2710de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2712de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2713de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printSymtabMessage(const ELFO *Obj, StringRef Name,
2714de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        size_t Entries) {
2715de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Name.size())
2716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\nSymbol table '" << Name << "' contains " << Entries
2717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " entries:\n";
2718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2719de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n Symbol table for image:\n";
2720de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ELFT::Is64Bits)
2722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "   Num:    Value          Size Type    Bind   Vis      Ndx Name\n";
2723de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2724de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "   Num:    Value  Size Type    Bind   Vis      Ndx Name\n";
2725de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2726de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2727de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2728de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::string GNUStyle<ELFT>::getSymbolSectionNdx(const ELFO *Obj,
2729de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                const Elf_Sym *Symbol,
2730de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                const Elf_Sym *FirstSym) {
2731de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned SectionIndex = Symbol->st_shndx;
2732de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (SectionIndex) {
2733de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHN_UNDEF:
2734de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "UND";
2735de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHN_ABS:
2736de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "ABS";
2737de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHN_COMMON:
2738de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return "COM";
2739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHN_XINDEX:
2740de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SectionIndex = Obj->getExtendedSymbolTableIndex(
2741de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Symbol, FirstSym, this->dumper()->getShndxTable());
2742de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  default:
2743de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Find if:
2744de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Processor specific
2745de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SectionIndex >= ELF::SHN_LOPROC && SectionIndex <= ELF::SHN_HIPROC)
2746de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::string("PRC[0x") +
2747de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             to_string(format_hex_no_prefix(SectionIndex, 4)) + "]";
2748de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // OS specific
2749de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SectionIndex >= ELF::SHN_LOOS && SectionIndex <= ELF::SHN_HIOS)
2750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::string("OS[0x") +
2751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             to_string(format_hex_no_prefix(SectionIndex, 4)) + "]";
2752de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Architecture reserved:
2753de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SectionIndex >= ELF::SHN_LORESERVE &&
2754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        SectionIndex <= ELF::SHN_HIRESERVE)
2755de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::string("RSV[0x") +
2756de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             to_string(format_hex_no_prefix(SectionIndex, 4)) + "]";
2757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // A normal section with an index
2758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return to_string(format_decimal(SectionIndex, 3));
2759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2761de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2762de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printSymbol(const ELFO *Obj, const Elf_Sym *Symbol,
2764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                 const Elf_Sym *FirstSym, StringRef StrTable,
2765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                 bool IsDynamic) {
2766de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static int Idx = 0;
2767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static bool Dynamic = true;
2768de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  size_t Width;
2769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If this function was called with a different value from IsDynamic
2771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // from last call, happens when we move from dynamic to static symbol
2772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // table, "Num" field should be reset.
2773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!Dynamic != !IsDynamic) {
2774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Idx = 0;
2775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Dynamic = false;
2776de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Num, Name, Value, Size, Binding, Type, Visibility, Section;
2778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Bias = 0;
2779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ELFT::Is64Bits) {
2780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Bias = 8;
2781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Width = 16;
2782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
2783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Bias = 0;
2784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Width = 8;
2785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Field Fields[8] = {0,         8,         17 + Bias, 23 + Bias,
2787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     31 + Bias, 38 + Bias, 47 + Bias, 51 + Bias};
2788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Num = to_string(format_decimal(Idx++, 6)) + ":";
2789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Value = to_string(format_hex_no_prefix(Symbol->st_value, Width));
2790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Size = to_string(format_decimal(Symbol->st_size, 5));
2791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned char SymbolType = Symbol->getType();
2792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU &&
2793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SymbolType >= ELF::STT_LOOS && SymbolType < ELF::STT_HIOS)
2794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Type = printEnum(SymbolType, makeArrayRef(AMDGPUSymbolTypes));
2795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Type = printEnum(SymbolType, makeArrayRef(ElfSymbolTypes));
2797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Vis = Symbol->getVisibility();
2798de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Binding = printEnum(Symbol->getBinding(), makeArrayRef(ElfSymbolBindings));
2799de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Visibility = printEnum(Vis, makeArrayRef(ElfSymbolVisibilities));
2800de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Section = getSymbolSectionNdx(Obj, Symbol, FirstSym);
2801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Name = this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic);
2802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[0].Str = Num;
2803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[1].Str = Value;
2804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[2].Str = Size;
2805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[3].Str = Type;
2806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[4].Str = Binding;
2807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[5].Str = Visibility;
2808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[6].Str = Section;
2809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[7].Str = Name;
2810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &Entry : Fields)
2811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printField(Entry);
2812de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
2813de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2814de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2815de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void GNUStyle<ELFT>::printSymbols(const ELFO *Obj) {
2816de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->dumper()->printSymbolsHelper(true);
2817de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->dumper()->printSymbolsHelper(false);
2818de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2819de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2820de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2821de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printDynamicSymbols(const ELFO *Obj) {
2822de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->dumper()->printSymbolsHelper(true);
2823de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic inline std::string printPhdrFlags(unsigned Flag) {
2826de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Str;
2827de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str = (Flag & PF_R) ? "R" : " ";
2828de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str += (Flag & PF_W) ? "W" : " ";
2829de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Str += (Flag & PF_X) ? "E" : " ";
2830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Str;
2831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2833de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// SHF_TLS sections are only in PT_TLS, PT_LOAD or PT_GNU_RELRO
2834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// PT_TLS must only have SHF_TLS sections
2835de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2836de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool GNUStyle<ELFT>::checkTLSSections(const Elf_Phdr &Phdr,
2837de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      const Elf_Shdr &Sec) {
2838de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return (((Sec.sh_flags & ELF::SHF_TLS) &&
2839de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           ((Phdr.p_type == ELF::PT_TLS) || (Phdr.p_type == ELF::PT_LOAD) ||
2840de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            (Phdr.p_type == ELF::PT_GNU_RELRO))) ||
2841de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          (!(Sec.sh_flags & ELF::SHF_TLS) && Phdr.p_type != ELF::PT_TLS));
2842de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2843de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2844de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Non-SHT_NOBITS must have its offset inside the segment
2845de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Only non-zero section can be at end of segment
2846de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2847de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool GNUStyle<ELFT>::checkoffsets(const Elf_Phdr &Phdr, const Elf_Shdr &Sec) {
2848de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sec.sh_type == ELF::SHT_NOBITS)
2849de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
2850de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool IsSpecial =
2851de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      (Sec.sh_type == ELF::SHT_NOBITS) && ((Sec.sh_flags & ELF::SHF_TLS) != 0);
2852de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // .tbss is special, it only has memory in PT_TLS and has NOBITS properties
2853de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto SectionSize =
2854de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      (IsSpecial && Phdr.p_type != ELF::PT_TLS) ? 0 : Sec.sh_size;
2855de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sec.sh_offset >= Phdr.p_offset)
2856de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ((Sec.sh_offset + SectionSize <= Phdr.p_filesz + Phdr.p_offset)
2857de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            /*only non-zero sized sections at end*/ &&
2858de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            (Sec.sh_offset + 1 <= Phdr.p_offset + Phdr.p_filesz));
2859de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
2860de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2861de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2862de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// SHF_ALLOC must have VMA inside segment
2863de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Only non-zero section can be at end of segment
2864de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2865de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool GNUStyle<ELFT>::checkVMA(const Elf_Phdr &Phdr, const Elf_Shdr &Sec) {
2866de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!(Sec.sh_flags & ELF::SHF_ALLOC))
2867de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
2868de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool IsSpecial =
2869de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      (Sec.sh_type == ELF::SHT_NOBITS) && ((Sec.sh_flags & ELF::SHF_TLS) != 0);
2870de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // .tbss is special, it only has memory in PT_TLS and has NOBITS properties
2871de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto SectionSize =
2872de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      (IsSpecial && Phdr.p_type != ELF::PT_TLS) ? 0 : Sec.sh_size;
2873de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sec.sh_addr >= Phdr.p_vaddr)
2874de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ((Sec.sh_addr + SectionSize <= Phdr.p_vaddr + Phdr.p_memsz) &&
2875de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            (Sec.sh_addr + 1 <= Phdr.p_vaddr + Phdr.p_memsz));
2876de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
2877de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2878de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2879de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// No section with zero size must be at start or end of PT_DYNAMIC
2880de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2881de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool GNUStyle<ELFT>::checkPTDynamic(const Elf_Phdr &Phdr, const Elf_Shdr &Sec) {
2882de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Phdr.p_type != ELF::PT_DYNAMIC || Sec.sh_size != 0 || Phdr.p_memsz == 0)
2883de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
2884de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Is section within the phdr both based on offset and VMA ?
2885de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ((Sec.sh_type == ELF::SHT_NOBITS) ||
2886de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          (Sec.sh_offset > Phdr.p_offset &&
2887de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           Sec.sh_offset < Phdr.p_offset + Phdr.p_filesz)) &&
2888de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         (!(Sec.sh_flags & ELF::SHF_ALLOC) ||
2889de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          (Sec.sh_addr > Phdr.p_vaddr && Sec.sh_addr < Phdr.p_memsz));
2890de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2891de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2892de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2893de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {
2894de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Bias = ELFT::Is64Bits ? 8 : 0;
2895de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Width = ELFT::Is64Bits ? 18 : 10;
2896de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned SizeWidth = ELFT::Is64Bits ? 8 : 7;
2897de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Type, Offset, VMA, LMA, FileSz, MemSz, Flag, Align;
2898de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2899de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Ehdr *Header = Obj->getHeader();
2900de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Field Fields[8] = {2,         17,        26,        37 + Bias,
2901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     48 + Bias, 56 + Bias, 64 + Bias, 68 + Bias};
2902de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\nElf file type is "
2903de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << printEnum(Header->e_type, makeArrayRef(ElfObjectFileType)) << "\n"
2904de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "Entry point " << format_hex(Header->e_entry, 3) << "\n"
2905de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "There are " << Header->e_phnum << " program headers,"
2906de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << " starting at offset " << Header->e_phoff << "\n\n"
2907de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar     << "Program Headers:\n";
2908de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ELFT::Is64Bits)
2909de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "  Type           Offset   VirtAddr           PhysAddr         "
2910de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << "  FileSiz  MemSiz   Flg Align\n";
2911de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
2912de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "  Type           Offset   VirtAddr   PhysAddr   FileSiz "
2913de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << "MemSiz  Flg Align\n";
2914de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const auto &Phdr : Obj->program_headers()) {
2915de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Type = getElfPtType(Header->e_machine, Phdr.p_type);
2916de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Offset = to_string(format_hex(Phdr.p_offset, 8));
2917de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    VMA = to_string(format_hex(Phdr.p_vaddr, Width));
2918de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LMA = to_string(format_hex(Phdr.p_paddr, Width));
2919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    FileSz = to_string(format_hex(Phdr.p_filesz, SizeWidth));
2920de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MemSz = to_string(format_hex(Phdr.p_memsz, SizeWidth));
2921de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Flag = printPhdrFlags(Phdr.p_flags);
2922de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Align = to_string(format_hex(Phdr.p_align, 1));
2923de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[0].Str = Type;
2924de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[1].Str = Offset;
2925de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[2].Str = VMA;
2926de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[3].Str = LMA;
2927de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[4].Str = FileSz;
2928de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[5].Str = MemSz;
2929de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[6].Str = Flag;
2930de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Fields[7].Str = Align;
2931de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto Field : Fields)
2932de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printField(Field);
2933de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Phdr.p_type == ELF::PT_INTERP) {
2934de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << "\n      [Requesting program interpreter: ";
2935de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << reinterpret_cast<const char *>(Obj->base()) + Phdr.p_offset << "]";
2936de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2937de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n";
2938de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2939de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n Section to Segment mapping:\n  Segment Sections...\n";
2940de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int Phnum = 0;
2941de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Phdr &Phdr : Obj->program_headers()) {
2942de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::string Sections;
2943de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << format("   %2.2d     ", Phnum++);
2944de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Shdr &Sec : Obj->sections()) {
2945de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Check if each section is in a segment and then print mapping.
2946de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // readelf additionally makes sure it does not print zero sized sections
2947de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // at end of segments and for PT_DYNAMIC both start and end of section
2948de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // .tbss must only be shown in PT_TLS section.
2949de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      bool TbssInNonTLS = (Sec.sh_type == ELF::SHT_NOBITS) &&
2950de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          ((Sec.sh_flags & ELF::SHF_TLS) != 0) &&
2951de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          Phdr.p_type != ELF::PT_TLS;
2952de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (!TbssInNonTLS && checkTLSSections(Phdr, Sec) &&
2953de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          checkoffsets(Phdr, Sec) && checkVMA(Phdr, Sec) &&
2954de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          checkPTDynamic(Phdr, Sec) && (Sec.sh_type != ELF::SHT_NULL))
2955de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + " ";
2956de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
2957de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << Sections << "\n";
2958de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS.flush();
2959de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2960de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
2961de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2962de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
2963de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela R,
2964de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            bool IsRela) {
2965de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallString<32> RelocName;
2966de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef SymbolName;
2967de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Width = ELFT::Is64Bits ? 16 : 8;
2968de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Bias = ELFT::Is64Bits ? 8 : 0;
2969de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // First two fields are bit width dependent. The rest of them are after are
2970de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // fixed width.
2971de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Field Fields[5] = {0, 10 + Bias, 19 + 2 * Bias, 42 + 2 * Bias, 53 + 2 * Bias};
2972de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2973de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t SymIndex = R.getSymbol(Obj->isMips64EL());
2974de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex;
2975de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Obj->getRelocationTypeName(R.getType(Obj->isMips64EL()), RelocName);
2976de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SymbolName =
2977de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable()));
2978de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Addend = "", Info, Offset, Value;
2979de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Offset = to_string(format_hex_no_prefix(R.r_offset, Width));
2980de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Info = to_string(format_hex_no_prefix(R.r_info, Width));
2981de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Value = to_string(format_hex_no_prefix(Sym->getValue(), Width));
2982de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t RelAddend = R.r_addend;
2983de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (SymbolName.size() && IsRela) {
2984de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (R.r_addend < 0)
2985de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Addend = " - ";
2986de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
2987de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Addend = " + ";
2988de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
2989de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2990de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!SymbolName.size() && Sym->getValue() == 0)
2991de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = "";
2992de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2993de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IsRela)
2994de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Addend += to_string(format_hex_no_prefix(std::abs(RelAddend), 1));
2995de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2996de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2997de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[0].Str = Offset;
2998de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[1].Str = Info;
2999de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[2].Str = RelocName.c_str();
3000de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[3].Str = Value;
3001de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Fields[4].Str = SymbolName;
3002de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &Field : Fields)
3003de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printField(Field);
3004de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << Addend;
3005de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OS << "\n";
3006de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3007de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3008de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3009de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {
3010de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynRelRegion = this->dumper()->getDynRelRegion();
3011de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion();
3012de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion();
3013de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynRelaRegion.Size > 0) {
3014de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n'RELA' relocation section at offset "
3015de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << format_hex(reinterpret_cast<const uint8_t *>(DynRelaRegion.Addr) -
3016de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         Obj->base(),
3017de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     1) << " contains " << DynRelaRegion.Size << " bytes:\n";
3018de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocHeader(OS, ELFT::Is64Bits, true);
3019de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rela &Rela : this->dumper()->dyn_relas())
3020de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela, true);
3021de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3022de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynRelRegion.Size > 0) {
3023de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n'REL' relocation section at offset "
3024de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << format_hex(reinterpret_cast<const uint8_t *>(DynRelRegion.Addr) -
3025de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         Obj->base(),
3026de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     1) << " contains " << DynRelRegion.Size << " bytes:\n";
3027de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocHeader(OS, ELFT::Is64Bits, false);
3028de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) {
3029de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Elf_Rela Rela;
3030de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_offset = Rel.r_offset;
3031de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_info = Rel.r_info;
3032de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_addend = 0;
3033de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela, false);
3034de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3035de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3036de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynPLTRelRegion.Size) {
3037de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "\n'PLT' relocation section at offset "
3038de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << format_hex(reinterpret_cast<const uint8_t *>(DynPLTRelRegion.Addr) -
3039de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         Obj->base(),
3040de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     1) << " contains " << DynPLTRelRegion.Size << " bytes:\n";
3041de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3042de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynPLTRelRegion.EntSize == sizeof(Elf_Rela)) {
3043de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocHeader(OS, ELFT::Is64Bits, true);
3044de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rela &Rela : DynPLTRelRegion.getAsArrayRef<Elf_Rela>())
3045de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela, true);
3046de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
3047de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocHeader(OS, ELFT::Is64Bits, false);
3048de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rel &Rel : DynPLTRelRegion.getAsArrayRef<Elf_Rel>()) {
3049de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Elf_Rela Rela;
3050de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_offset = Rel.r_offset;
3051de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_info = Rel.r_info;
3052de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_addend = 0;
3053de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela, false);
3054de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3055de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3056de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3057de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3058de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Hash histogram shows  statistics of how efficient the hash was for the
3059de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// dynamic symbol table. The table shows number of hash buckets for different
3060de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// lengths of chains as absolute number and percentage of the total buckets.
3061de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Additionally cumulative coverage of symbols for each set of buckets.
3062de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3063de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid GNUStyle<ELFT>::printHashHistogram(const ELFFile<ELFT> *Obj) {
3064de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3065de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Hash *HashTable = this->dumper()->getHashTable();
3066de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_GnuHash *GnuHashTable = this->dumper()->getGnuHashTable();
3067de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3068de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Print histogram for .hash section
3069de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (HashTable) {
3070de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t NBucket = HashTable->nbucket;
3071de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t NChain = HashTable->nchain;
3072de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<Elf_Word> Buckets = HashTable->buckets();
3073de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<Elf_Word> Chains = HashTable->chains();
3074de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t TotalSyms = 0;
3075de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // If hash table is correct, we have at least chains with 0 length
3076de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t MaxChain = 1;
3077de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t CumulativeNonZero = 0;
3078de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3079de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (NChain == 0 || NBucket == 0)
3080de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
3081de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3082de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<size_t> ChainLen(NBucket, 0);
3083de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Go over all buckets and and note chain lengths of each bucket (total
3084de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // unique chain lengths).
3085de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t B = 0; B < NBucket; B++) {
3086de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (size_t C = Buckets[B]; C > 0 && C < NChain; C = Chains[C])
3087de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (MaxChain <= ++ChainLen[B])
3088de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          MaxChain++;
3089de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TotalSyms += ChainLen[B];
3090de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3091de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3092de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!TotalSyms)
3093de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
3094de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3095de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<size_t> Count(MaxChain, 0) ;
3096de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Count how long is the chain for each bucket
3097de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t B = 0; B < NBucket; B++)
3098de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ++Count[ChainLen[B]];
3099de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Print Number of buckets with each chain lengths and their cumulative
3100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // coverage of the symbols
3101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "Histogram for bucket list length (total of " << NBucket
3102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " buckets)\n"
3103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " Length  Number     % of total  Coverage\n";
3104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t I = 0; I < MaxChain; I++) {
3105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      CumulativeNonZero += Count[I] * I;
3106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << format("%7lu  %-10lu (%5.1f%%)     %5.1f%%\n", I, Count[I],
3107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   (Count[I] * 100.0) / NBucket,
3108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   (CumulativeNonZero * 100.0) / TotalSyms);
3109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Print histogram for .gnu.hash section
3113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (GnuHashTable) {
3114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t NBucket = GnuHashTable->nbuckets;
3115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<Elf_Word> Buckets = GnuHashTable->buckets();
3116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned NumSyms = this->dumper()->dynamic_symbols().size();
3117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!NumSyms)
3118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
3119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<Elf_Word> Chains = GnuHashTable->values(NumSyms);
3120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t Symndx = GnuHashTable->symndx;
3121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t TotalSyms = 0;
3122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t MaxChain = 1;
3123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    size_t CumulativeNonZero = 0;
3124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Chains.size() == 0 || NBucket == 0)
3126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
3127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<size_t> ChainLen(NBucket, 0);
3129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t B = 0; B < NBucket; B++) {
3131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (!Buckets[B])
3132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        continue;
3133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      size_t Len = 1;
3134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (size_t C = Buckets[B] - Symndx;
3135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           C < Chains.size() && (Chains[C] & 1) == 0; C++)
3136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (MaxChain < ++Len)
3137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          MaxChain++;
3138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ChainLen[B] = Len;
3139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TotalSyms += Len;
3140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MaxChain++;
3142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!TotalSyms)
3144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
3145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<size_t> Count(MaxChain, 0) ;
3147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t B = 0; B < NBucket; B++)
3148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ++Count[ChainLen[B]];
3149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Print Number of buckets with each chain lengths and their cumulative
3150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // coverage of the symbols
3151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << "Histogram for `.gnu.hash' bucket list length (total of " << NBucket
3152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " buckets)\n"
3153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << " Length  Number     % of total  Coverage\n";
3154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (size_t I = 0; I <MaxChain; I++) {
3155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      CumulativeNonZero += Count[I] * I;
3156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << format("%7lu  %-10lu (%5.1f%%)     %5.1f%%\n", I, Count[I],
3157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   (Count[I] * 100.0) / NBucket,
3158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   (CumulativeNonZero * 100.0) / TotalSyms);
3159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void LLVMStyle<ELFT>::printFileHeaders(const ELFO *Obj) {
3164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Ehdr *e = Obj->getHeader();
3165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
3166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope D(W, "ElfHeader");
3167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {
3168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DictScope D(W, "Ident");
3169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printBinary("Magic", makeArrayRef(e->e_ident).slice(ELF::EI_MAG0, 4));
3170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printEnum("Class", e->e_ident[ELF::EI_CLASS], makeArrayRef(ElfClass));
3171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printEnum("DataEncoding", e->e_ident[ELF::EI_DATA],
3172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  makeArrayRef(ElfDataEncoding));
3173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("FileVersion", e->e_ident[ELF::EI_VERSION]);
3174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Handle architecture specific OS/ABI values.
3176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (e->e_machine == ELF::EM_AMDGPU &&
3177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          e->e_ident[ELF::EI_OSABI] == ELF::ELFOSABI_AMDGPU_HSA)
3178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        W.printHex("OS/ABI", "AMDGPU_HSA", ELF::ELFOSABI_AMDGPU_HSA);
3179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else
3180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        W.printEnum("OS/ABI", e->e_ident[ELF::EI_OSABI],
3181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    makeArrayRef(ElfOSABI));
3182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("ABIVersion", e->e_ident[ELF::EI_ABIVERSION]);
3183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printBinary("Unused", makeArrayRef(e->e_ident).slice(ELF::EI_PAD));
3184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printEnum("Type", e->e_type, makeArrayRef(ElfObjectFileType));
3187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printEnum("Machine", e->e_machine, makeArrayRef(ElfMachineType));
3188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Version", e->e_version);
3189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Entry", e->e_entry);
3190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("ProgramHeaderOffset", e->e_phoff);
3191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("SectionHeaderOffset", e->e_shoff);
3192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (e->e_machine == EM_MIPS)
3193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printFlags("Flags", e->e_flags, makeArrayRef(ElfHeaderMipsFlags),
3194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   unsigned(ELF::EF_MIPS_ARCH), unsigned(ELF::EF_MIPS_ABI),
3195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   unsigned(ELF::EF_MIPS_MACH));
3196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
3197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printFlags("Flags", e->e_flags);
3198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("HeaderSize", e->e_ehsize);
3199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("ProgramHeaderEntrySize", e->e_phentsize);
3200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("ProgramHeaderCount", e->e_phnum);
3201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("SectionHeaderEntrySize", e->e_shentsize);
3202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("SectionHeaderCount", e->e_shnum);
3203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("StringTableSectionIndex", e->e_shstrndx);
3204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) {
3209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope Lists(W, "Groups");
3210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t SectionIndex = 0;
3211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool HasGroups = false;
3212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
3213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.sh_type == ELF::SHT_GROUP) {
3214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      HasGroups = true;
3215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
3216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
3217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const Elf_Sym *Sym = Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
3218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      auto Data = unwrapOrError(
3219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
3220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DictScope D(W, "Group");
3221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
3222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("Name", Name, Sec.sh_name);
3223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber("Index", SectionIndex);
3224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printHex("Type", getGroupType(Data[0]), Data[0]);
3225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.startLine() << "Signature: " << StrTable.data() + Sym->st_name << "\n";
3226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      {
3227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ListScope L(W, "Section(s) in group");
3228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        size_t Member = 1;
3229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        while (Member < Data.size()) {
3230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          auto Sec = unwrapOrError(Obj->getSection(Data[Member]));
3231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
3232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          W.startLine() << Name << " (" << Data[Member++] << ")\n";
3233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        }
3234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
3235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++SectionIndex;
3237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!HasGroups)
3239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "There are no group sections in the file.\n";
3240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {
3243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope D(W, "Relocations");
3244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int SectionNumber = -1;
3246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
3247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++SectionNumber;
3248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)
3250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      continue;
3251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
3253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
3255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.indent();
3256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    printRelocations(&Sec, Obj);
3258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.unindent();
3260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.startLine() << "}\n";
3261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printRelocations(const Elf_Shdr *Sec, const ELFO *Obj) {
3266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link));
3267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  switch (Sec->sh_type) {
3269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHT_REL:
3270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rel &R : Obj->rels(Sec)) {
3271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Elf_Rela Rela;
3272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_offset = R.r_offset;
3273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_info = R.r_info;
3274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_addend = 0;
3275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printRelocation(Obj, Rela, SymTab);
3276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
3278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ELF::SHT_RELA:
3279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rela &R : Obj->relas(Sec))
3280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printRelocation(Obj, R, SymTab);
3281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
3282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printRelocation(const ELFO *Obj, Elf_Rela Rel,
3287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      const Elf_Shdr *SymTab) {
3288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallString<32> RelocName;
3289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);
3290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef TargetName;
3291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *Sym = Obj->getRelocationSymbol(&Rel, SymTab);
3292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Sym && Sym->getType() == ELF::STT_SECTION) {
3293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Elf_Shdr *Sec = unwrapOrError(
3294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable()));
3295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TargetName = unwrapOrError(Obj->getSectionName(Sec));
3296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (Sym) {
3297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab));
3298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    TargetName = unwrapOrError(Sym->getName(StrTable));
3299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (opts::ExpandRelocs) {
3302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope Group(W, "Relocation");
3303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Offset", Rel.r_offset);
3304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));
3305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-",
3306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  Rel.getSymbol(Obj->isMips64EL()));
3307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Addend", Rel.r_addend);
3308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
3309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_ostream &OS = W.startLine();
3310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << W.hex(Rel.r_offset) << " " << RelocName << " "
3311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << (TargetName.size() > 0 ? TargetName : "-") << " "
3312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << W.hex(Rel.r_addend) << "\n";
3313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void LLVMStyle<ELFT>::printSections(const ELFO *Obj) {
3317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope SectionsD(W, "Sections");
3318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int SectionIndex = -1;
3320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Shdr &Sec : Obj->sections()) {
3321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ++SectionIndex;
3322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
3324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope SectionD(W, "Section");
3326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Index", SectionIndex);
3327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Name", Name, Sec.sh_name);
3328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Type",
3329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),
3330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               Sec.sh_type);
3331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<EnumEntry<unsigned>> SectionFlags(std::begin(ElfSectionFlags),
3332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  std::end(ElfSectionFlags));
3333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Obj->getHeader()->e_machine) {
3334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case EM_AMDGPU:
3335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SectionFlags.insert(SectionFlags.end(), std::begin(ElfAMDGPUSectionFlags),
3336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::end(ElfAMDGPUSectionFlags));
3337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case EM_HEXAGON:
3339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SectionFlags.insert(SectionFlags.end(),
3340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::begin(ElfHexagonSectionFlags),
3341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::end(ElfHexagonSectionFlags));
3342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case EM_MIPS:
3344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SectionFlags.insert(SectionFlags.end(), std::begin(ElfMipsSectionFlags),
3345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::end(ElfMipsSectionFlags));
3346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case EM_X86_64:
3348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SectionFlags.insert(SectionFlags.end(), std::begin(ElfX86_64SectionFlags),
3349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::end(ElfX86_64SectionFlags));
3350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case EM_XCORE:
3352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SectionFlags.insert(SectionFlags.end(), std::begin(ElfXCoreSectionFlags),
3353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          std::end(ElfXCoreSectionFlags));
3354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    default:
3356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Nothing to do.
3357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
3358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags));
3360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Address", Sec.sh_addr);
3361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Offset", Sec.sh_offset);
3362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Size", Sec.sh_size);
3363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Link", Sec.sh_link);
3364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Info", Sec.sh_info);
3365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("AddressAlignment", Sec.sh_addralign);
3366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("EntrySize", Sec.sh_entsize);
3367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (opts::SectionRelocations) {
3369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ListScope D(W, "Relocations");
3370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printRelocations(&Sec, Obj);
3371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (opts::SectionSymbols) {
3374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ListScope D(W, "Symbols");
3375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const Elf_Shdr *Symtab = this->dumper()->getDotSymtabSec();
3376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
3377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (const Elf_Sym &Sym : Obj->symbols(Symtab)) {
3379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        const Elf_Shdr *SymSec = unwrapOrError(
3380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable()));
3381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (SymSec == &Sec)
3382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          printSymbol(Obj, &Sym, Obj->symbol_begin(Symtab), StrTable, false);
3383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
3384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {
3387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec));
3388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printBinaryBlock("SectionData",
3389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         StringRef((const char *)Data.data(), Data.size()));
3390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printSymbol(const ELFO *Obj, const Elf_Sym *Symbol,
3396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  const Elf_Sym *First, StringRef StrTable,
3397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  bool IsDynamic) {
3398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned SectionIndex = 0;
3399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef SectionName;
3400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getSectionNameIndex(*Obj, Symbol, First, this->dumper()->getShndxTable(),
3401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      SectionName, SectionIndex);
3402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string FullSymbolName =
3403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic);
3404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned char SymbolType = Symbol->getType();
3405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope D(W, "Symbol");
3407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Name", FullSymbolName, Symbol->st_name);
3408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Value", Symbol->st_value);
3409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Size", Symbol->st_size);
3410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Binding", Symbol->getBinding(), makeArrayRef(ElfSymbolBindings));
3411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU &&
3412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SymbolType >= ELF::STT_LOOS && SymbolType < ELF::STT_HIOS)
3413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printEnum("Type", SymbolType, makeArrayRef(AMDGPUSymbolTypes));
3414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
3415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printEnum("Type", SymbolType, makeArrayRef(ElfSymbolTypes));
3416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Symbol->st_other == 0)
3417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Usually st_other flag is zero. Do not pollute the output
3418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // by flags enumeration in that case.
3419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Other", 0);
3420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else {
3421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::vector<EnumEntry<unsigned>> SymOtherFlags(std::begin(ElfSymOtherFlags),
3422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                   std::end(ElfSymOtherFlags));
3423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Obj->getHeader()->e_machine == EM_MIPS) {
3424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Someones in their infinite wisdom decided to make STO_MIPS_MIPS16
3425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // flag overlapped with other ST_MIPS_xxx flags. So consider both
3426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // cases separately.
3427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if ((Symbol->st_other & STO_MIPS_MIPS16) == STO_MIPS_MIPS16)
3428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        SymOtherFlags.insert(SymOtherFlags.end(),
3429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             std::begin(ElfMips16SymOtherFlags),
3430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             std::end(ElfMips16SymOtherFlags));
3431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      else
3432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        SymOtherFlags.insert(SymOtherFlags.end(),
3433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             std::begin(ElfMipsSymOtherFlags),
3434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             std::end(ElfMipsSymOtherFlags));
3435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printFlags("Other", Symbol->st_other, makeArrayRef(SymOtherFlags), 0x3u);
3437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Section", SectionName, SectionIndex);
3439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT> void LLVMStyle<ELFT>::printSymbols(const ELFO *Obj) {
3442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope Group(W, "Symbols");
3443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->dumper()->printSymbolsHelper(false);
3444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printDynamicSymbols(const ELFO *Obj) {
3448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope Group(W, "DynamicSymbols");
3449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->dumper()->printSymbolsHelper(true);
3450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {
3454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynRelRegion = this->dumper()->getDynRelRegion();
3455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion();
3456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion();
3457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynRelRegion.Size && DynRelaRegion.Size)
3458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("There are both REL and RELA dynamic relocations");
3459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.startLine() << "Dynamic Relocations {\n";
3460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.indent();
3461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynRelaRegion.Size > 0)
3462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rela &Rela : this->dumper()->dyn_relas())
3463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela);
3464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
3465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) {
3466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Elf_Rela Rela;
3467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_offset = Rel.r_offset;
3468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_info = Rel.r_info;
3469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_addend = 0;
3470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela);
3471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DynPLTRelRegion.EntSize == sizeof(Elf_Rela))
3473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rela &Rela : DynPLTRelRegion.getAsArrayRef<Elf_Rela>())
3474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela);
3475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else
3476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (const Elf_Rel &Rel : DynPLTRelRegion.getAsArrayRef<Elf_Rel>()) {
3477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Elf_Rela Rela;
3478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_offset = Rel.r_offset;
3479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_info = Rel.r_info;
3480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Rela.r_addend = 0;
3481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      printDynamicRelocation(Obj, Rela);
3482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
3483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.unindent();
3484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.startLine() << "}\n";
3485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela Rel) {
3489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallString<32> RelocName;
3490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);
3491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef SymbolName;
3492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());
3493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex;
3494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SymbolName =
3495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable()));
3496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (opts::ExpandRelocs) {
3497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope Group(W, "Relocation");
3498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Offset", Rel.r_offset);
3499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));
3500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
3501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Addend", Rel.r_addend);
3502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
3503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_ostream &OS = W.startLine();
3504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OS << W.hex(Rel.r_offset) << " " << RelocName << " "
3505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << (SymbolName.size() > 0 ? SymbolName : "-") << " "
3506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar       << W.hex(Rel.r_addend) << "\n";
3507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {
3512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope L(W, "ProgramHeaders");
3513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
3514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const Elf_Phdr &Phdr : Obj->program_headers()) {
3515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope P(W, "ProgramHeader");
3516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Type",
3517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type),
3518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               Phdr.p_type);
3519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Offset", Phdr.p_offset);
3520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("VirtualAddress", Phdr.p_vaddr);
3521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("PhysicalAddress", Phdr.p_paddr);
3522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("FileSize", Phdr.p_filesz);
3523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("MemSize", Phdr.p_memsz);
3524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printFlags("Flags", Phdr.p_flags, makeArrayRef(ElfSegmentFlags));
3525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printNumber("Alignment", Phdr.p_align);
3526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
3527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <class ELFT>
3529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMStyle<ELFT>::printHashHistogram(const ELFFile<ELFT> *Obj) {
3530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.startLine() << "Hash Histogram not implemented!\n";
3531f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
3532