aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/COFFDump.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2023-07-14 12:44:41 -0700
committerFangrui Song <i@maskray.me>2023-07-14 12:44:41 -0700
commit0af663f80da0009f6fd879cf4d41743d4c88a2db (patch)
treeda617484204f75590d8fc2155d1959312f65c0b7 /llvm/tools/llvm-objdump/COFFDump.cpp
parent21ca892f698ac59e86ede6e4a2d4d747b0a36ae8 (diff)
downloadllvm-0af663f80da0009f6fd879cf4d41743d4c88a2db.zip
llvm-0af663f80da0009f6fd879cf4d41743d4c88a2db.tar.gz
llvm-0af663f80da0009f6fd879cf4d41743d4c88a2db.tar.bz2
[llvm-objdump] Create ObjectFile specific dumpers
We pay the one-off boilerplate overhead to create `*Dumper` classes that derive from objdump::Dumper a la llvm-readobj. This has two primary advantages. First, a lot object file format specific code can be moved from llvm-objdump.cpp to *Dump.cpp files. Refactor `printPrivateHeaders` as an example. Second, with the introduction of ELFDumper<ELFT>, we can simplify a few dispatch functions in ELFDump.cpp. In addition, the ObjectFile specific dumpers contains a ObjectFile specific reference so that we can remove a lot of `cast<*ObjectFile>(Obj)`. Reviewed By: mtrofin Differential Revision: https://reviews.llvm.org/D155045
Diffstat (limited to 'llvm/tools/llvm-objdump/COFFDump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/COFFDump.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/tools/llvm-objdump/COFFDump.cpp b/llvm/tools/llvm-objdump/COFFDump.cpp
index b1beedc..e1b3847 100644
--- a/llvm/tools/llvm-objdump/COFFDump.cpp
+++ b/llvm/tools/llvm-objdump/COFFDump.cpp
@@ -37,13 +37,15 @@ template <typename T> struct EnumEntry {
StringRef Name;
};
-class COFFDumper {
+class COFFDumper : public Dumper {
public:
- explicit COFFDumper(const llvm::object::COFFObjectFile &Obj) : Obj(Obj) {
+ explicit COFFDumper(const llvm::object::COFFObjectFile &O)
+ : Dumper(O), Obj(O) {
Is64 = !Obj.getPE32Header();
}
template <class PEHeader> void printPEHeader(const PEHeader &Hdr) const;
+ void printPrivateHeaders(bool MachOOnlyFirst) override;
private:
template <typename T> FormattedNumber formatAddr(T V) const {
@@ -59,6 +61,11 @@ private:
};
} // namespace
+std::unique_ptr<Dumper>
+objdump::createCOFFDumper(const object::COFFObjectFile &Obj) {
+ return std::make_unique<COFFDumper>(Obj);
+}
+
constexpr EnumEntry<uint16_t> PEHeaderMagic[] = {
{uint16_t(COFF::PE32Header::PE32), "PE32"},
{uint16_t(COFF::PE32Header::PE32_PLUS), "PE32+"},
@@ -764,7 +771,7 @@ void objdump::printCOFFUnwindInfo(const COFFObjectFile *Obj) {
}
}
-void objdump::printCOFFFileHeader(const COFFObjectFile &Obj) {
+void COFFDumper::printPrivateHeaders(bool MachOOnlyFirst) {
COFFDumper CD(Obj);
const uint16_t Cha = Obj.getCharacteristics();
outs() << "Characteristics 0x" << Twine::utohexstr(Cha) << '\n';