From 0af663f80da0009f6fd879cf4d41743d4c88a2db Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 14 Jul 2023 12:44:41 -0700 Subject: [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, 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 --- llvm/tools/llvm-objdump/llvm-objdump.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'llvm/tools/llvm-objdump/llvm-objdump.h') diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index ffc1361..fd75f55 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -18,6 +18,7 @@ #include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/FormattedStream.h" +#include namespace llvm { class StringRef; @@ -30,6 +31,12 @@ class Arg; namespace object { class RelocationRef; struct VersionEntry; + +class COFFObjectFile; +class ELFObjectFileBase; +class MachOObjectFile; +class WasmObjectFile; +class XCOFFObjectFile; } // namespace object namespace objdump { @@ -71,10 +78,12 @@ class Dumper { public: Dumper(const object::ObjectFile &O) : O(O) {} + virtual ~Dumper() {} void reportUniqueWarning(Error Err); void reportUniqueWarning(const Twine &Msg); + virtual void printPrivateHeaders(bool MachOOnlyFirst); void printSymbolTable(StringRef ArchiveName, StringRef ArchitectureName = StringRef(), bool DumpDynamic = false); @@ -85,6 +94,12 @@ public: void printRelocations(); }; +std::unique_ptr createCOFFDumper(const object::COFFObjectFile &Obj); +std::unique_ptr createELFDumper(const object::ELFObjectFileBase &Obj); +std::unique_ptr createMachODumper(const object::MachOObjectFile &Obj); +std::unique_ptr createWasmDumper(const object::WasmObjectFile &Obj); +std::unique_ptr createXCOFFDumper(const object::XCOFFObjectFile &Obj); + // Various helper functions. /// Creates a SectionFilter with a standard predicate that conditionally skips -- cgit v1.1