Add the option, -data-in-code, to llvm-objdump used with -macho to print the Mach...
authorKevin Enderby <enderby@apple.com>
Fri, 23 Jan 2015 18:52:17 +0000 (18:52 +0000)
committerKevin Enderby <enderby@apple.com>
Fri, 23 Jan 2015 18:52:17 +0000 (18:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226921 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm [new file with mode: 0644]
test/tools/llvm-objdump/ARM/macho-data-in-code.test [new file with mode: 0644]
tools/llvm-objdump/MachODump.cpp
tools/llvm-objdump/llvm-objdump.cpp
tools/llvm-objdump/llvm-objdump.h

diff --git a/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm b/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm
new file mode 100644 (file)
index 0000000..e826f29
Binary files /dev/null and b/test/tools/llvm-objdump/ARM/Inputs/data-in-code.macho-arm differ
diff --git a/test/tools/llvm-objdump/ARM/macho-data-in-code.test b/test/tools/llvm-objdump/ARM/macho-data-in-code.test
new file mode 100644 (file)
index 0000000..1814dc0
--- /dev/null
@@ -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
index d6e8e0a01a8697feaed01162a078046cf2c738bd..fd7a4f5722c1bf81a29818cdf09c60e5a6c0bd05 100644 (file)
@@ -80,6 +80,11 @@ cl::opt<bool>
                           cl::desc("Print indirect symbol table for Mach-O "
                                    "objects (requires -macho)"));
 
+cl::opt<bool>
+    llvm::DataInCode("data-in-code",
+                     cl::desc("Print the data in code table for Mach-O objects "
+                              "(requires -macho)"));
+
 static cl::list<std::string>
     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)
index f9660fef9fc5810bbf9eec68d8e00f2f94467615..cd94a3a49c66841ed1147c9bfd3d95f811ee63bc 100644 (file)
@@ -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;
   }
index 3549a79d58516157075ea9948592271563e9b9a3..9bc9622c0a993d9c47405e4ded894835393641d5 100644 (file)
@@ -37,6 +37,7 @@ extern cl::opt<bool> WeakBind;
 extern cl::opt<bool> UniversalHeaders;
 extern cl::opt<bool> ArchiveHeaders;
 extern cl::opt<bool> IndirectSymbols;
+extern cl::opt<bool> DataInCode;
 extern cl::opt<bool> Relocations;
 extern cl::opt<bool> SectionHeaders;
 extern cl::opt<bool> SectionContents;