aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/llvm-objdump.h
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/llvm-objdump.h
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/llvm-objdump.h')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.h15
1 files changed, 15 insertions, 0 deletions
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 <memory>
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<Dumper> createCOFFDumper(const object::COFFObjectFile &Obj);
+std::unique_ptr<Dumper> createELFDumper(const object::ELFObjectFileBase &Obj);
+std::unique_ptr<Dumper> createMachODumper(const object::MachOObjectFile &Obj);
+std::unique_ptr<Dumper> createWasmDumper(const object::WasmObjectFile &Obj);
+std::unique_ptr<Dumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj);
+
// Various helper functions.
/// Creates a SectionFilter with a standard predicate that conditionally skips