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

