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/MachODump.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/MachODump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 24 |
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; |