From 241f716c4bf1f3def9a507940a9e67e2637343ef Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Fri, 21 Aug 2015 20:28:30 +0000 Subject: [PATCH] [llvm-readobj] Add support for MachO DataInCodeDataCommand. Example output: File: Format: Mach-O arm Arch: arm AddressSize: 32bit DataInCode { Data offset: 300 Data size: 32 Data Regions [ DICE { Index: 0 Offset: 0 Length: 4 Kind: 1 } DICE { Index: 1 Offset: 4 Length: 4 Kind: 4 } DICE { Index: 2 Offset: 8 Length: 2 Kind: 3 } DICE { Index: 3 Offset: 10 Length: 1 Kind: 2 } ] } Differential Revision: http://reviews.llvm.org/D12084 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245732 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-readobj/MachODumper.cpp | 25 +++++++++++++++++++++++++ tools/llvm-readobj/ObjDumper.h | 3 +++ tools/llvm-readobj/llvm-readobj.cpp | 8 ++++++++ 3 files changed, 36 insertions(+) diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp index 6b1889a66b6..4628d7ab294 100644 --- a/tools/llvm-readobj/MachODumper.cpp +++ b/tools/llvm-readobj/MachODumper.cpp @@ -40,6 +40,9 @@ public: void printUnwindInfo() override; void printStackMap() const override; + // MachO-specific. + void printMachODataInCode() override; + private: template void printFileHeaders(const MachHeader &Header); @@ -600,3 +603,25 @@ void MachODumper::printStackMap() const { prettyPrintStackMap(llvm::outs(), StackMapV1Parser(StackMapContentsArray)); } + +void MachODumper::printMachODataInCode() { + for (const auto &Load : Obj->load_commands()) { + if (Load.C.cmd == MachO::LC_DATA_IN_CODE) { + MachO::linkedit_data_command LLC = Obj->getLinkeditDataLoadCommand(Load); + DictScope Group(W, "DataInCode"); + W.printNumber("Data offset", LLC.dataoff); + W.printNumber("Data size", LLC.datasize); + ListScope D(W, "Data entries"); + unsigned NumRegions = LLC.datasize / sizeof(MachO::data_in_code_entry); + for (unsigned i = 0; i < NumRegions; ++i) { + MachO::data_in_code_entry DICE = Obj->getDataInCodeTableEntry( + LLC.dataoff, i); + DictScope Group(W, "Entry"); + W.printNumber("Index", i); + W.printNumber("Offset", DICE.offset); + W.printNumber("Length", DICE.length); + W.printNumber("Kind", DICE.kind); + } + } + } +} diff --git a/tools/llvm-readobj/ObjDumper.h b/tools/llvm-readobj/ObjDumper.h index 206082fa5e2..153e5bb8972 100644 --- a/tools/llvm-readobj/ObjDumper.h +++ b/tools/llvm-readobj/ObjDumper.h @@ -54,6 +54,9 @@ public: virtual void printCOFFDirectives() { } virtual void printCOFFBaseReloc() { } + // Only implemented for MachO. + virtual void printMachODataInCode() { } + virtual void printStackMap() const = 0; protected: diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index 860211995d1..c6f303ddb0f 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -181,6 +181,11 @@ namespace opts { COFFBaseRelocs("coff-basereloc", cl::desc("Display the PE/COFF .reloc section")); + // -macho-data-in-code + cl::opt + MachODataInCode("macho-data-in-code", + cl::desc("Display MachO Data in Code command")); + // -stackmap cl::opt PrintStackMap("stackmap", @@ -312,6 +317,9 @@ static void dumpObject(const ObjectFile *Obj) { if (opts::COFFBaseRelocs) Dumper->printCOFFBaseReloc(); } + if (Obj->isMachO()) + if (opts::MachODataInCode) + Dumper->printMachODataInCode(); if (opts::PrintStackMap) Dumper->printStackMap(); } -- 2.34.1