summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-readobj/COFFDumper.cpp23
-rw-r--r--tools/llvm-readobj/ELFDumper.cpp18
-rw-r--r--tools/llvm-readobj/MachODumper.cpp21
-rw-r--r--tools/llvm-readobj/ObjDumper.cpp37
-rw-r--r--tools/llvm-readobj/ObjDumper.h2
-rw-r--r--tools/llvm-readobj/llvm-readobj.cpp4
6 files changed, 28 insertions, 77 deletions
diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp
index c840d7efb84..0ed4ccd09f6 100644
--- a/tools/llvm-readobj/COFFDumper.cpp
+++ b/tools/llvm-readobj/COFFDumper.cpp
@@ -83,7 +83,6 @@ public:
void printSymbols() override;
void printDynamicSymbols() override;
void printUnwindInfo() override;
- void printSectionAsHex(StringRef StringName) override;
void printNeededLibraries() override;
@@ -655,28 +654,6 @@ void COFFDumper::printFileHeaders() {
printDOSHeader(DH);
}
-void COFFDumper::printSectionAsHex(StringRef SectionName) {
- char *StrPtr;
- long SectionIndex = strtol(SectionName.data(), &StrPtr, 10);
- const coff_section *Sec;
- if (*StrPtr)
- error(Obj->getSection(SectionName, Sec));
- else {
- error(Obj->getSection((int)SectionIndex, Sec));
- if (!Sec)
- return error(object_error::parse_failed);
- }
-
- StringRef SecName;
- error(Obj->getSectionName(Sec, SecName));
-
- ArrayRef<uint8_t> Content;
- error(Obj->getSectionContents(Sec, Content));
- const uint8_t *SecContent = Content.data();
-
- SectionHexDump(SecName, SecContent, Content.size());
-}
-
void COFFDumper::printDOSHeader(const dos_header *DH) {
DictScope D(W, "DOSHeader");
W.printString("Magic", StringRef(DH->Magic, sizeof(DH->Magic)));
diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp
index 5da66c4a6d8..645ec2d7e04 100644
--- a/tools/llvm-readobj/ELFDumper.cpp
+++ b/tools/llvm-readobj/ELFDumper.cpp
@@ -152,7 +152,6 @@ public:
void printDynamicTable() override;
void printNeededLibraries() override;
void printProgramHeaders() override;
- void printSectionAsHex(StringRef StringName) override;
void printHashTable() override;
void printGnuHashTable() override;
void printLoadName() override;
@@ -286,23 +285,6 @@ public:
};
template <class ELFT>
-void ELFDumper<ELFT>::printSectionAsHex(StringRef SectionName) {
- char *StrPtr;
- long SectionIndex = strtol(SectionName.data(), &StrPtr, 10);
- const Elf_Shdr *Sec;
- if (*StrPtr)
- Sec = unwrapOrError(Obj->getSection(SectionName));
- else
- Sec = unwrapOrError(Obj->getSection((unsigned int)SectionIndex));
-
- StringRef SecName = unwrapOrError(Obj->getSectionName(Sec));
- const uint8_t *SecContent =
- reinterpret_cast<const uint8_t *>(Obj->base() + Sec->sh_offset);
-
- SectionHexDump(SecName, SecContent, Sec->sh_size);
-}
-
-template <class ELFT>
void ELFDumper<ELFT>::printSymbolsHelper(bool IsDynamic) const {
StringRef StrTable, SymtabName;
size_t Entries = 0;
diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp
index c97f598bdd7..69ef1556f78 100644
--- a/tools/llvm-readobj/MachODumper.cpp
+++ b/tools/llvm-readobj/MachODumper.cpp
@@ -38,7 +38,6 @@ public:
void printDynamicSymbols() override;
void printUnwindInfo() override;
void printStackMap() const override;
- void printSectionAsHex(StringRef SectionName) override;
void printNeededLibraries() override;
@@ -677,26 +676,6 @@ void MachODumper::printStackMap() const {
StackMapV2Parser<support::big>(StackMapContentsArray));
}
-void MachODumper::printSectionAsHex(StringRef SectionName) {
- char *StrPtr;
- long SectionIndex = strtol(SectionName.data(), &StrPtr, 10);
- SectionRef SecTmp;
- const SectionRef *Sec = &SecTmp;
- if (*StrPtr)
- SecTmp = unwrapOrError(Obj->getSection(SectionName));
- else
- SecTmp = unwrapOrError(Obj->getSection((unsigned int)SectionIndex));
-
- StringRef SecName;
- error(Sec->getName(SecName));
-
- StringRef Data;
- error(Sec->getContents(Data));
- const uint8_t *SecContent = reinterpret_cast<const uint8_t *>(Data.data());
-
- SectionHexDump(SecName, SecContent, Data.size());
-}
-
void MachODumper::printNeededLibraries() {
ListScope D(W, "NeededLibraries");
diff --git a/tools/llvm-readobj/ObjDumper.cpp b/tools/llvm-readobj/ObjDumper.cpp
index 4677a378382..17675fd8f27 100644
--- a/tools/llvm-readobj/ObjDumper.cpp
+++ b/tools/llvm-readobj/ObjDumper.cpp
@@ -37,7 +37,11 @@ getSecNameOrIndexAsSecRef(const object::ObjectFile *Obj, StringRef SecName) {
char *StrPtr;
long SectionIndex = strtol(SecName.data(), &StrPtr, 10);
object::SectionRef Section;
- long SecIndex = 0;
+ long SecIndex;
+ if (Obj->isELF())
+ SecIndex = 0;
+ else
+ SecIndex = 1;
for (object::SectionRef SecRef : Obj->sections()) {
if (*StrPtr) {
StringRef SectionName;
@@ -90,11 +94,23 @@ void ObjDumper::printSectionAsString(const object::ObjectFile *Obj,
}
}
-void ObjDumper::SectionHexDump(StringRef SecName, const uint8_t *Section,
- size_t Size) {
- const uint8_t *SecContent = Section;
- const uint8_t *SecEnd = Section + Size;
- W.startLine() << "Hex dump of section '" << SecName << "':\n";
+void ObjDumper::printSectionAsHex(const object::ObjectFile *Obj,
+ StringRef SecName) {
+ Expected<object::SectionRef> SectionRefOrError =
+ getSecNameOrIndexAsSecRef(Obj, SecName);
+ if (!SectionRefOrError)
+ error(std::move(SectionRefOrError));
+ object::SectionRef Section = *SectionRefOrError;
+ StringRef SectionName;
+
+ if (std::error_code E = Section.getName(SectionName))
+ error(E);
+ W.startLine() << "Hex dump of section '" << SectionName << "':\n";
+
+ StringRef SectionContent;
+ Section.getContents(SectionContent);
+ const uint8_t *SecContent = SectionContent.bytes_begin();
+ const uint8_t *SecEnd = SecContent + SectionContent.size();
for (const uint8_t *SecPtr = SecContent; SecPtr < SecEnd; SecPtr += 16) {
const uint8_t *TmpSecPtr = SecPtr;
@@ -121,12 +137,9 @@ void ObjDumper::SectionHexDump(StringRef SecName, const uint8_t *Section,
' ');
TmpSecPtr = SecPtr;
- for (i = 0; TmpSecPtr + i < SecEnd && i < 16; ++i) {
- if (isprint(TmpSecPtr[i]))
- W.startLine() << TmpSecPtr[i];
- else
- W.startLine() << '.';
- }
+ for (i = 0; TmpSecPtr + i < SecEnd && i < 16; ++i)
+ W.startLine() << (isprint(TmpSecPtr[i]) ? static_cast<char>(TmpSecPtr[i])
+ : '.');
W.startLine() << '\n';
}
diff --git a/tools/llvm-readobj/ObjDumper.h b/tools/llvm-readobj/ObjDumper.h
index 786e1d47d71..8c3a7bec73b 100644
--- a/tools/llvm-readobj/ObjDumper.h
+++ b/tools/llvm-readobj/ObjDumper.h
@@ -89,10 +89,10 @@ public:
virtual void printStackMap() const = 0;
void printSectionAsString(const object::ObjectFile *Obj, StringRef SecName);
+ void printSectionAsHex(const object::ObjectFile *Obj, StringRef SecName);
protected:
ScopedPrinter &W;
- void SectionHexDump(StringRef SecName, const uint8_t *Section, size_t Size);
};
std::error_code createCOFFDumper(const object::ObjectFile *Obj,
diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp
index 389053d5499..a7236c02b8a 100644
--- a/tools/llvm-readobj/llvm-readobj.cpp
+++ b/tools/llvm-readobj/llvm-readobj.cpp
@@ -441,8 +441,8 @@ static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer) {
Dumper->printSectionAsString(Obj, SectionName);
});
if (!opts::HexDump.empty())
- llvm::for_each(opts::HexDump, [&Dumper](StringRef SectionName) {
- Dumper->printSectionAsHex(SectionName);
+ llvm::for_each(opts::HexDump, [&Dumper, Obj](StringRef SectionName) {
+ Dumper->printSectionAsHex(Obj, SectionName);
});
if (opts::HashTable)
Dumper->printHashTable();