Support printing relocations in files with no section table.
[oota-llvm.git] / tools / llvm-readobj / ELFDumper.cpp
1 //===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file implements the ELF-specific dumper for llvm-readobj.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm-readobj.h"
16 #include "ARMAttributeParser.h"
17 #include "ARMEHABIPrinter.h"
18 #include "Error.h"
19 #include "ObjDumper.h"
20 #include "StackMapPrinter.h"
21 #include "StreamWriter.h"
22 #include "llvm/ADT/Optional.h"
23 #include "llvm/ADT/SmallString.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/Object/ELFObjectFile.h"
26 #include "llvm/Support/ARMBuildAttributes.h"
27 #include "llvm/Support/Compiler.h"
28 #include "llvm/Support/Format.h"
29 #include "llvm/Support/MathExtras.h"
30 #include "llvm/Support/MipsABIFlags.h"
31 #include "llvm/Support/raw_ostream.h"
32
33 using namespace llvm;
34 using namespace llvm::object;
35 using namespace ELF;
36
37 #define LLVM_READOBJ_ENUM_CASE(ns, enum) \
38   case ns::enum: return #enum;
39
40 namespace {
41
42 template<typename ELFT>
43 class ELFDumper : public ObjDumper {
44 public:
45   ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer);
46
47   void printFileHeaders() override;
48   void printSections() override;
49   void printRelocations() override;
50   void printDynamicRelocations() override;
51   void printSymbols() override;
52   void printDynamicSymbols() override;
53   void printUnwindInfo() override;
54
55   void printDynamicTable() override;
56   void printNeededLibraries() override;
57   void printProgramHeaders() override;
58   void printHashTable() override;
59   void printLoadName() override;
60
61   void printAttributes() override;
62   void printMipsPLTGOT() override;
63   void printMipsABIFlags() override;
64   void printMipsReginfo() override;
65
66   void printStackMap() const override;
67
68 private:
69   typedef ELFFile<ELFT> ELFO;
70   typedef typename ELFO::Elf_Shdr Elf_Shdr;
71   typedef typename ELFO::Elf_Sym Elf_Sym;
72   typedef typename ELFO::Elf_Dyn Elf_Dyn;
73   typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;
74   typedef typename ELFO::Elf_Rel Elf_Rel;
75   typedef typename ELFO::Elf_Rela Elf_Rela;
76   typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range;
77   typedef typename ELFO::Elf_Phdr Elf_Phdr;
78   typedef typename ELFO::Elf_Hash Elf_Hash;
79   typedef typename ELFO::Elf_Ehdr Elf_Ehdr;
80   typedef typename ELFO::uintX_t uintX_t;
81
82   /// \brief Represents a region described by entries in the .dynamic table.
83   struct DynRegionInfo {
84     DynRegionInfo() : Addr(nullptr), Size(0), EntSize(0) {}
85     /// \brief Address in current address space.
86     const void *Addr;
87     /// \brief Size in bytes of the region.
88     uintX_t Size;
89     /// \brief Size of each entity in the region.
90     uintX_t EntSize;
91   };
92
93   void printSymbol(const Elf_Sym *Symbol, StringRef StrTable, bool IsDynamic);
94
95   void printRelocations(const Elf_Shdr *Sec);
96   void printRelocation(const Elf_Shdr *Sec, Elf_Rela Rel);
97   void printValue(uint64_t Type, uint64_t Value);
98
99   const Elf_Rela *dyn_rela_begin() const;
100   const Elf_Rela *dyn_rela_end() const;
101   Elf_Rela_Range dyn_relas() const;
102   StringRef getDynamicString(uint64_t Offset) const;
103   const Elf_Dyn *dynamic_table_begin() const;
104   const Elf_Dyn *dynamic_table_end() const;
105   Elf_Dyn_Range dynamic_table() const {
106     return make_range(dynamic_table_begin(), dynamic_table_end());
107   }
108
109   const ELFO *Obj;
110   DynRegionInfo DynRelaRegion;
111   DynRegionInfo DynamicRegion;
112   StringRef DynamicStringTable;
113   const Elf_Sym *DynSymStart = nullptr;
114   StringRef SOName;
115   const Elf_Hash *HashTable = nullptr;
116 };
117
118 template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) {
119   if (!Val) {
120     error(Val.getError());
121     return Default;
122   }
123
124   return *Val;
125 }
126 } // namespace
127
128 namespace llvm {
129
130 template <class ELFT>
131 static std::error_code createELFDumper(const ELFFile<ELFT> *Obj,
132                                        StreamWriter &Writer,
133                                        std::unique_ptr<ObjDumper> &Result) {
134   Result.reset(new ELFDumper<ELFT>(Obj, Writer));
135   return readobj_error::success;
136 }
137
138 std::error_code createELFDumper(const object::ObjectFile *Obj,
139                                 StreamWriter &Writer,
140                                 std::unique_ptr<ObjDumper> &Result) {
141   // Little-endian 32-bit
142   if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
143     return createELFDumper(ELFObj->getELFFile(), Writer, Result);
144
145   // Big-endian 32-bit
146   if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
147     return createELFDumper(ELFObj->getELFFile(), Writer, Result);
148
149   // Little-endian 64-bit
150   if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
151     return createELFDumper(ELFObj->getELFFile(), Writer, Result);
152
153   // Big-endian 64-bit
154   if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
155     return createELFDumper(ELFObj->getELFFile(), Writer, Result);
156
157   return readobj_error::unsupported_obj_file_format;
158 }
159
160 } // namespace llvm
161
162 template <typename ELFO>
163 static std::string getFullSymbolName(const ELFO &Obj,
164                                      const typename ELFO::Elf_Sym *Symbol,
165                                      StringRef StrTable, bool IsDynamic) {
166   StringRef SymbolName = errorOrDefault(Symbol->getName(StrTable));
167   if (!IsDynamic)
168     return SymbolName;
169
170   std::string FullSymbolName(SymbolName);
171
172   bool IsDefault;
173   ErrorOr<StringRef> Version =
174       Obj.getSymbolVersion(StrTable, &*Symbol, IsDefault);
175   if (Version) {
176     FullSymbolName += (IsDefault ? "@@" : "@");
177     FullSymbolName += *Version;
178   } else
179     error(Version.getError());
180   return FullSymbolName;
181 }
182
183 template <typename ELFO>
184 static void
185 getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol,
186                     StringRef &SectionName, unsigned &SectionIndex) {
187   SectionIndex = Symbol->st_shndx;
188   if (Symbol->isUndefined())
189     SectionName = "Undefined";
190   else if (Symbol->isProcessorSpecific())
191     SectionName = "Processor Specific";
192   else if (Symbol->isOSSpecific())
193     SectionName = "Operating System Specific";
194   else if (Symbol->isAbsolute())
195     SectionName = "Absolute";
196   else if (Symbol->isCommon())
197     SectionName = "Common";
198   else if (Symbol->isReserved() && SectionIndex != SHN_XINDEX)
199     SectionName = "Reserved";
200   else {
201     if (SectionIndex == SHN_XINDEX)
202       SectionIndex = Obj.getExtendedSymbolTableIndex(&*Symbol);
203     ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex);
204     error(Sec.getError());
205     SectionName = errorOrDefault(Obj.getSectionName(*Sec));
206   }
207 }
208
209 template <class ELFO>
210 static const typename ELFO::Elf_Shdr *findSectionByAddress(const ELFO *Obj,
211                                                            uint64_t Addr) {
212   for (const auto &Shdr : Obj->sections())
213     if (Shdr.sh_addr == Addr)
214       return &Shdr;
215   return nullptr;
216 }
217
218 template <class ELFO>
219 static const typename ELFO::Elf_Shdr *findSectionByName(const ELFO &Obj,
220                                                         StringRef Name) {
221   for (const auto &Shdr : Obj.sections()) {
222     if (Name == errorOrDefault(Obj.getSectionName(&Shdr)))
223       return &Shdr;
224   }
225   return nullptr;
226 }
227
228 static const EnumEntry<unsigned> ElfClass[] = {
229   { "None",   ELF::ELFCLASSNONE },
230   { "32-bit", ELF::ELFCLASS32   },
231   { "64-bit", ELF::ELFCLASS64   },
232 };
233
234 static const EnumEntry<unsigned> ElfDataEncoding[] = {
235   { "None",         ELF::ELFDATANONE },
236   { "LittleEndian", ELF::ELFDATA2LSB },
237   { "BigEndian",    ELF::ELFDATA2MSB },
238 };
239
240 static const EnumEntry<unsigned> ElfObjectFileType[] = {
241   { "None",         ELF::ET_NONE },
242   { "Relocatable",  ELF::ET_REL  },
243   { "Executable",   ELF::ET_EXEC },
244   { "SharedObject", ELF::ET_DYN  },
245   { "Core",         ELF::ET_CORE },
246 };
247
248 static const EnumEntry<unsigned> ElfOSABI[] = {
249   { "SystemV",      ELF::ELFOSABI_NONE         },
250   { "HPUX",         ELF::ELFOSABI_HPUX         },
251   { "NetBSD",       ELF::ELFOSABI_NETBSD       },
252   { "GNU/Linux",    ELF::ELFOSABI_LINUX        },
253   { "GNU/Hurd",     ELF::ELFOSABI_HURD         },
254   { "Solaris",      ELF::ELFOSABI_SOLARIS      },
255   { "AIX",          ELF::ELFOSABI_AIX          },
256   { "IRIX",         ELF::ELFOSABI_IRIX         },
257   { "FreeBSD",      ELF::ELFOSABI_FREEBSD      },
258   { "TRU64",        ELF::ELFOSABI_TRU64        },
259   { "Modesto",      ELF::ELFOSABI_MODESTO      },
260   { "OpenBSD",      ELF::ELFOSABI_OPENBSD      },
261   { "OpenVMS",      ELF::ELFOSABI_OPENVMS      },
262   { "NSK",          ELF::ELFOSABI_NSK          },
263   { "AROS",         ELF::ELFOSABI_AROS         },
264   { "FenixOS",      ELF::ELFOSABI_FENIXOS      },
265   { "CloudABI",     ELF::ELFOSABI_CLOUDABI     },
266   { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI },
267   { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX  },
268   { "ARM",          ELF::ELFOSABI_ARM          },
269   { "Standalone"  , ELF::ELFOSABI_STANDALONE   }
270 };
271
272 static const EnumEntry<unsigned> ElfMachineType[] = {
273   LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE         ),
274   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32          ),
275   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC        ),
276   LLVM_READOBJ_ENUM_ENT(ELF, EM_386          ),
277   LLVM_READOBJ_ENUM_ENT(ELF, EM_68K          ),
278   LLVM_READOBJ_ENUM_ENT(ELF, EM_88K          ),
279   LLVM_READOBJ_ENUM_ENT(ELF, EM_IAMCU        ),
280   LLVM_READOBJ_ENUM_ENT(ELF, EM_860          ),
281   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS         ),
282   LLVM_READOBJ_ENUM_ENT(ELF, EM_S370         ),
283   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE  ),
284   LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC       ),
285   LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500       ),
286   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS  ),
287   LLVM_READOBJ_ENUM_ENT(ELF, EM_960          ),
288   LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC          ),
289   LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64        ),
290   LLVM_READOBJ_ENUM_ENT(ELF, EM_S390         ),
291   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU          ),
292   LLVM_READOBJ_ENUM_ENT(ELF, EM_V800         ),
293   LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20         ),
294   LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32         ),
295   LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE          ),
296   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM          ),
297   LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA        ),
298   LLVM_READOBJ_ENUM_ENT(ELF, EM_SH           ),
299   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9      ),
300   LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE      ),
301   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC          ),
302   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300       ),
303   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H      ),
304   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S          ),
305   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500       ),
306   LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64        ),
307   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X       ),
308   LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE     ),
309   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12       ),
310   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA          ),
311   LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP          ),
312   LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU         ),
313   LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1         ),
314   LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE     ),
315   LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16         ),
316   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100        ),
317   LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ        ),
318   LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64       ),
319   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP         ),
320   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10        ),
321   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11        ),
322   LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66         ),
323   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS      ),
324   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7          ),
325   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16       ),
326   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11       ),
327   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08       ),
328   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05       ),
329   LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX          ),
330   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19         ),
331   LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX          ),
332   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS         ),
333   LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN      ),
334   LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH     ),
335   LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP          ),
336   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX         ),
337   LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY        ),
338   LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM        ),
339   LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR          ),
340   LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30         ),
341   LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V         ),
342   LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V         ),
343   LLVM_READOBJ_ENUM_ENT(ELF, EM_V850         ),
344   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R         ),
345   LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300      ),
346   LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200      ),
347   LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ           ),
348   LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC     ),
349   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT  ),
350   LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA       ),
351   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE    ),
352   LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP      ),
353   LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K        ),
354   LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC          ),
355   LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K        ),
356   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200        ),
357   LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K         ),
358   LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX          ),
359   LLVM_READOBJ_ENUM_ENT(ELF, EM_CR           ),
360   LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16       ),
361   LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430       ),
362   LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN     ),
363   LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33       ),
364   LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP          ),
365   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA         ),
366   LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE      ),
367   LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS       ),
368   LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP          ),
369   LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ),
370   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX          ),
371   LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE        ),
372   LLVM_READOBJ_ENUM_ENT(ELF, EM_C166         ),
373   LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C         ),
374   LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F     ),
375   LLVM_READOBJ_ENUM_ENT(ELF, EM_CE           ),
376   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C         ),
377   LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000      ),
378   LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08         ),
379   LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC        ),
380   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2        ),
381   LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7       ),
382   LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24        ),
383   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3   ),
384   LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32),
385   LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17       ),
386   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000     ),
387   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000     ),
388   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500     ),
389   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS   ),
390   LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C  ),
391   LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C         ),
392   LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA     ),
393   LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON      ),
394   LLVM_READOBJ_ENUM_ENT(ELF, EM_8051         ),
395   LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X       ),
396   LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32        ),
397   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1        ),
398   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X       ),
399   LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30       ),
400   LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16       ),
401   LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK        ),
402   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2      ),
403   LLVM_READOBJ_ENUM_ENT(ELF, EM_RX           ),
404   LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG        ),
405   LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS  ),
406   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16       ),
407   LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16         ),
408   LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU         ),
409   LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X        ),
410   LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M         ),
411   LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M         ),
412   LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64      ),
413   LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32        ),
414   LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8         ),
415   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64       ),
416   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO      ),
417   LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA         ),
418   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX       ),
419   LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD  ),
420   LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST    ),
421   LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND    ),
422   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ),
423   LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8        ),
424   LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78         ),
425   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5   ),
426   LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR        ),
427   LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX      ),
428   LLVM_READOBJ_ENUM_ENT(ELF, EM_AMDGPU       )
429 };
430
431 static const EnumEntry<unsigned> ElfSymbolBindings[] = {
432   { "Local",  ELF::STB_LOCAL        },
433   { "Global", ELF::STB_GLOBAL       },
434   { "Weak",   ELF::STB_WEAK         },
435   { "Unique", ELF::STB_GNU_UNIQUE   }
436 };
437
438 static const EnumEntry<unsigned> ElfSymbolTypes[] = {
439   { "None",      ELF::STT_NOTYPE    },
440   { "Object",    ELF::STT_OBJECT    },
441   { "Function",  ELF::STT_FUNC      },
442   { "Section",   ELF::STT_SECTION   },
443   { "File",      ELF::STT_FILE      },
444   { "Common",    ELF::STT_COMMON    },
445   { "TLS",       ELF::STT_TLS       },
446   { "GNU_IFunc", ELF::STT_GNU_IFUNC }
447 };
448
449 static const char *getElfSectionType(unsigned Arch, unsigned Type) {
450   switch (Arch) {
451   case ELF::EM_ARM:
452     switch (Type) {
453     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX);
454     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
455     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
456     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
457     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
458     }
459   case ELF::EM_HEXAGON:
460     switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
461   case ELF::EM_X86_64:
462     switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
463   case ELF::EM_MIPS:
464   case ELF::EM_MIPS_RS3_LE:
465     switch (Type) {
466     LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
467     LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
468     LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
469     }
470   }
471
472   switch (Type) {
473   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL              );
474   LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS          );
475   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB            );
476   LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB            );
477   LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA              );
478   LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH              );
479   LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC           );
480   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE              );
481   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS            );
482   LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL               );
483   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB             );
484   LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM            );
485   LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY        );
486   LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY        );
487   LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY     );
488   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP             );
489   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX      );
490   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES    );
491   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH          );
492   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef        );
493   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed       );
494   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym        );
495   default: return "";
496   }
497 }
498
499 static const EnumEntry<unsigned> ElfSectionFlags[] = {
500   LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE           ),
501   LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC           ),
502   LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE         ),
503   LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR       ),
504   LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE           ),
505   LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS         ),
506   LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK       ),
507   LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER      ),
508   LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING),
509   LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP           ),
510   LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS             ),
511   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
512   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
513   LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP    )
514 };
515
516 static const char *getElfSegmentType(unsigned Arch, unsigned Type) {
517   // Check potentially overlapped processor-specific
518   // program header type.
519   switch (Arch) {
520   case ELF::EM_ARM:
521     switch (Type) {
522     LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX);
523     }
524   case ELF::EM_MIPS:
525   case ELF::EM_MIPS_RS3_LE:
526     switch (Type) {
527     LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO);
528     LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC);
529     LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS);
530     LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_ABIFLAGS);
531     }
532   }
533
534   switch (Type) {
535   LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL   );
536   LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD   );
537   LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC);
538   LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP );
539   LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE   );
540   LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB  );
541   LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR   );
542   LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS    );
543
544   LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME);
545   LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND);
546
547   LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK);
548   LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO);
549   default: return "";
550   }
551 }
552
553 static const EnumEntry<unsigned> ElfSegmentFlags[] = {
554   LLVM_READOBJ_ENUM_ENT(ELF, PF_X),
555   LLVM_READOBJ_ENUM_ENT(ELF, PF_W),
556   LLVM_READOBJ_ENUM_ENT(ELF, PF_R)
557 };
558
559 static const EnumEntry<unsigned> ElfHeaderMipsFlags[] = {
560   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NOREORDER),
561   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_PIC),
562   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_CPIC),
563   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI2),
564   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_32BITMODE),
565   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_FP64),
566   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NAN2008),
567   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O32),
568   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O64),
569   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI32),
570   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI64),
571   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_3900),
572   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4010),
573   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4100),
574   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4650),
575   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4120),
576   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4111),
577   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_SB1),
578   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON),
579   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_XLR),
580   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON2),
581   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON3),
582   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5400),
583   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5900),
584   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5500),
585   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_9000),
586   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2E),
587   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2F),
588   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS3A),
589   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MICROMIPS),
590   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_M16),
591   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_MDMX),
592   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_1),
593   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_2),
594   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_3),
595   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_4),
596   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_5),
597   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32),
598   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64),
599   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R2),
600   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R2),
601   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R6),
602   LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R6)
603 };
604
605 template <typename ELFT>
606 ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer)
607     : ObjDumper(Writer), Obj(Obj) {
608
609   SmallVector<const Elf_Phdr *, 4> LoadSegments;
610   for (const Elf_Phdr &Phdr : Obj->program_headers()) {
611     if (Phdr.p_type == ELF::PT_DYNAMIC) {
612       DynamicRegion.Addr = Obj->base() + Phdr.p_offset;
613       uint64_t Size = Phdr.p_filesz;
614       if (Size % sizeof(Elf_Dyn))
615         report_fatal_error("Invalid dynamic table size");
616       DynamicRegion.Size = Phdr.p_filesz;
617       continue;
618     }
619     if (Phdr.p_type != ELF::PT_LOAD || Phdr.p_filesz == 0)
620       continue;
621     LoadSegments.push_back(&Phdr);
622   }
623
624   auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * {
625     const Elf_Phdr **I = std::upper_bound(
626         LoadSegments.begin(), LoadSegments.end(), VAddr, compareAddr<ELFT>);
627     if (I == LoadSegments.begin())
628       report_fatal_error("Virtual address is not in any segment");
629     --I;
630     const Elf_Phdr &Phdr = **I;
631     uint64_t Delta = VAddr - Phdr.p_vaddr;
632     if (Delta >= Phdr.p_filesz)
633       report_fatal_error("Virtual address is not in any segment");
634     return Obj->base() + Phdr.p_offset + Delta;
635   };
636
637   uint64_t SONameOffset = 0;
638   const char *StringTableBegin = nullptr;
639   uint64_t StringTableSize = 0;
640   for (const Elf_Dyn &Dyn : dynamic_table()) {
641     switch (Dyn.d_tag) {
642     case ELF::DT_HASH:
643       HashTable =
644           reinterpret_cast<const Elf_Hash *>(toMappedAddr(Dyn.getPtr()));
645       break;
646     case ELF::DT_RELA:
647       DynRelaRegion.Addr = toMappedAddr(Dyn.getPtr());
648       break;
649     case ELF::DT_RELASZ:
650       DynRelaRegion.Size = Dyn.getVal();
651       break;
652     case ELF::DT_RELAENT:
653       DynRelaRegion.EntSize = Dyn.getVal();
654       break;
655     case ELF::DT_SONAME:
656       SONameOffset = Dyn.getVal();
657       break;
658     case ELF::DT_STRTAB:
659       StringTableBegin = (const char *)toMappedAddr(Dyn.getPtr());
660       break;
661     case ELF::DT_STRSZ:
662       StringTableSize = Dyn.getVal();
663       break;
664     case ELF::DT_SYMTAB:
665       DynSymStart =
666           reinterpret_cast<const Elf_Sym *>(toMappedAddr(Dyn.getPtr()));
667       break;
668     }
669   }
670   if (StringTableBegin)
671     DynamicStringTable = StringRef(StringTableBegin, StringTableSize);
672   if (SONameOffset)
673     SOName = getDynamicString(SONameOffset);
674 }
675
676 template <typename ELFT>
677 const typename ELFDumper<ELFT>::Elf_Rela *
678 ELFDumper<ELFT>::dyn_rela_begin() const {
679   if (DynRelaRegion.Size && DynRelaRegion.EntSize != sizeof(Elf_Rela))
680     report_fatal_error("Invalid relocation entry size");
681   return reinterpret_cast<const Elf_Rela *>(DynRelaRegion.Addr);
682 }
683
684 template <typename ELFT>
685 const typename ELFDumper<ELFT>::Elf_Rela *
686 ELFDumper<ELFT>::dyn_rela_end() const {
687   uint64_t Size = DynRelaRegion.Size;
688   if (Size % sizeof(Elf_Rela))
689     report_fatal_error("Invalid relocation table size");
690   return dyn_rela_begin() + Size / sizeof(Elf_Rela);
691 }
692
693 template <typename ELFT>
694 typename ELFDumper<ELFT>::Elf_Rela_Range ELFDumper<ELFT>::dyn_relas() const {
695   return make_range(dyn_rela_begin(), dyn_rela_end());
696 }
697
698 template <typename ELFT>
699 const typename ELFDumper<ELFT>::Elf_Dyn *
700 ELFDumper<ELFT>::dynamic_table_begin() const {
701   return reinterpret_cast<const Elf_Dyn *>(DynamicRegion.Addr);
702 }
703
704 template <typename ELFT>
705 const typename ELFDumper<ELFT>::Elf_Dyn *
706 ELFDumper<ELFT>::dynamic_table_end() const {
707   uint64_t Size = DynamicRegion.Size;
708   return dynamic_table_begin() + Size / sizeof(Elf_Dyn);
709 }
710
711 template<class ELFT>
712 void ELFDumper<ELFT>::printFileHeaders() {
713   const Elf_Ehdr *Header = Obj->getHeader();
714
715   {
716     DictScope D(W, "ElfHeader");
717     {
718       DictScope D(W, "Ident");
719       W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0,
720                                                                  4));
721       W.printEnum  ("Class", Header->e_ident[ELF::EI_CLASS],
722                       makeArrayRef(ElfClass));
723       W.printEnum  ("DataEncoding", Header->e_ident[ELF::EI_DATA],
724                       makeArrayRef(ElfDataEncoding));
725       W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]);
726
727       // Handle architecture specific OS/ABI values.
728       if (Header->e_machine == ELF::EM_AMDGPU &&
729           Header->e_ident[ELF::EI_OSABI] == ELF::ELFOSABI_AMDGPU_HSA)
730         W.printHex("OS/ABI", "AMDGPU_HSA", ELF::ELFOSABI_AMDGPU_HSA);
731       else
732         W.printEnum  ("OS/ABI", Header->e_ident[ELF::EI_OSABI],
733                       makeArrayRef(ElfOSABI));
734       W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]);
735       W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD));
736     }
737
738     W.printEnum  ("Type", Header->e_type, makeArrayRef(ElfObjectFileType));
739     W.printEnum  ("Machine", Header->e_machine, makeArrayRef(ElfMachineType));
740     W.printNumber("Version", Header->e_version);
741     W.printHex   ("Entry", Header->e_entry);
742     W.printHex   ("ProgramHeaderOffset", Header->e_phoff);
743     W.printHex   ("SectionHeaderOffset", Header->e_shoff);
744     if (Header->e_machine == EM_MIPS)
745       W.printFlags("Flags", Header->e_flags, makeArrayRef(ElfHeaderMipsFlags),
746                    unsigned(ELF::EF_MIPS_ARCH), unsigned(ELF::EF_MIPS_ABI),
747                    unsigned(ELF::EF_MIPS_MACH));
748     else
749       W.printFlags("Flags", Header->e_flags);
750     W.printNumber("HeaderSize", Header->e_ehsize);
751     W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize);
752     W.printNumber("ProgramHeaderCount", Header->e_phnum);
753     W.printNumber("SectionHeaderEntrySize", Header->e_shentsize);
754     W.printNumber("SectionHeaderCount", Header->e_shnum);
755     W.printNumber("StringTableSectionIndex", Header->e_shstrndx);
756   }
757 }
758
759 template<class ELFT>
760 void ELFDumper<ELFT>::printSections() {
761   ListScope SectionsD(W, "Sections");
762
763   int SectionIndex = -1;
764   for (const Elf_Shdr &Sec : Obj->sections()) {
765     ++SectionIndex;
766
767     StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
768
769     DictScope SectionD(W, "Section");
770     W.printNumber("Index", SectionIndex);
771     W.printNumber("Name", Name, Sec.sh_name);
772     W.printHex("Type",
773                getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),
774                Sec.sh_type);
775     W.printFlags("Flags", Sec.sh_flags, makeArrayRef(ElfSectionFlags));
776     W.printHex("Address", Sec.sh_addr);
777     W.printHex("Offset", Sec.sh_offset);
778     W.printNumber("Size", Sec.sh_size);
779     W.printNumber("Link", Sec.sh_link);
780     W.printNumber("Info", Sec.sh_info);
781     W.printNumber("AddressAlignment", Sec.sh_addralign);
782     W.printNumber("EntrySize", Sec.sh_entsize);
783
784     if (opts::SectionRelocations) {
785       ListScope D(W, "Relocations");
786       printRelocations(&Sec);
787     }
788
789     if (opts::SectionSymbols) {
790       ListScope D(W, "Symbols");
791       const Elf_Shdr *Symtab = Obj->getDotSymtabSec();
792       ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*Symtab);
793       error(StrTableOrErr.getError());
794       StringRef StrTable = *StrTableOrErr;
795
796       for (const Elf_Sym &Sym : Obj->symbols()) {
797         ErrorOr<const Elf_Shdr *> SymSec = Obj->getSection(&Sym);
798         if (!SymSec)
799           continue;
800         if (*SymSec == &Sec)
801           printSymbol(&Sym, StrTable, false);
802       }
803     }
804
805     if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {
806       ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(&Sec));
807       W.printBinaryBlock("SectionData",
808                          StringRef((const char *)Data.data(), Data.size()));
809     }
810   }
811 }
812
813 template<class ELFT>
814 void ELFDumper<ELFT>::printRelocations() {
815   ListScope D(W, "Relocations");
816
817   int SectionNumber = -1;
818   for (const Elf_Shdr &Sec : Obj->sections()) {
819     ++SectionNumber;
820
821     if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)
822       continue;
823
824     StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
825
826     W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
827     W.indent();
828
829     printRelocations(&Sec);
830
831     W.unindent();
832     W.startLine() << "}\n";
833   }
834 }
835
836 template<class ELFT>
837 void ELFDumper<ELFT>::printDynamicRelocations() {
838   W.startLine() << "Dynamic Relocations {\n";
839   W.indent();
840   for (const Elf_Rela &Rel : dyn_relas()) {
841     SmallString<32> RelocName;
842     Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);
843     StringRef SymbolName;
844     uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());
845     const Elf_Sym *Sym = DynSymStart + SymIndex;
846     SymbolName = errorOrDefault(Sym->getName(DynamicStringTable));
847     if (opts::ExpandRelocs) {
848       DictScope Group(W, "Relocation");
849       W.printHex("Offset", Rel.r_offset);
850       W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));
851       W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
852       W.printHex("Addend", Rel.r_addend);
853     }
854     else {
855       raw_ostream& OS = W.startLine();
856       OS << W.hex(Rel.r_offset) << " " << RelocName << " "
857          << (SymbolName.size() > 0 ? SymbolName : "-") << " "
858          << W.hex(Rel.r_addend) << "\n";
859     }
860   }
861   W.unindent();
862   W.startLine() << "}\n";
863 }
864
865 template <class ELFT>
866 void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) {
867   switch (Sec->sh_type) {
868   case ELF::SHT_REL:
869     for (const Elf_Rel &R : Obj->rels(Sec)) {
870       Elf_Rela Rela;
871       Rela.r_offset = R.r_offset;
872       Rela.r_info = R.r_info;
873       Rela.r_addend = 0;
874       printRelocation(Sec, Rela);
875     }
876     break;
877   case ELF::SHT_RELA:
878     for (const Elf_Rela &R : Obj->relas(Sec))
879       printRelocation(Sec, R);
880     break;
881   }
882 }
883
884 template <class ELFT>
885 void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec, Elf_Rela Rel) {
886   SmallString<32> RelocName;
887   Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);
888   StringRef TargetName;
889   std::pair<const Elf_Shdr *, const Elf_Sym *> Sym =
890       Obj->getRelocationSymbol(Sec, &Rel);
891   if (Sym.second && Sym.second->getType() == ELF::STT_SECTION) {
892     ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym.second);
893     error(Sec.getError());
894     ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec);
895     if (SecName)
896       TargetName = SecName.get();
897   } else if (Sym.first) {
898     const Elf_Shdr *SymTable = Sym.first;
899     ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*SymTable);
900     error(StrTableOrErr.getError());
901     TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr));
902   }
903
904   if (opts::ExpandRelocs) {
905     DictScope Group(W, "Relocation");
906     W.printHex("Offset", Rel.r_offset);
907     W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));
908     W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-",
909                   Rel.getSymbol(Obj->isMips64EL()));
910     W.printHex("Addend", Rel.r_addend);
911   } else {
912     raw_ostream& OS = W.startLine();
913     OS << W.hex(Rel.r_offset) << " " << RelocName << " "
914        << (TargetName.size() > 0 ? TargetName : "-") << " "
915        << W.hex(Rel.r_addend) << "\n";
916   }
917 }
918
919 template<class ELFT>
920 void ELFDumper<ELFT>::printSymbols() {
921   ListScope Group(W, "Symbols");
922
923   const Elf_Shdr *Symtab = Obj->getDotSymtabSec();
924   ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*Symtab);
925   error(StrTableOrErr.getError());
926   StringRef StrTable = *StrTableOrErr;
927   for (const Elf_Sym &Sym : Obj->symbols())
928     printSymbol(&Sym, StrTable, false);
929 }
930
931 template<class ELFT>
932 void ELFDumper<ELFT>::printDynamicSymbols() {
933   ListScope Group(W, "DynamicSymbols");
934
935   const Elf_Shdr *Symtab = Obj->getDotDynSymSec();
936   ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*Symtab);
937   error(StrTableOrErr.getError());
938   StringRef StrTable = *StrTableOrErr;
939   for (const Elf_Sym &Sym : Obj->symbols(Symtab))
940     printSymbol(&Sym, StrTable, true);
941 }
942
943 template <class ELFT>
944 void ELFDumper<ELFT>::printSymbol(const Elf_Sym *Symbol, StringRef StrTable,
945                                   bool IsDynamic) {
946   unsigned SectionIndex = 0;
947   StringRef SectionName;
948   getSectionNameIndex(*Obj, Symbol, SectionName, SectionIndex);
949   std::string FullSymbolName =
950       getFullSymbolName(*Obj, Symbol, StrTable, IsDynamic);
951
952   DictScope D(W, "Symbol");
953   W.printNumber("Name", FullSymbolName, Symbol->st_name);
954   W.printHex   ("Value", Symbol->st_value);
955   W.printNumber("Size", Symbol->st_size);
956   W.printEnum  ("Binding", Symbol->getBinding(),
957                   makeArrayRef(ElfSymbolBindings));
958   W.printEnum  ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes));
959   W.printNumber("Other", Symbol->st_other);
960   W.printHex("Section", SectionName, SectionIndex);
961 }
962
963 #define LLVM_READOBJ_TYPE_CASE(name) \
964   case DT_##name: return #name
965
966 static const char *getTypeString(uint64_t Type) {
967   switch (Type) {
968   LLVM_READOBJ_TYPE_CASE(BIND_NOW);
969   LLVM_READOBJ_TYPE_CASE(DEBUG);
970   LLVM_READOBJ_TYPE_CASE(FINI);
971   LLVM_READOBJ_TYPE_CASE(FINI_ARRAY);
972   LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ);
973   LLVM_READOBJ_TYPE_CASE(FLAGS);
974   LLVM_READOBJ_TYPE_CASE(FLAGS_1);
975   LLVM_READOBJ_TYPE_CASE(HASH);
976   LLVM_READOBJ_TYPE_CASE(INIT);
977   LLVM_READOBJ_TYPE_CASE(INIT_ARRAY);
978   LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ);
979   LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY);
980   LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ);
981   LLVM_READOBJ_TYPE_CASE(JMPREL);
982   LLVM_READOBJ_TYPE_CASE(NEEDED);
983   LLVM_READOBJ_TYPE_CASE(NULL);
984   LLVM_READOBJ_TYPE_CASE(PLTGOT);
985   LLVM_READOBJ_TYPE_CASE(PLTREL);
986   LLVM_READOBJ_TYPE_CASE(PLTRELSZ);
987   LLVM_READOBJ_TYPE_CASE(REL);
988   LLVM_READOBJ_TYPE_CASE(RELA);
989   LLVM_READOBJ_TYPE_CASE(RELENT);
990   LLVM_READOBJ_TYPE_CASE(RELSZ);
991   LLVM_READOBJ_TYPE_CASE(RELAENT);
992   LLVM_READOBJ_TYPE_CASE(RELASZ);
993   LLVM_READOBJ_TYPE_CASE(RPATH);
994   LLVM_READOBJ_TYPE_CASE(RUNPATH);
995   LLVM_READOBJ_TYPE_CASE(SONAME);
996   LLVM_READOBJ_TYPE_CASE(STRSZ);
997   LLVM_READOBJ_TYPE_CASE(STRTAB);
998   LLVM_READOBJ_TYPE_CASE(SYMBOLIC);
999   LLVM_READOBJ_TYPE_CASE(SYMENT);
1000   LLVM_READOBJ_TYPE_CASE(SYMTAB);
1001   LLVM_READOBJ_TYPE_CASE(TEXTREL);
1002   LLVM_READOBJ_TYPE_CASE(VERNEED);
1003   LLVM_READOBJ_TYPE_CASE(VERNEEDNUM);
1004   LLVM_READOBJ_TYPE_CASE(VERSYM);
1005   LLVM_READOBJ_TYPE_CASE(RELCOUNT);
1006   LLVM_READOBJ_TYPE_CASE(GNU_HASH);
1007   LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION);
1008   LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS);
1009   LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS);
1010   LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO);
1011   LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO);
1012   LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO);
1013   LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM);
1014   LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP);
1015   LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT);
1016   LLVM_READOBJ_TYPE_CASE(MIPS_OPTIONS);
1017   default: return "unknown";
1018   }
1019 }
1020
1021 #undef LLVM_READOBJ_TYPE_CASE
1022
1023 #define LLVM_READOBJ_DT_FLAG_ENT(prefix, enum) \
1024   { #enum, prefix##_##enum }
1025
1026 static const EnumEntry<unsigned> ElfDynamicDTFlags[] = {
1027   LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN),
1028   LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC),
1029   LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL),
1030   LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW),
1031   LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS)
1032 };
1033
1034 static const EnumEntry<unsigned> ElfDynamicDTFlags1[] = {
1035   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOW),
1036   LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAL),
1037   LLVM_READOBJ_DT_FLAG_ENT(DF_1, GROUP),
1038   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODELETE),
1039   LLVM_READOBJ_DT_FLAG_ENT(DF_1, LOADFLTR),
1040   LLVM_READOBJ_DT_FLAG_ENT(DF_1, INITFIRST),
1041   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOOPEN),
1042   LLVM_READOBJ_DT_FLAG_ENT(DF_1, ORIGIN),
1043   LLVM_READOBJ_DT_FLAG_ENT(DF_1, DIRECT),
1044   LLVM_READOBJ_DT_FLAG_ENT(DF_1, TRANS),
1045   LLVM_READOBJ_DT_FLAG_ENT(DF_1, INTERPOSE),
1046   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODEFLIB),
1047   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODUMP),
1048   LLVM_READOBJ_DT_FLAG_ENT(DF_1, CONFALT),
1049   LLVM_READOBJ_DT_FLAG_ENT(DF_1, ENDFILTEE),
1050   LLVM_READOBJ_DT_FLAG_ENT(DF_1, DISPRELDNE),
1051   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODIRECT),
1052   LLVM_READOBJ_DT_FLAG_ENT(DF_1, IGNMULDEF),
1053   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOKSYMS),
1054   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOHDR),
1055   LLVM_READOBJ_DT_FLAG_ENT(DF_1, EDITED),
1056   LLVM_READOBJ_DT_FLAG_ENT(DF_1, NORELOC),
1057   LLVM_READOBJ_DT_FLAG_ENT(DF_1, SYMINTPOSE),
1058   LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAUDIT),
1059   LLVM_READOBJ_DT_FLAG_ENT(DF_1, SINGLETON)
1060 };
1061
1062 static const EnumEntry<unsigned> ElfDynamicDTMipsFlags[] = {
1063   LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE),
1064   LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART),
1065   LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT),
1066   LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT),
1067   LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE),
1068   LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY),
1069   LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT),
1070   LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS),
1071   LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT),
1072   LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE),
1073   LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD),
1074   LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART),
1075   LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED),
1076   LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD),
1077   LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF),
1078   LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE)
1079 };
1080
1081 #undef LLVM_READOBJ_DT_FLAG_ENT
1082
1083 template <typename T, typename TFlag>
1084 void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) {
1085   typedef EnumEntry<TFlag> FlagEntry;
1086   typedef SmallVector<FlagEntry, 10> FlagVector;
1087   FlagVector SetFlags;
1088
1089   for (const auto &Flag : Flags) {
1090     if (Flag.Value == 0)
1091       continue;
1092
1093     if ((Value & Flag.Value) == Flag.Value)
1094       SetFlags.push_back(Flag);
1095   }
1096
1097   for (const auto &Flag : SetFlags) {
1098     OS << Flag.Name << " ";
1099   }
1100 }
1101
1102 template <class ELFT>
1103 StringRef ELFDumper<ELFT>::getDynamicString(uint64_t Value) const {
1104   if (Value >= DynamicStringTable.size())
1105     reportError("Invalid dynamic string table reference");
1106   return StringRef(DynamicStringTable.data() + Value);
1107 }
1108
1109 template <class ELFT>
1110 void ELFDumper<ELFT>::printValue(uint64_t Type, uint64_t Value) {
1111   raw_ostream &OS = W.getOStream();
1112   switch (Type) {
1113   case DT_PLTREL:
1114     if (Value == DT_REL) {
1115       OS << "REL";
1116       break;
1117     } else if (Value == DT_RELA) {
1118       OS << "RELA";
1119       break;
1120     }
1121   // Fallthrough.
1122   case DT_PLTGOT:
1123   case DT_HASH:
1124   case DT_STRTAB:
1125   case DT_SYMTAB:
1126   case DT_RELA:
1127   case DT_INIT:
1128   case DT_FINI:
1129   case DT_REL:
1130   case DT_JMPREL:
1131   case DT_INIT_ARRAY:
1132   case DT_FINI_ARRAY:
1133   case DT_PREINIT_ARRAY:
1134   case DT_DEBUG:
1135   case DT_VERNEED:
1136   case DT_VERSYM:
1137   case DT_GNU_HASH:
1138   case DT_NULL:
1139   case DT_MIPS_BASE_ADDRESS:
1140   case DT_MIPS_GOTSYM:
1141   case DT_MIPS_RLD_MAP:
1142   case DT_MIPS_PLTGOT:
1143   case DT_MIPS_OPTIONS:
1144     OS << format("0x%" PRIX64, Value);
1145     break;
1146   case DT_RELCOUNT:
1147   case DT_VERNEEDNUM:
1148   case DT_MIPS_RLD_VERSION:
1149   case DT_MIPS_LOCAL_GOTNO:
1150   case DT_MIPS_SYMTABNO:
1151   case DT_MIPS_UNREFEXTNO:
1152     OS << Value;
1153     break;
1154   case DT_PLTRELSZ:
1155   case DT_RELASZ:
1156   case DT_RELAENT:
1157   case DT_STRSZ:
1158   case DT_SYMENT:
1159   case DT_RELSZ:
1160   case DT_RELENT:
1161   case DT_INIT_ARRAYSZ:
1162   case DT_FINI_ARRAYSZ:
1163   case DT_PREINIT_ARRAYSZ:
1164     OS << Value << " (bytes)";
1165     break;
1166   case DT_NEEDED:
1167     OS << "SharedLibrary (" << getDynamicString(Value) << ")";
1168     break;
1169   case DT_SONAME:
1170     OS << "LibrarySoname (" << getDynamicString(Value) << ")";
1171     break;
1172   case DT_RPATH:
1173   case DT_RUNPATH:
1174     OS << getDynamicString(Value);
1175     break;
1176   case DT_MIPS_FLAGS:
1177     printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS);
1178     break;
1179   case DT_FLAGS:
1180     printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS);
1181     break;
1182   case DT_FLAGS_1:
1183     printFlags(Value, makeArrayRef(ElfDynamicDTFlags1), OS);
1184     break;
1185   default:
1186     OS << format("0x%" PRIX64, Value);
1187     break;
1188   }
1189 }
1190
1191 template<class ELFT>
1192 void ELFDumper<ELFT>::printUnwindInfo() {
1193   W.startLine() << "UnwindInfo not implemented.\n";
1194 }
1195
1196 namespace {
1197 template <> void ELFDumper<ELFType<support::little, false>>::printUnwindInfo() {
1198   const unsigned Machine = Obj->getHeader()->e_machine;
1199   if (Machine == EM_ARM) {
1200     ARM::EHABI::PrinterContext<ELFType<support::little, false>> Ctx(W, Obj);
1201     return Ctx.PrintUnwindInformation();
1202   }
1203   W.startLine() << "UnwindInfo not implemented.\n";
1204 }
1205 }
1206
1207 template<class ELFT>
1208 void ELFDumper<ELFT>::printDynamicTable() {
1209   auto I = dynamic_table_begin();
1210   auto E = dynamic_table_end();
1211
1212   if (I == E)
1213     return;
1214
1215   --E;
1216   while (I != E && E->getTag() == ELF::DT_NULL)
1217     --E;
1218   if (E->getTag() != ELF::DT_NULL)
1219     ++E;
1220   ++E;
1221
1222   ptrdiff_t Total = std::distance(I, E);
1223   if (Total == 0)
1224     return;
1225
1226   raw_ostream &OS = W.getOStream();
1227   W.startLine() << "DynamicSection [ (" << Total << " entries)\n";
1228
1229   bool Is64 = ELFT::Is64Bits;
1230
1231   W.startLine()
1232      << "  Tag" << (Is64 ? "                " : "        ") << "Type"
1233      << "                 " << "Name/Value\n";
1234   while (I != E) {
1235     const Elf_Dyn &Entry = *I;
1236     ++I;
1237     W.startLine()
1238        << "  "
1239        << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Entry.getTag())
1240        << " " << format("%-21s", getTypeString(Entry.getTag()));
1241     printValue(Entry.getTag(), Entry.getVal());
1242     OS << "\n";
1243   }
1244
1245   W.startLine() << "]\n";
1246 }
1247
1248 template<class ELFT>
1249 void ELFDumper<ELFT>::printNeededLibraries() {
1250   ListScope D(W, "NeededLibraries");
1251
1252   typedef std::vector<StringRef> LibsTy;
1253   LibsTy Libs;
1254
1255   for (const auto &Entry : dynamic_table())
1256     if (Entry.d_tag == ELF::DT_NEEDED)
1257       Libs.push_back(getDynamicString(Entry.d_un.d_val));
1258
1259   std::stable_sort(Libs.begin(), Libs.end());
1260
1261   for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); I != E; ++I) {
1262     outs() << "  " << *I << "\n";
1263   }
1264 }
1265
1266 template<class ELFT>
1267 void ELFDumper<ELFT>::printProgramHeaders() {
1268   ListScope L(W, "ProgramHeaders");
1269
1270   for (const Elf_Phdr &Phdr : Obj->program_headers()) {
1271     DictScope P(W, "ProgramHeader");
1272     W.printHex("Type",
1273                getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type),
1274                Phdr.p_type);
1275     W.printHex("Offset", Phdr.p_offset);
1276     W.printHex("VirtualAddress", Phdr.p_vaddr);
1277     W.printHex("PhysicalAddress", Phdr.p_paddr);
1278     W.printNumber("FileSize", Phdr.p_filesz);
1279     W.printNumber("MemSize", Phdr.p_memsz);
1280     W.printFlags("Flags", Phdr.p_flags, makeArrayRef(ElfSegmentFlags));
1281     W.printNumber("Alignment", Phdr.p_align);
1282   }
1283 }
1284
1285 template <typename ELFT>
1286 void ELFDumper<ELFT>::printHashTable() {
1287   DictScope D(W, "HashTable");
1288   if (!HashTable)
1289     return;
1290   W.printNumber("Num Buckets", HashTable->nbucket);
1291   W.printNumber("Num Chains", HashTable->nchain);
1292   W.printList("Buckets", HashTable->buckets());
1293   W.printList("Chains", HashTable->chains());
1294 }
1295
1296 template <typename ELFT> void ELFDumper<ELFT>::printLoadName() {
1297   outs() << "LoadName: " << SOName << '\n';
1298 }
1299
1300 template <class ELFT>
1301 void ELFDumper<ELFT>::printAttributes() {
1302   W.startLine() << "Attributes not implemented.\n";
1303 }
1304
1305 namespace {
1306 template <> void ELFDumper<ELFType<support::little, false>>::printAttributes() {
1307   if (Obj->getHeader()->e_machine != EM_ARM) {
1308     W.startLine() << "Attributes not implemented.\n";
1309     return;
1310   }
1311
1312   DictScope BA(W, "BuildAttributes");
1313   for (const ELFO::Elf_Shdr &Sec : Obj->sections()) {
1314     if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES)
1315       continue;
1316
1317     ErrorOr<ArrayRef<uint8_t>> Contents = Obj->getSectionContents(&Sec);
1318     if (!Contents)
1319       continue;
1320
1321     if ((*Contents)[0] != ARMBuildAttrs::Format_Version) {
1322       errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0])
1323              << '\n';
1324       continue;
1325     }
1326
1327     W.printHex("FormatVersion", (*Contents)[0]);
1328     if (Contents->size() == 1)
1329       continue;
1330
1331     ARMAttributeParser(W).Parse(*Contents);
1332   }
1333 }
1334 }
1335
1336 namespace {
1337 template <class ELFT> class MipsGOTParser {
1338 public:
1339   typedef object::ELFFile<ELFT> ELFO;
1340   typedef typename ELFO::Elf_Shdr Elf_Shdr;
1341   typedef typename ELFO::Elf_Sym Elf_Sym;
1342   typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range;
1343   typedef typename ELFO::Elf_Addr GOTEntry;
1344   typedef typename ELFO::Elf_Rel Elf_Rel;
1345   typedef typename ELFO::Elf_Rela Elf_Rela;
1346
1347   MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable, StreamWriter &W);
1348
1349   void parseGOT();
1350   void parsePLT();
1351
1352 private:
1353   const ELFO *Obj;
1354   StreamWriter &W;
1355   llvm::Optional<uint64_t> DtPltGot;
1356   llvm::Optional<uint64_t> DtLocalGotNum;
1357   llvm::Optional<uint64_t> DtGotSym;
1358   llvm::Optional<uint64_t> DtMipsPltGot;
1359   llvm::Optional<uint64_t> DtJmpRel;
1360
1361   std::size_t getGOTTotal(ArrayRef<uint8_t> GOT) const;
1362   const GOTEntry *makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum);
1363
1364   void printGotEntry(uint64_t GotAddr, const GOTEntry *BeginIt,
1365                      const GOTEntry *It);
1366   void printGlobalGotEntry(uint64_t GotAddr, const GOTEntry *BeginIt,
1367                            const GOTEntry *It, const Elf_Sym *Sym,
1368                            StringRef StrTable, bool IsDynamic);
1369   void printPLTEntry(uint64_t PLTAddr, const GOTEntry *BeginIt,
1370                      const GOTEntry *It, StringRef Purpose);
1371   void printPLTEntry(uint64_t PLTAddr, const GOTEntry *BeginIt,
1372                      const GOTEntry *It, StringRef StrTable,
1373                      const Elf_Sym *Sym);
1374 };
1375 }
1376
1377 template <class ELFT>
1378 MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable,
1379                                    StreamWriter &W)
1380     : Obj(Obj), W(W) {
1381   for (const auto &Entry : DynTable) {
1382     switch (Entry.getTag()) {
1383     case ELF::DT_PLTGOT:
1384       DtPltGot = Entry.getVal();
1385       break;
1386     case ELF::DT_MIPS_LOCAL_GOTNO:
1387       DtLocalGotNum = Entry.getVal();
1388       break;
1389     case ELF::DT_MIPS_GOTSYM:
1390       DtGotSym = Entry.getVal();
1391       break;
1392     case ELF::DT_MIPS_PLTGOT:
1393       DtMipsPltGot = Entry.getVal();
1394       break;
1395     case ELF::DT_JMPREL:
1396       DtJmpRel = Entry.getVal();
1397       break;
1398     }
1399   }
1400 }
1401
1402 template <class ELFT> void MipsGOTParser<ELFT>::parseGOT() {
1403   // See "Global Offset Table" in Chapter 5 in the following document
1404   // for detailed GOT description.
1405   // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
1406   if (!DtPltGot) {
1407     W.startLine() << "Cannot find PLTGOT dynamic table tag.\n";
1408     return;
1409   }
1410   if (!DtLocalGotNum) {
1411     W.startLine() << "Cannot find MIPS_LOCAL_GOTNO dynamic table tag.\n";
1412     return;
1413   }
1414   if (!DtGotSym) {
1415     W.startLine() << "Cannot find MIPS_GOTSYM dynamic table tag.\n";
1416     return;
1417   }
1418
1419   const Elf_Shdr *GOTShdr = findSectionByAddress(Obj, *DtPltGot);
1420   if (!GOTShdr) {
1421     W.startLine() << "There is no .got section in the file.\n";
1422     return;
1423   }
1424
1425   ErrorOr<ArrayRef<uint8_t>> GOT = Obj->getSectionContents(GOTShdr);
1426   if (!GOT) {
1427     W.startLine() << "The .got section is empty.\n";
1428     return;
1429   }
1430
1431   if (*DtLocalGotNum > getGOTTotal(*GOT)) {
1432     W.startLine() << "MIPS_LOCAL_GOTNO exceeds a number of GOT entries.\n";
1433     return;
1434   }
1435
1436   const Elf_Shdr *DynSymSec = Obj->getDotDynSymSec();
1437   ErrorOr<StringRef> StrTable = Obj->getStringTableForSymtab(*DynSymSec);
1438   error(StrTable.getError());
1439   const Elf_Sym *DynSymBegin = Obj->symbol_begin(DynSymSec);
1440   const Elf_Sym *DynSymEnd = Obj->symbol_end(DynSymSec);
1441   std::size_t DynSymTotal = std::size_t(std::distance(DynSymBegin, DynSymEnd));
1442
1443   if (*DtGotSym > DynSymTotal) {
1444     W.startLine() << "MIPS_GOTSYM exceeds a number of dynamic symbols.\n";
1445     return;
1446   }
1447
1448   std::size_t GlobalGotNum = DynSymTotal - *DtGotSym;
1449
1450   if (*DtLocalGotNum + GlobalGotNum > getGOTTotal(*GOT)) {
1451     W.startLine() << "Number of global GOT entries exceeds the size of GOT.\n";
1452     return;
1453   }
1454
1455   const GOTEntry *GotBegin = makeGOTIter(*GOT, 0);
1456   const GOTEntry *GotLocalEnd = makeGOTIter(*GOT, *DtLocalGotNum);
1457   const GOTEntry *It = GotBegin;
1458
1459   DictScope GS(W, "Primary GOT");
1460
1461   W.printHex("Canonical gp value", GOTShdr->sh_addr + 0x7ff0);
1462   {
1463     ListScope RS(W, "Reserved entries");
1464
1465     {
1466       DictScope D(W, "Entry");
1467       printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
1468       W.printString("Purpose", StringRef("Lazy resolver"));
1469     }
1470
1471     if (It != GotLocalEnd && (*It >> (sizeof(GOTEntry) * 8 - 1)) != 0) {
1472       DictScope D(W, "Entry");
1473       printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
1474       W.printString("Purpose", StringRef("Module pointer (GNU extension)"));
1475     }
1476   }
1477   {
1478     ListScope LS(W, "Local entries");
1479     for (; It != GotLocalEnd; ++It) {
1480       DictScope D(W, "Entry");
1481       printGotEntry(GOTShdr->sh_addr, GotBegin, It);
1482     }
1483   }
1484   {
1485     ListScope GS(W, "Global entries");
1486
1487     const GOTEntry *GotGlobalEnd =
1488         makeGOTIter(*GOT, *DtLocalGotNum + GlobalGotNum);
1489     const Elf_Sym *GotDynSym = DynSymBegin + *DtGotSym;
1490     for (; It != GotGlobalEnd; ++It) {
1491       DictScope D(W, "Entry");
1492       printGlobalGotEntry(GOTShdr->sh_addr, GotBegin, It, GotDynSym++,
1493                           *StrTable, true);
1494     }
1495   }
1496
1497   std::size_t SpecGotNum = getGOTTotal(*GOT) - *DtLocalGotNum - GlobalGotNum;
1498   W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum));
1499 }
1500
1501 template <class ELFT> void MipsGOTParser<ELFT>::parsePLT() {
1502   if (!DtMipsPltGot) {
1503     W.startLine() << "Cannot find MIPS_PLTGOT dynamic table tag.\n";
1504     return;
1505   }
1506   if (!DtJmpRel) {
1507     W.startLine() << "Cannot find JMPREL dynamic table tag.\n";
1508     return;
1509   }
1510
1511   const Elf_Shdr *PLTShdr = findSectionByAddress(Obj, *DtMipsPltGot);
1512   if (!PLTShdr) {
1513     W.startLine() << "There is no .got.plt section in the file.\n";
1514     return;
1515   }
1516   ErrorOr<ArrayRef<uint8_t>> PLT = Obj->getSectionContents(PLTShdr);
1517   if (!PLT) {
1518     W.startLine() << "The .got.plt section is empty.\n";
1519     return;
1520   }
1521
1522   const Elf_Shdr *PLTRelShdr = findSectionByAddress(Obj, *DtJmpRel);
1523   if (!PLTShdr) {
1524     W.startLine() << "There is no .rel.plt section in the file.\n";
1525     return;
1526   }
1527   ErrorOr<const Elf_Shdr *> SymTableOrErr =
1528       Obj->getSection(PLTRelShdr->sh_link);
1529   error(SymTableOrErr.getError());
1530   ErrorOr<StringRef> StrTable = Obj->getStringTableForSymtab(**SymTableOrErr);
1531   error(StrTable.getError());
1532
1533   const GOTEntry *PLTBegin = makeGOTIter(*PLT, 0);
1534   const GOTEntry *PLTEnd = makeGOTIter(*PLT, getGOTTotal(*PLT));
1535   const GOTEntry *It = PLTBegin;
1536
1537   DictScope GS(W, "PLT GOT");
1538   {
1539     ListScope RS(W, "Reserved entries");
1540     printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "PLT lazy resolver");
1541     if (It != PLTEnd)
1542       printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "Module pointer");
1543   }
1544   {
1545     ListScope GS(W, "Entries");
1546
1547     switch (PLTRelShdr->sh_type) {
1548     case ELF::SHT_REL:
1549       for (const Elf_Rel *RI = Obj->rel_begin(PLTRelShdr),
1550                          *RE = Obj->rel_end(PLTRelShdr);
1551            RI != RE && It != PLTEnd; ++RI, ++It) {
1552         const Elf_Sym *Sym =
1553             Obj->getRelocationSymbol(&*PLTRelShdr, &*RI).second;
1554         printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, *StrTable, Sym);
1555       }
1556       break;
1557     case ELF::SHT_RELA:
1558       for (const Elf_Rela *RI = Obj->rela_begin(PLTRelShdr),
1559                           *RE = Obj->rela_end(PLTRelShdr);
1560            RI != RE && It != PLTEnd; ++RI, ++It) {
1561         const Elf_Sym *Sym =
1562             Obj->getRelocationSymbol(&*PLTRelShdr, &*RI).second;
1563         printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, *StrTable, Sym);
1564       }
1565       break;
1566     }
1567   }
1568 }
1569
1570 template <class ELFT>
1571 std::size_t MipsGOTParser<ELFT>::getGOTTotal(ArrayRef<uint8_t> GOT) const {
1572   return GOT.size() / sizeof(GOTEntry);
1573 }
1574
1575 template <class ELFT>
1576 const typename MipsGOTParser<ELFT>::GOTEntry *
1577 MipsGOTParser<ELFT>::makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum) {
1578   const char *Data = reinterpret_cast<const char *>(GOT.data());
1579   return reinterpret_cast<const GOTEntry *>(Data + EntryNum * sizeof(GOTEntry));
1580 }
1581
1582 template <class ELFT>
1583 void MipsGOTParser<ELFT>::printGotEntry(uint64_t GotAddr,
1584                                         const GOTEntry *BeginIt,
1585                                         const GOTEntry *It) {
1586   int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
1587   W.printHex("Address", GotAddr + Offset);
1588   W.printNumber("Access", Offset - 0x7ff0);
1589   W.printHex("Initial", *It);
1590 }
1591
1592 template <class ELFT>
1593 void MipsGOTParser<ELFT>::printGlobalGotEntry(
1594     uint64_t GotAddr, const GOTEntry *BeginIt, const GOTEntry *It,
1595     const Elf_Sym *Sym, StringRef StrTable, bool IsDynamic) {
1596   printGotEntry(GotAddr, BeginIt, It);
1597
1598   W.printHex("Value", Sym->st_value);
1599   W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
1600
1601   unsigned SectionIndex = 0;
1602   StringRef SectionName;
1603   getSectionNameIndex(*Obj, Sym, SectionName, SectionIndex);
1604   W.printHex("Section", SectionName, SectionIndex);
1605
1606   std::string FullSymbolName =
1607       getFullSymbolName(*Obj, Sym, StrTable, IsDynamic);
1608   W.printNumber("Name", FullSymbolName, Sym->st_name);
1609 }
1610
1611 template <class ELFT>
1612 void MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr,
1613                                         const GOTEntry *BeginIt,
1614                                         const GOTEntry *It, StringRef Purpose) {
1615   DictScope D(W, "Entry");
1616   int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
1617   W.printHex("Address", PLTAddr + Offset);
1618   W.printHex("Initial", *It);
1619   W.printString("Purpose", Purpose);
1620 }
1621
1622 template <class ELFT>
1623 void MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr,
1624                                         const GOTEntry *BeginIt,
1625                                         const GOTEntry *It, StringRef StrTable,
1626                                         const Elf_Sym *Sym) {
1627   DictScope D(W, "Entry");
1628   int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
1629   W.printHex("Address", PLTAddr + Offset);
1630   W.printHex("Initial", *It);
1631   W.printHex("Value", Sym->st_value);
1632   W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
1633
1634   unsigned SectionIndex = 0;
1635   StringRef SectionName;
1636   getSectionNameIndex(*Obj, Sym, SectionName, SectionIndex);
1637   W.printHex("Section", SectionName, SectionIndex);
1638
1639   std::string FullSymbolName = getFullSymbolName(*Obj, Sym, StrTable, true);
1640   W.printNumber("Name", FullSymbolName, Sym->st_name);
1641 }
1642
1643 template <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() {
1644   if (Obj->getHeader()->e_machine != EM_MIPS) {
1645     W.startLine() << "MIPS PLT GOT is available for MIPS targets only.\n";
1646     return;
1647   }
1648
1649   MipsGOTParser<ELFT> GOTParser(Obj, dynamic_table(), W);
1650   GOTParser.parseGOT();
1651   GOTParser.parsePLT();
1652 }
1653
1654 static const EnumEntry<unsigned> ElfMipsISAExtType[] = {
1655   {"None",                    Mips::AFL_EXT_NONE},
1656   {"Broadcom SB-1",           Mips::AFL_EXT_SB1},
1657   {"Cavium Networks Octeon",  Mips::AFL_EXT_OCTEON},
1658   {"Cavium Networks Octeon2", Mips::AFL_EXT_OCTEON2},
1659   {"Cavium Networks OcteonP", Mips::AFL_EXT_OCTEONP},
1660   {"Cavium Networks Octeon3", Mips::AFL_EXT_OCTEON3},
1661   {"LSI R4010",               Mips::AFL_EXT_4010},
1662   {"Loongson 2E",             Mips::AFL_EXT_LOONGSON_2E},
1663   {"Loongson 2F",             Mips::AFL_EXT_LOONGSON_2F},
1664   {"Loongson 3A",             Mips::AFL_EXT_LOONGSON_3A},
1665   {"MIPS R4650",              Mips::AFL_EXT_4650},
1666   {"MIPS R5900",              Mips::AFL_EXT_5900},
1667   {"MIPS R10000",             Mips::AFL_EXT_10000},
1668   {"NEC VR4100",              Mips::AFL_EXT_4100},
1669   {"NEC VR4111/VR4181",       Mips::AFL_EXT_4111},
1670   {"NEC VR4120",              Mips::AFL_EXT_4120},
1671   {"NEC VR5400",              Mips::AFL_EXT_5400},
1672   {"NEC VR5500",              Mips::AFL_EXT_5500},
1673   {"RMI Xlr",                 Mips::AFL_EXT_XLR},
1674   {"Toshiba R3900",           Mips::AFL_EXT_3900}
1675 };
1676
1677 static const EnumEntry<unsigned> ElfMipsASEFlags[] = {
1678   {"DSP",                Mips::AFL_ASE_DSP},
1679   {"DSPR2",              Mips::AFL_ASE_DSPR2},
1680   {"Enhanced VA Scheme", Mips::AFL_ASE_EVA},
1681   {"MCU",                Mips::AFL_ASE_MCU},
1682   {"MDMX",               Mips::AFL_ASE_MDMX},
1683   {"MIPS-3D",            Mips::AFL_ASE_MIPS3D},
1684   {"MT",                 Mips::AFL_ASE_MT},
1685   {"SmartMIPS",          Mips::AFL_ASE_SMARTMIPS},
1686   {"VZ",                 Mips::AFL_ASE_VIRT},
1687   {"MSA",                Mips::AFL_ASE_MSA},
1688   {"MIPS16",             Mips::AFL_ASE_MIPS16},
1689   {"microMIPS",          Mips::AFL_ASE_MICROMIPS},
1690   {"XPA",                Mips::AFL_ASE_XPA}
1691 };
1692
1693 static const EnumEntry<unsigned> ElfMipsFpABIType[] = {
1694   {"Hard or soft float",                  Mips::Val_GNU_MIPS_ABI_FP_ANY},
1695   {"Hard float (double precision)",       Mips::Val_GNU_MIPS_ABI_FP_DOUBLE},
1696   {"Hard float (single precision)",       Mips::Val_GNU_MIPS_ABI_FP_SINGLE},
1697   {"Soft float",                          Mips::Val_GNU_MIPS_ABI_FP_SOFT},
1698   {"Hard float (MIPS32r2 64-bit FPU 12 callee-saved)",
1699    Mips::Val_GNU_MIPS_ABI_FP_OLD_64},
1700   {"Hard float (32-bit CPU, Any FPU)",    Mips::Val_GNU_MIPS_ABI_FP_XX},
1701   {"Hard float (32-bit CPU, 64-bit FPU)", Mips::Val_GNU_MIPS_ABI_FP_64},
1702   {"Hard float compat (32-bit CPU, 64-bit FPU)",
1703    Mips::Val_GNU_MIPS_ABI_FP_64A}
1704 };
1705
1706 static const EnumEntry<unsigned> ElfMipsFlags1[] {
1707   {"ODDSPREG", Mips::AFL_FLAGS1_ODDSPREG},
1708 };
1709
1710 static int getMipsRegisterSize(uint8_t Flag) {
1711   switch (Flag) {
1712   case Mips::AFL_REG_NONE:
1713     return 0;
1714   case Mips::AFL_REG_32:
1715     return 32;
1716   case Mips::AFL_REG_64:
1717     return 64;
1718   case Mips::AFL_REG_128:
1719     return 128;
1720   default:
1721     return -1;
1722   }
1723 }
1724
1725 template <class ELFT> void ELFDumper<ELFT>::printMipsABIFlags() {
1726   const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.abiflags");
1727   if (!Shdr) {
1728     W.startLine() << "There is no .MIPS.abiflags section in the file.\n";
1729     return;
1730   }
1731   ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
1732   if (!Sec) {
1733     W.startLine() << "The .MIPS.abiflags section is empty.\n";
1734     return;
1735   }
1736   if (Sec->size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {
1737     W.startLine() << "The .MIPS.abiflags section has a wrong size.\n";
1738     return;
1739   }
1740
1741   auto *Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Sec->data());
1742
1743   raw_ostream &OS = W.getOStream();
1744   DictScope GS(W, "MIPS ABI Flags");
1745
1746   W.printNumber("Version", Flags->version);
1747   W.startLine() << "ISA: ";
1748   if (Flags->isa_rev <= 1)
1749     OS << format("MIPS%u", Flags->isa_level);
1750   else
1751     OS << format("MIPS%ur%u", Flags->isa_level, Flags->isa_rev);
1752   OS << "\n";
1753   W.printEnum("ISA Extension", Flags->isa_ext, makeArrayRef(ElfMipsISAExtType));
1754   W.printFlags("ASEs", Flags->ases, makeArrayRef(ElfMipsASEFlags));
1755   W.printEnum("FP ABI", Flags->fp_abi, makeArrayRef(ElfMipsFpABIType));
1756   W.printNumber("GPR size", getMipsRegisterSize(Flags->gpr_size));
1757   W.printNumber("CPR1 size", getMipsRegisterSize(Flags->cpr1_size));
1758   W.printNumber("CPR2 size", getMipsRegisterSize(Flags->cpr2_size));
1759   W.printFlags("Flags 1", Flags->flags1, makeArrayRef(ElfMipsFlags1));
1760   W.printHex("Flags 2", Flags->flags2);
1761 }
1762
1763 template <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {
1764   const Elf_Shdr *Shdr = findSectionByName(*Obj, ".reginfo");
1765   if (!Shdr) {
1766     W.startLine() << "There is no .reginfo section in the file.\n";
1767     return;
1768   }
1769   ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
1770   if (!Sec) {
1771     W.startLine() << "The .reginfo section is empty.\n";
1772     return;
1773   }
1774   if (Sec->size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {
1775     W.startLine() << "The .reginfo section has a wrong size.\n";
1776     return;
1777   }
1778
1779   auto *Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Sec->data());
1780
1781   DictScope GS(W, "MIPS RegInfo");
1782   W.printHex("GP", Reginfo->ri_gp_value);
1783   W.printHex("General Mask", Reginfo->ri_gprmask);
1784   W.printHex("Co-Proc Mask0", Reginfo->ri_cprmask[0]);
1785   W.printHex("Co-Proc Mask1", Reginfo->ri_cprmask[1]);
1786   W.printHex("Co-Proc Mask2", Reginfo->ri_cprmask[2]);
1787   W.printHex("Co-Proc Mask3", Reginfo->ri_cprmask[3]);
1788 }
1789
1790 template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
1791   const Elf_Shdr *StackMapSection = nullptr;
1792   for (const auto &Sec : Obj->sections()) {
1793     ErrorOr<StringRef> Name = Obj->getSectionName(&Sec);
1794     if (*Name == ".llvm_stackmaps") {
1795       StackMapSection = &Sec;
1796       break;
1797     }
1798   }
1799
1800   if (!StackMapSection)
1801     return;
1802
1803   StringRef StackMapContents;
1804   ErrorOr<ArrayRef<uint8_t>> StackMapContentsArray =
1805     Obj->getSectionContents(StackMapSection);
1806
1807   prettyPrintStackMap(
1808               llvm::outs(),
1809               StackMapV1Parser<ELFT::TargetEndianness>(*StackMapContentsArray));
1810 }