mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[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
This commit is contained in:
parent
68bf0df954
commit
256ba29add
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,6 +54,9 @@ public:
|
||||
virtual void printCOFFDirectives() { }
|
||||
virtual void printCOFFBaseReloc() { }
|
||||
|
||||
// Only implemented for MachO.
|
||||
virtual void printMachODataInCode() { }
|
||||
|
||||
virtual void printStackMap() const = 0;
|
||||
|
||||
protected:
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user