From 69fe98da1402e12d68379ca2d7415dbfd9fb2b0e Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Fri, 23 Jan 2015 18:52:17 +0000 Subject: [PATCH] Add the option, -data-in-code, to llvm-objdump used with -macho to print the Mach-O data in code table. llvm-svn: 226921 --- .../llvm-objdump/ARM/Inputs/data-in-code.macho-arm | Bin 0 -> 336 bytes .../tools/llvm-objdump/ARM/macho-data-in-code.test | 8 ++++ llvm/tools/llvm-objdump/MachODump.cpp | 51 ++++++++++++++++++++- llvm/tools/llvm-objdump/llvm-objdump.cpp | 3 +- llvm/tools/llvm-objdump/llvm-objdump.h | 1 + 5 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm create mode 100644 llvm/test/tools/llvm-objdump/ARM/macho-data-in-code.test diff --git a/llvm/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm b/llvm/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm new file mode 100644 index 0000000000000000000000000000000000000000..e826f29a233a4065ce77bbe8576b1b87d8e60518 GIT binary patch literal 336 zcmX^2>+L@t1_lOBAZ7$&79jot#2^6T*MM1=1UFDf0H^>&vqLdRJqX0dm!wvdK-ds| zh-*X$f)8TB^rMP0G{E?pK!yMi%K!~k0MblAECIweKt9MG4I`vem+nh0JL@v0ssI2 literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/ARM/macho-data-in-code.test b/llvm/test/tools/llvm-objdump/ARM/macho-data-in-code.test new file mode 100644 index 0000000..1814dc0 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/ARM/macho-data-in-code.test @@ -0,0 +1,8 @@ +RUN: llvm-objdump -m -data-in-code %p/Inputs/data-in-code.macho-arm | FileCheck %s + +CHECK: Data in code table (4 entries) +CHECK: offset length kind +CHECK: 0x00000000 4 DATA +CHECK: 0x00000004 4 JUMP_TABLE32 +CHECK: 0x00000008 2 JUMP_TABLE16 +CHECK: 0x0000000a 1 JUMP_TABLE8 diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index d6e8e0a..fd7a4f5 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -80,6 +80,11 @@ cl::opt cl::desc("Print indirect symbol table for Mach-O " "objects (requires -macho)")); +cl::opt + llvm::DataInCode("data-in-code", + cl::desc("Print the data in code table for Mach-O objects " + "(requires -macho)")); + static cl::list ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"), cl::ZeroOrMore); @@ -389,6 +394,48 @@ static void PrintIndirectSymbols(MachOObjectFile *O, bool verbose) { } } +static void PrintDataInCodeTable(MachOObjectFile *O, bool verbose) { + MachO::linkedit_data_command DIC = O->getDataInCodeLoadCommand(); + uint32_t nentries = DIC.datasize / sizeof(struct MachO::data_in_code_entry); + outs() << "Data in code table (" << nentries << " entries)\n"; + outs() << "offset length kind\n"; + for (dice_iterator DI = O->begin_dices(), DE = O->end_dices(); DI != DE; + ++DI) { + uint32_t Offset; + DI->getOffset(Offset); + outs() << format("0x%08" PRIx32, Offset) << " "; + uint16_t Length; + DI->getLength(Length); + outs() << format("%6u", Length) << " "; + uint16_t Kind; + DI->getKind(Kind); + if (verbose) { + switch (Kind) { + case MachO::DICE_KIND_DATA: + outs() << "DATA"; + break; + case MachO::DICE_KIND_JUMP_TABLE8: + outs() << "JUMP_TABLE8"; + break; + case MachO::DICE_KIND_JUMP_TABLE16: + outs() << "JUMP_TABLE16"; + break; + case MachO::DICE_KIND_JUMP_TABLE32: + outs() << "JUMP_TABLE32"; + break; + case MachO::DICE_KIND_ABS_JUMP_TABLE32: + outs() << "ABS_JUMP_TABLE32"; + break; + default: + outs() << format("0x%04" PRIx32, Kind); + break; + } + } else + outs() << format("0x%04" PRIx32, Kind); + outs() << "\n"; + } +} + // checkMachOAndArchFlags() checks to see if the ObjectFile is a Mach-O file // and if it is and there is a list of architecture flags is specified then // check to make sure this Mach-O file is one of those architectures or all @@ -436,7 +483,7 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF, // info. And don't print it otherwise like in the case of printing the // UniversalHeaders or ArchiveHeaders. if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind || - LazyBind || WeakBind || IndirectSymbols) { + LazyBind || WeakBind || IndirectSymbols || DataInCode) { outs() << Filename; if (!ArchiveMemberName.empty()) outs() << '(' << ArchiveMemberName << ')'; @@ -449,6 +496,8 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF, DisassembleMachO(Filename, MachOOF); if (IndirectSymbols) PrintIndirectSymbols(MachOOF, true); + if (DataInCode) + PrintDataInCodeTable(MachOOF, true); if (Relocations) PrintRelocations(MachOOF); if (SectionHeaders) diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index f9660fe..cd94a3a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -894,7 +894,8 @@ int main(int argc, char **argv) { && !WeakBind && !(UniversalHeaders && MachOOpt) && !(ArchiveHeaders && MachOOpt) - && !(IndirectSymbols && MachOOpt)) { + && !(IndirectSymbols && MachOOpt) + && !(DataInCode && MachOOpt)) { cl::PrintHelpMessage(); return 2; } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 3549a79..9bc9622 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -37,6 +37,7 @@ extern cl::opt WeakBind; extern cl::opt UniversalHeaders; extern cl::opt ArchiveHeaders; extern cl::opt IndirectSymbols; +extern cl::opt DataInCode; extern cl::opt Relocations; extern cl::opt SectionHeaders; extern cl::opt SectionContents; -- 2.7.4