ELFDumper.cpp revision bed93b0de197c6b64357068ae8e1a883ddbb0e94
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
1576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm-readobj.h"
1676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "Error.h"
1776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "ObjDumper.h"
1876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "StreamWriter.h"
1976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
2076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/ADT/SmallString.h"
2176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Object/ELF.h"
2276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Compiler.h"
2376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Format.h"
2476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/MathExtras.h"
2576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/raw_ostream.h"
2676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
2776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm;
2876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm::object;
2976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace ELF;
3076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#define LLVM_READOBJ_ENUM_CASE(ns, enum) \
3376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case ns::enum: return #enum;
3476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace {
3676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
3776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<typename ELFT>
3876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherclass ELFDumper : public ObjDumper {
3976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherpublic:
4076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ELFDumper(const ELFObjectFile<ELFT> *Obj, StreamWriter& Writer)
4176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    : ObjDumper(Writer)
4276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    , Obj(Obj) { }
4376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
4476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printFileHeaders() LLVM_OVERRIDE;
4576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printSections() LLVM_OVERRIDE;
4676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printRelocations() LLVM_OVERRIDE;
4776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printSymbols() LLVM_OVERRIDE;
4876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printDynamicSymbols() LLVM_OVERRIDE;
4976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printUnwindInfo() LLVM_OVERRIDE;
5076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
5176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printDynamicTable() LLVM_OVERRIDE;
5276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  virtual void printNeededLibraries() LLVM_OVERRIDE;
53cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  virtual void printProgramHeaders() LLVM_OVERRIDE;
5476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
5576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherprivate:
56cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  typedef ELFObjectFile<ELFT> ELFO;
57cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  typedef typename ELFO::Elf_Shdr Elf_Shdr;
58cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  typedef typename ELFO::Elf_Sym Elf_Sym;
5976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
6076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  void printSymbol(symbol_iterator SymI, bool IsDynamic = false);
6176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
6276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  void printRelocation(section_iterator SecI, relocation_iterator RelI);
6376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
64cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  const ELFO *Obj;
6576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
6676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
6776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace
6876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
6976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
7076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace llvm {
7176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
72bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatemplate <class ELFT>
73bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolastatic error_code createELFDumper(const ELFObjectFile<ELFT> *Obj,
74bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola                                  StreamWriter &Writer,
75bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola                                  OwningPtr<ObjDumper> &Result) {
76bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  Result.reset(new ELFDumper<ELFT>(Obj, Writer));
77bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  return readobj_error::success;
78bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola}
79bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola
8076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophererror_code createELFDumper(const object::ObjectFile *Obj,
8176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                           StreamWriter& Writer,
8276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                           OwningPtr<ObjDumper> &Result) {
8376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Little-endian 32-bit
84bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
85bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola    return createELFDumper(ELFObj, Writer, Result);
8676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
8776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Big-endian 32-bit
88bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
89bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola    return createELFDumper(ELFObj, Writer, Result);
9076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
9176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Little-endian 64-bit
92bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
93bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola    return createELFDumper(ELFObj, Writer, Result);
9476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
9576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Big-endian 64-bit
96bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola  if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
97bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola    return createELFDumper(ELFObj, Writer, Result);
9876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
9976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  return readobj_error::unsupported_obj_file_format;
10076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
10176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
10276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace llvm
10376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
10476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
10576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfClass[] = {
10676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "None",   ELF::ELFCLASSNONE },
10776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "32-bit", ELF::ELFCLASS32   },
10876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "64-bit", ELF::ELFCLASS64   },
10976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
11076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
11176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfDataEncoding[] = {
11276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "None",         ELF::ELFDATANONE },
11376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "LittleEndian", ELF::ELFDATA2LSB },
11476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "BigEndian",    ELF::ELFDATA2MSB },
11576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
11676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
11776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfObjectFileType[] = {
11876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "None",         ELF::ET_NONE },
11976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Relocatable",  ELF::ET_REL  },
12076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Executable",   ELF::ET_EXEC },
12176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "SharedObject", ELF::ET_DYN  },
12276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Core",         ELF::ET_CORE },
12376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
12476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
12576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfOSABI[] = {
12676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "SystemV",      ELF::ELFOSABI_NONE         },
12776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "HPUX",         ELF::ELFOSABI_HPUX         },
12876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "NetBSD",       ELF::ELFOSABI_NETBSD       },
12976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "GNU/Linux",    ELF::ELFOSABI_LINUX        },
13076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "GNU/Hurd",     ELF::ELFOSABI_HURD         },
13176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Solaris",      ELF::ELFOSABI_SOLARIS      },
13276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "AIX",          ELF::ELFOSABI_AIX          },
13376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "IRIX",         ELF::ELFOSABI_IRIX         },
13476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "FreeBSD",      ELF::ELFOSABI_FREEBSD      },
13576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "TRU64",        ELF::ELFOSABI_TRU64        },
13676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Modesto",      ELF::ELFOSABI_MODESTO      },
13776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "OpenBSD",      ELF::ELFOSABI_OPENBSD      },
13876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "OpenVMS",      ELF::ELFOSABI_OPENVMS      },
13976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "NSK",          ELF::ELFOSABI_NSK          },
14076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "AROS",         ELF::ELFOSABI_AROS         },
14176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "FenixOS",      ELF::ELFOSABI_FENIXOS      },
14276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI },
14376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX  },
14476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "ARM",          ELF::ELFOSABI_ARM          },
14576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Standalone"  , ELF::ELFOSABI_STANDALONE   }
14676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
14776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
14876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfMachineType[] = {
14976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE         ),
15076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_M32          ),
15176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC        ),
15276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_386          ),
15376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68K          ),
15476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_88K          ),
15576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_486          ),
15676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_860          ),
15776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS         ),
15876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_S370         ),
15976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE  ),
16076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC       ),
16176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500       ),
16276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS  ),
16376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_960          ),
16476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC          ),
16576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64        ),
16676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_S390         ),
16776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU          ),
16876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_V800         ),
16976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20         ),
17076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32         ),
17176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE          ),
17276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM          ),
17376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA        ),
17476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SH           ),
17576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9      ),
17676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE      ),
17776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC          ),
17876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300       ),
17976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H      ),
18076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S          ),
18176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500       ),
18276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64        ),
18376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X       ),
18476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE     ),
18576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12       ),
18676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA          ),
18776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP          ),
18876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU         ),
18976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1         ),
19076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE     ),
19176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16         ),
19276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100        ),
19376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ        ),
19476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64       ),
19576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP         ),
19676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10        ),
19776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11        ),
19876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66         ),
19976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS      ),
20076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7          ),
20176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16       ),
20276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11       ),
20376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08       ),
20476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05       ),
20576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX          ),
20676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19         ),
20776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX          ),
20876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS         ),
20976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN      ),
21076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH     ),
21176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP          ),
21276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX         ),
21376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY        ),
21476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM        ),
21576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR          ),
21676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30         ),
21776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V         ),
21876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V         ),
21976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_V850         ),
22076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R         ),
22176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300      ),
22276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200      ),
22376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ           ),
22476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC     ),
22576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT  ),
22676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA       ),
22776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE    ),
22876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP      ),
22976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K        ),
23076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC          ),
23176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K        ),
23276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200        ),
23376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K         ),
23476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX          ),
23576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CR           ),
23676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16       ),
23776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430       ),
23876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN     ),
23976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33       ),
24076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP          ),
24176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA         ),
24276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE      ),
24376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS       ),
24476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP          ),
24576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ),
24676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX          ),
24776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE        ),
24876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_C166         ),
24976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C         ),
25076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F     ),
25176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CE           ),
25276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C         ),
25376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000      ),
25476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08         ),
25576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC        ),
25676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2        ),
25776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7       ),
25876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24        ),
25976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3   ),
26076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32),
26176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17       ),
26276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000     ),
26376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000     ),
26476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500     ),
26576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS   ),
26676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C  ),
26776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C         ),
26876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA     ),
26976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON      ),
27076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_8051         ),
27176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X       ),
27276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32        ),
27376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1        ),
27476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X       ),
27576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30       ),
27676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16       ),
27776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK        ),
27876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2      ),
27976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_RX           ),
28076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG        ),
28176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS  ),
28276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16       ),
28376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16         ),
28476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU         ),
28576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X        ),
28676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M         ),
28776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M         ),
28876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64      ),
28976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32        ),
29076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8         ),
29176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64       ),
29276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO      ),
29376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MICROBLAZE   ),
29476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA         ),
29576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX       ),
29676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD  ),
29776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST    ),
29876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND    ),
29976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ),
30076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8        ),
30176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78         ),
30276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5   ),
30376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR        ),
30476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX      ),
30576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, EM_MBLAZE       )
30676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
30776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
30876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolBindings[] = {
30976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Local",  ELF::STB_LOCAL  },
31076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Global", ELF::STB_GLOBAL },
31176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Weak",   ELF::STB_WEAK   }
31276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
31376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
31476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolTypes[] = {
31576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "None",      ELF::STT_NOTYPE    },
31676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Object",    ELF::STT_OBJECT    },
31776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Function",  ELF::STT_FUNC      },
31876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Section",   ELF::STT_SECTION   },
31976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "File",      ELF::STT_FILE      },
32076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "Common",    ELF::STT_COMMON    },
32176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "TLS",       ELF::STT_TLS       },
32276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  { "GNU_IFunc", ELF::STT_GNU_IFUNC }
32376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
32476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
32576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getElfSectionType(unsigned Arch, unsigned Type) {
32676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Arch) {
32776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case Triple::arm:
32876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
32976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX);
33076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
33176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
33276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
33376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
33476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
33576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case Triple::hexagon:
33676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
33776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED);
33876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
33976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case Triple::x86_64:
34076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
34176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND);
34276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
34376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case Triple::mips:
34476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case Triple::mipsel:
34576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    switch (Type) {
34676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
34776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
34876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
34976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
35076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
35176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
35276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL              );
35376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS          );
35476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB            );
35576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB            );
35676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA              );
35776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH              );
35876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC           );
35976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE              );
36076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS            );
36176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL               );
36276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB             );
36376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM            );
36476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY        );
36576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY        );
36676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY     );
36776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP             );
36876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX      );
36976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES    );
37076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH          );
37176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef        );
37276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed       );
37376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym        );
37476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  default: return "";
37576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
37676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
37776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
37876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSectionFlags[] = {
37976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE           ),
38076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC           ),
38176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR       ),
38276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE           ),
38376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS         ),
38476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK       ),
38576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER      ),
38676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING),
38776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP           ),
38876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS             ),
38976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
39076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
39176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP    )
39276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher};
39376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
394cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckstatic const EnumEntry<unsigned> ElfSegmentTypes[] = {
395cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_NULL   ),
396cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_LOAD   ),
397cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_DYNAMIC),
398cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_INTERP ),
399cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_NOTE   ),
400cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_SHLIB  ),
401cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_PHDR   ),
402cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_TLS    ),
403cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
404cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_EH_FRAME),
405cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_EH_FRAME),
406cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_UNWIND),
407cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
408cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_STACK),
409cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_RELRO),
410cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
411cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_EXIDX),
412cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_UNWIND)
413cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck};
414cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
415cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckstatic const EnumEntry<unsigned> ElfSegmentFlags[] = {
416cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_X),
417cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_W),
418cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  LLVM_READOBJ_ENUM_ENT(ELF, PF_R)
419cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck};
420cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
42176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
42276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
42376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printFileHeaders() {
42476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
42576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
42676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  const typename ELFO::Elf_Ehdr *Header = Obj->getElfHeader();
42776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
42876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  {
42976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    DictScope D(W, "ElfHeader");
43076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    {
43176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      DictScope D(W, "Ident");
43276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0,
43376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                                                                 4));
43476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printEnum  ("Class", Header->e_ident[ELF::EI_CLASS],
43576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                      makeArrayRef(ElfClass));
43676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printEnum  ("DataEncoding", Header->e_ident[ELF::EI_DATA],
43776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                      makeArrayRef(ElfDataEncoding));
43876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]);
43976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printEnum  ("OS/ABI", Header->e_ident[ELF::EI_OSABI],
44076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                      makeArrayRef(ElfOSABI));
44176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]);
44276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD));
44376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
44476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
44576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printEnum  ("Type", Header->e_type, makeArrayRef(ElfObjectFileType));
44676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printEnum  ("Machine", Header->e_machine, makeArrayRef(ElfMachineType));
44776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Version", Header->e_version);
44876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("Entry", Header->e_entry);
44976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("ProgramHeaderOffset", Header->e_phoff);
45076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("SectionHeaderOffset", Header->e_shoff);
45176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printFlags ("Flags", Header->e_flags);
45276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("HeaderSize", Header->e_ehsize);
45376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize);
45476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("ProgramHeaderCount", Header->e_phnum);
45576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("SectionHeaderEntrySize", Header->e_shentsize);
45676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("SectionHeaderCount", Header->e_shnum);
45776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("StringTableSectionIndex", Header->e_shstrndx);
45876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
45976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
46076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
46176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
46276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSections() {
46376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope SectionsD(W, "Sections");
46476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
46576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  int SectionIndex = -1;
46676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
46776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (section_iterator SecI = Obj->begin_sections(),
46876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        SecE = Obj->end_sections();
46976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        SecI != SecE; SecI.increment(EC)) {
47076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(EC)) break;
47176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
47276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    ++SectionIndex;
47376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
47476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    const Elf_Shdr *Section = Obj->getElfSection(SecI);
47576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    StringRef Name;
47676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(SecI->getName(Name)))
47776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        Name = "";
47876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
47976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    DictScope SectionD(W, "Section");
48076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Index", SectionIndex);
48176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Name", Name, Section->sh_name);
48276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("Type", getElfSectionType(Obj->getArch(), Section->sh_type),
48376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                    Section->sh_type);
48476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags));
48576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("Address", Section->sh_addr);
48676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printHex   ("Offset", Section->sh_offset);
48776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Size", Section->sh_size);
48876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Link", Section->sh_link);
48976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("Info", Section->sh_info);
49076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("AddressAlignment", Section->sh_addralign);
49176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.printNumber("EntrySize", Section->sh_entsize);
49276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
49376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (opts::SectionRelocations) {
49476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      ListScope D(W, "Relocations");
49576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      for (relocation_iterator RelI = SecI->begin_relocations(),
49676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                               RelE = SecI->end_relocations();
49776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                               RelI != RelE; RelI.increment(EC)) {
49876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        if (error(EC)) break;
49976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
50076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        printRelocation(SecI, RelI);
50176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      }
50276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
50376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
50476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (opts::SectionSymbols) {
50576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      ListScope D(W, "Symbols");
50676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      for (symbol_iterator SymI = Obj->begin_symbols(),
50776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                           SymE = Obj->end_symbols();
50876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                           SymI != SymE; SymI.increment(EC)) {
50976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        if (error(EC)) break;
51076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
51176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        bool Contained = false;
51276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        if (SecI->containsSymbol(*SymI, Contained) || !Contained)
51376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher          continue;
51476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
51576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        printSymbol(SymI);
51676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      }
51776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
51876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
51976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (opts::SectionData) {
52076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      StringRef Data;
52176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      if (error(SecI->getContents(Data))) break;
52276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
52376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.printBinaryBlock("SectionData", Data);
52476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
52576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
52676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
52776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
52876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
52976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printRelocations() {
53076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope D(W, "Relocations");
53176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
53276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
53376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  int SectionNumber = -1;
53476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (section_iterator SecI = Obj->begin_sections(),
53576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        SecE = Obj->end_sections();
53676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        SecI != SecE; SecI.increment(EC)) {
53776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(EC)) break;
53876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
53976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    ++SectionNumber;
54076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    StringRef Name;
54176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(SecI->getName(Name)))
54276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      continue;
54376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
54476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    bool PrintedGroup = false;
54576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    for (relocation_iterator RelI = SecI->begin_relocations(),
54676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                             RelE = SecI->end_relocations();
54776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                             RelI != RelE; RelI.increment(EC)) {
54876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      if (error(EC)) break;
54976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
55076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      if (!PrintedGroup) {
55176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
55276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        W.indent();
55376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher        PrintedGroup = true;
55476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      }
55576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
55676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      printRelocation(SecI, RelI);
55776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
55876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
55976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (PrintedGroup) {
56076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.unindent();
56176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      W.startLine() << "}\n";
56276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
56376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
56476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
56576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
56676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
56776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printRelocation(section_iterator Sec,
56876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                                      relocation_iterator RelI) {
56976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  uint64_t Offset;
5701c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck  uint64_t RelocType;
57176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  SmallString<32> RelocName;
572167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  int64_t Addend;
57376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  StringRef SymbolName;
57476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  SymbolRef Symbol;
575956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola  if (Obj->getElfHeader()->e_type == ELF::ET_REL){
576956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola    if (error(RelI->getOffset(Offset))) return;
577956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola  } else {
578956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola    if (error(RelI->getAddress(Offset))) return;
579956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola  }
5801c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck  if (error(RelI->getType(RelocType))) return;
58176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (error(RelI->getTypeName(RelocName))) return;
582167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  if (error(getELFRelocationAddend(*RelI, Addend))) return;
58376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (error(RelI->getSymbol(Symbol))) return;
58476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (error(Symbol.getName(SymbolName))) return;
58576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
5861c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck  if (opts::ExpandRelocs) {
5871c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    DictScope Group(W, "Relocation");
5881c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    W.printHex("Offset", Offset);
5891c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    W.printNumber("Type", RelocName, RelocType);
5901c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
591167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola    W.printHex("Addend", Addend);
5921c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck  } else {
5931c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    raw_ostream& OS = W.startLine();
5941c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck    OS << W.hex(Offset)
5951c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck       << " " << RelocName
5961c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck       << " " << (SymbolName.size() > 0 ? SymbolName : "-")
597167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola       << " " << W.hex(Addend)
5981c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck       << "\n";
5991c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck  }
60076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
60176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
60276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
60376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSymbols() {
60476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope Group(W, "Symbols");
60576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
60676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
60776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (symbol_iterator SymI = Obj->begin_symbols(), SymE = Obj->end_symbols();
60876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                       SymI != SymE; SymI.increment(EC)) {
60976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(EC)) break;
61076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
61176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    printSymbol(SymI);
61276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
61376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
61476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
61576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
61676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printDynamicSymbols() {
61776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope Group(W, "DynamicSymbols");
61876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
61976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
62076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (symbol_iterator SymI = Obj->begin_dynamic_symbols(),
62176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                       SymE = Obj->end_dynamic_symbols();
62276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                       SymI != SymE; SymI.increment(EC)) {
62376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(EC)) break;
62476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
62576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    printSymbol(SymI, true);
62676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
62776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
62876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
62976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
63076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSymbol(symbol_iterator SymI, bool IsDynamic) {
63176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
63276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
63376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  const Elf_Sym *Symbol = Obj->getElfSymbol(SymI);
63476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  const Elf_Shdr *Section = Obj->getSection(Symbol);
63576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
63676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  StringRef SymbolName;
63776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (SymI->getName(SymbolName))
63876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    SymbolName = "";
63976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
64048831939a83915939f759bdbe95404499169bc85Nico Rieck  StringRef SectionName = "";
64148831939a83915939f759bdbe95404499169bc85Nico Rieck  if (Section)
64248831939a83915939f759bdbe95404499169bc85Nico Rieck    Obj->getSectionName(Section, SectionName);
64376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
64476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  std::string FullSymbolName(SymbolName);
64576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (IsDynamic) {
64676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    StringRef Version;
64776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    bool IsDefault;
64876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (error(Obj->getSymbolVersion(*SymI, Version, IsDefault)))
64976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      return;
65076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (!Version.empty()) {
65176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      FullSymbolName += (IsDefault ? "@@" : "@");
65276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      FullSymbolName += Version;
65376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
65476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
65576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
65676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  DictScope D(W, "Symbol");
65776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printNumber("Name", FullSymbolName, Symbol->st_name);
65876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printHex   ("Value", Symbol->st_value);
65976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printNumber("Size", Symbol->st_size);
66076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printEnum  ("Binding", Symbol->getBinding(),
66176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                  makeArrayRef(ElfSymbolBindings));
66276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printEnum  ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes));
66376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printNumber("Other", Symbol->st_other);
66476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.printHex   ("Section", SectionName, Symbol->st_shndx);
66576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
66676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
66776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#define LLVM_READOBJ_TYPE_CASE(name) \
66876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_##name: return #name
66976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
67076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getTypeString(uint64_t Type) {
67176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
67276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(BIND_NOW);
67376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(DEBUG);
67476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI);
67576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI_ARRAY);
67676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ);
67776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(FLAGS);
67876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(HASH);
67976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT);
68076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT_ARRAY);
68176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ);
68276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY);
68376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ);
68476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(JMPREL);
68576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(NEEDED);
68676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(NULL);
68776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTGOT);
68876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTREL);
68976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(PLTRELSZ);
69076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(REL);
69176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELA);
69276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELENT);
69376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELSZ);
69476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELAENT);
69576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RELASZ);
69676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RPATH);
69776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(RUNPATH);
69876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SONAME);
69976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(STRSZ);
70076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(STRTAB);
70176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMBOLIC);
70276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMENT);
70376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(SYMTAB);
70476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LLVM_READOBJ_TYPE_CASE(TEXTREL);
70576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  default: return "unknown";
70676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
70776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
70876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
70976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#undef LLVM_READOBJ_TYPE_CASE
71076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
71176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
71276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void printValue(const ELFObjectFile<ELFT> *O, uint64_t Type,
71376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                       uint64_t Value, bool Is64, raw_ostream &OS) {
71476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  switch (Type) {
71576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTREL:
71676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (Value == DT_REL) {
71776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      OS << "REL";
71876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      break;
71976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    } else if (Value == DT_RELA) {
72076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      OS << "RELA";
72176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      break;
72276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    }
72376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  // Fallthrough.
72476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTGOT:
72576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_HASH:
72676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_STRTAB:
72776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SYMTAB:
72876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELA:
72976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT:
73076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI:
73176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_REL:
73276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_JMPREL:
73376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT_ARRAY:
73476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI_ARRAY:
73576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PREINIT_ARRAY:
73676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_DEBUG:
73776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_NULL:
73876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << format("0x%" PRIX64, Value);
73976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
74076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PLTRELSZ:
74176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELASZ:
74276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELAENT:
74376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_STRSZ:
74476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SYMENT:
74576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELSZ:
74676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_RELENT:
74776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_INIT_ARRAYSZ:
74876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_FINI_ARRAYSZ:
74976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_PREINIT_ARRAYSZ:
75076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << Value << " (bytes)";
75176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
75276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_NEEDED:
75376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << "SharedLibrary ("
75476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher       << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")";
75576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
75676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  case DT_SONAME:
75776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << "LibrarySoname ("
75876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher       << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")";
75976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    break;
76076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
76176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
76276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
76376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
76476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printUnwindInfo() {
76576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "UnwindInfo not implemented.\n";
76676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
76776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
76876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
76976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printDynamicTable() {
77076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  typedef typename ELFO::Elf_Dyn_iterator EDI;
77176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  EDI Start = Obj->begin_dynamic_table(),
77276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      End = Obj->end_dynamic_table(true);
77376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
77476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  if (Start == End)
77576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    return;
77676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
77776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ptrdiff_t Total = std::distance(Start, End);
77876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  raw_ostream &OS = W.getOStream();
77976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "DynamicSection [ (" << Total << " entries)\n";
78076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
78176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  bool Is64 = Obj->getBytesInAddress() == 8;
78276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
78376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine()
78476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher     << "  Tag" << (Is64 ? "                " : "        ") << "Type"
78576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher     << "                 " << "Name/Value\n";
78676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (; Start != End; ++Start) {
78776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    W.startLine()
78876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher       << "  "
78976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher       << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Start->getTag())
79076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher       << " " << format("%-21s", getTypeString(Start->getTag()));
79176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    printValue(Obj, Start->getTag(), Start->getVal(), Is64, OS);
79276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    OS << "\n";
79376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
79476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
79576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  W.startLine() << "]\n";
79676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
79776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
79876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic bool compareLibraryName(const LibraryRef &L, const LibraryRef &R) {
79976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  StringRef LPath, RPath;
80076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  L.getPath(LPath);
80176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  R.getPath(RPath);
80276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  return LPath < RPath;
80376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
80476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
80576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT>
80676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printNeededLibraries() {
80776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  ListScope D(W, "NeededLibraries");
80876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
80976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  error_code EC;
81076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
81176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  typedef std::vector<LibraryRef> LibsTy;
81276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  LibsTy Libs;
81376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
81476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (library_iterator I = Obj->begin_libraries_needed(),
81576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        E = Obj->end_libraries_needed();
81676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                        I != E; I.increment(EC)) {
81776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    if (EC)
81876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher      report_fatal_error("Needed libraries iteration failed");
81976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
82076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    Libs.push_back(*I);
82176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
82276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
82376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  std::sort(Libs.begin(), Libs.end(), &compareLibraryName);
82476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher
82576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end();
82676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher                                  I != E; ++I) {
82776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    StringRef Path;
82876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    I->getPath(Path);
82976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher    outs() << "  " << Path << "\n";
83076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher  }
83176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}
832cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
833cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Riecktemplate<class ELFT>
834cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckvoid ELFDumper<ELFT>::printProgramHeaders() {
835cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  ListScope L(W, "ProgramHeaders");
836cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck
837cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(),
838cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck                                    PE = Obj->end_program_headers();
839cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck                                    PI != PE; ++PI) {
840cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    DictScope P(W, "ProgramHeader");
841cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printEnum  ("Type", PI->p_type, makeArrayRef(ElfSegmentTypes));
842cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printHex   ("Offset", PI->p_offset);
843cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printHex   ("VirtualAddress", PI->p_vaddr);
844cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printHex   ("PhysicalAddress", PI->p_paddr);
845cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printNumber("FileSize", PI->p_filesz);
846cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printNumber("MemSize", PI->p_memsz);
847cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags));
848cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck    W.printNumber("Alignment", PI->p_align);
849cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck  }
850cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck}
851