1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +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:
Davide Italiano 2015-08-21 20:28:30 +00:00
parent 68bf0df954
commit 256ba29add
3 changed files with 36 additions and 0 deletions

View File

@ -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);
}
}
}
}

View File

@ -54,6 +54,9 @@ public:
virtual void printCOFFDirectives() { }
virtual void printCOFFBaseReloc() { }
// Only implemented for MachO.
virtual void printMachODataInCode() { }
virtual void printStackMap() const = 0;
protected:

View File

@ -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();
}