diff options
author | Fangrui Song <i@maskray.me> | 2023-07-14 12:44:41 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2023-07-14 12:44:41 -0700 |
commit | 0af663f80da0009f6fd879cf4d41743d4c88a2db (patch) | |
tree | da617484204f75590d8fc2155d1959312f65c0b7 /llvm/tools/llvm-objdump/COFFDump.cpp | |
parent | 21ca892f698ac59e86ede6e4a2d4d747b0a36ae8 (diff) | |
download | llvm-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.cpp | 13 |
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'; |