diff options
author | Davide Italiano <davide@freebsd.org> | 2015-08-21 20:28:30 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2015-08-21 20:28:30 +0000 |
commit | 07e7acb635e36bebbcee0e730fdb03b3fffbc99f (patch) | |
tree | 11146c3ce73d7bf1e0f1e9d78c916b0a7f514916 /llvm/tools/llvm-readobj | |
parent | 6ea895b557008212bc781841521af8694d5e47f7 (diff) | |
download | bcm5719-llvm-07e7acb635e36bebbcee0e730fdb03b3fffbc99f.tar.gz bcm5719-llvm-07e7acb635e36bebbcee0e730fdb03b3fffbc99f.zip |
[llvm-readobj] Add support for MachO DataInCodeDataCommand.
Example output:
File: <stdin>
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
llvm-svn: 245732
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/MachODumper.cpp | 25 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.h | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 8 |
3 files changed, 36 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 6b1889a66b6..4628d7ab294 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -40,6 +40,9 @@ public: void printUnwindInfo() override; void printStackMap() const override; + // MachO-specific. + void printMachODataInCode() override; + private: template<class MachHeader> void printFileHeaders(const MachHeader &Header); @@ -600,3 +603,25 @@ void MachODumper::printStackMap() const { prettyPrintStackMap(llvm::outs(), StackMapV1Parser<support::big>(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/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index 206082fa5e2..153e5bb8972 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/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/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index 860211995d1..c6f303ddb0f 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/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<bool> + MachODataInCode("macho-data-in-code", + cl::desc("Display MachO Data in Code command")); + // -stackmap cl::opt<bool> 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(); } |