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