aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/MachODump.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/MachODump.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/MachODump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 0e10403..11fb1cb 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -191,8 +191,21 @@ struct SymbolSorter {
return AAddr < BAddr;
}
};
+
+class MachODumper : public Dumper {
+ const object::MachOObjectFile &Obj;
+
+public:
+ MachODumper(const object::MachOObjectFile &O) : Dumper(O), Obj(O) {}
+ void printPrivateHeaders(bool OnlyFirst) override;
+};
} // namespace
+std::unique_ptr<Dumper>
+objdump::createMachODumper(const object::MachOObjectFile &Obj) {
+ return std::make_unique<MachODumper>(Obj);
+}
+
// Types for the storted data in code table that is built before disassembly
// and the predicate function to sort them.
typedef std::pair<uint64_t, DiceRef> DiceTableEntry;
@@ -2142,7 +2155,8 @@ static void printObjcMetaData(MachOObjectFile *O, bool verbose);
static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
StringRef ArchiveMemberName = StringRef(),
StringRef ArchitectureName = StringRef()) {
- Dumper D(*MachOOF);
+ std::unique_ptr<Dumper> D = createMachODumper(*MachOOF);
+
// If we are doing some processing here on the Mach-O file print the header
// info. And don't print it otherwise like in the case of printing the
// UniversalHeaders or ArchiveHeaders.
@@ -2228,7 +2242,7 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
if (DylibId)
PrintDylibs(MachOOF, true);
if (SymbolTable)
- D.printSymbolTable(ArchiveName, ArchitectureName);
+ D->printSymbolTable(ArchiveName, ArchitectureName);
if (UnwindInfo)
printMachOUnwindInfo(MachOOF);
if (PrivateHeaders) {
@@ -10540,6 +10554,12 @@ void objdump::printMachOFileHeader(const object::ObjectFile *Obj) {
PrintMachHeader(file, Verbose);
}
+void MachODumper::printPrivateHeaders(bool OnlyFirst) {
+ printMachOFileHeader(&Obj);
+ if (!OnlyFirst)
+ printMachOLoadCommands(&Obj);
+}
+
void objdump::printMachOLoadCommands(const object::ObjectFile *Obj) {
const MachOObjectFile *file = cast<const MachOObjectFile>(Obj);
uint32_t filetype = 0;