[llvm-readobj] MachO -- dump LinkerOptions load command.
authorDavide Italiano <davide@freebsd.org>
Wed, 9 Sep 2015 00:21:18 +0000 (00:21 +0000)
committerDavide Italiano <davide@freebsd.org>
Wed, 9 Sep 2015 00:21:18 +0000 (00:21 +0000)
Example output:

Linker Options {
  Size: 32
  Count: 2
  Strings [
    Value: -framework
    Value: Cocoa
  ]
}

There were only two tests using this -- so I converted them as part of
this commit rather than separately.

Differential Revision:  http://reviews.llvm.org/D12702

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247106 91177308-0d34-0410-b5e6-96231b3b80d8

test/MC/MachO/linker-option-2.s
test/MC/MachO/linker-options.ll
tools/llvm-readobj/MachODumper.cpp
tools/llvm-readobj/ObjDumper.h
tools/llvm-readobj/llvm-readobj.cpp

index 15ce60e..415d02e 100644 (file)
@@ -1,25 +1,18 @@
-// RUN: llvm-mc -n -triple x86_64-apple-darwin10 %s -filetype=obj | macho-dump | FileCheck %s
-
-// CHECK: ('load_commands_size', 120)
-// CHECK: ('load_commands', [
-// CHECK:   # Load Command 2
-// CHECK:  (('command', 45)
-// CHECK:   ('size', 16)
-// CHECK:   ('count', 1)
-// CHECK:   ('_strings', [
-// CHECK:      "a",
-// CHECK:   ])
-// CHECK:  ),
-// CHECK:   # Load Command 3
-// CHECK:  (('command', 45)
-// CHECK:   ('size', 16)
-// CHECK:   ('count', 2)
-// CHECK:   ('_strings', [
-// CHECK:      "a",
-// CHECK:      "b",
-// CHECK:   ])
-// CHECK:  ),
-// CHECK: ])
+// RUN: llvm-mc -n -triple x86_64-apple-darwin10 %s -filetype=obj | llvm-readobj -macho-linker-options | FileCheck %s
 
 .linker_option "a"
 .linker_option "a", "b"
+
+// CHECK: Linker Options {
+// CHECK:   Size: 16
+// CHECK:   Strings [
+// CHECK:     Value: a
+// CHECK:   ]
+// CHECK: }
+// CHECK: Linker Options {
+// CHECK:   Size: 16
+// CHECK:   Strings [
+// CHECK:     Value: a
+// CHECK:     Value: b
+// CHECK:   ]
+// CHECK: }
index 2cda835..09ebd0f 100644 (file)
@@ -4,35 +4,28 @@
 ; CHECK-ASM: .linker_option "-lz"
 ; CHECK-ASM-NEXT: .linker_option "-framework", "Cocoa"
 
-; RUN: llc -O0 -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | macho-dump > %t
+; RUN: llc -O0 -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-readobj -macho-linker-options > %t
 ; RUN: FileCheck --check-prefix=CHECK-OBJ < %t %s
 
-; CHECK-OBJ: ('load_commands', [
-; CHECK-OBJ:   # Load Command 1
-; CHECK-OBJ:  (('command', 45)
-; CHECK-OBJ:   ('size', 16)
-; CHECK-OBJ:   ('count', 1)
-; CHECK-OBJ:   ('_strings', [
-; CHECK-OBJ:   "-lz",
-; CHECK-OBJ:   ])
-; CHECK-OBJ:  ),
-; CHECK-OBJ:   # Load Command 2
-; CHECK-OBJ:  (('command', 45)
-; CHECK-OBJ:   ('size', 32)
-; CHECK-OBJ:   ('count', 2)
-; CHECK-OBJ:   ('_strings', [
-; CHECK-OBJ:   "-framework",
-; CHECK-OBJ:   "Cocoa",
-; CHECK-OBJ:   ])
-; CHECK-OBJ:   # Load Command 3
-; CHECK-OBJ:  (('command', 45)
-; CHECK-OBJ:   ('size', 24)
-; CHECK-OBJ:   ('count', 1)
-; CHECK-OBJ:   ('_strings', [
-; CHECK-OBJ:   "-lmath",
-; CHECK-OBJ:   ])
-; CHECK-OBJ:  ),
-; CHECK-OBJ: ])
+; CHECK-OBJ: Linker Options {
+; CHECK-OBJ:   Size: 16
+; CHECK-OBJ:   Strings [
+; CHECK-OBJ:     Value: -lz
+; CHECK-OBJ:   ]
+; CHECK-OBJ: }
+; CHECK-OBJ: Linker Options {
+; CHECK-OBJ:   Size: 32
+; CHECK-OBJ:   Strings [
+; CHECK-OBJ:     Value: -framework
+; CHECK-OBJ:     Value: Cocoa
+; CHECK-OBJ:   ]
+; CHECK-OBJ: }
+; CHECK-OBJ: Linker Options {
+; CHECK-OBJ:   Size: 24
+; CHECK-OBJ:   Strings [
+; CHECK-OBJ:     Value: -lmath
+; CHECK-OBJ:   ]
+; CHECK-OBJ: }
 
 !0 = !{i32 6, !"Linker Options", !{!{!"-lz"}, !{!"-framework", !"Cocoa"}, !{!"-lmath"}}}
 
index fd6e00b..177f79f 100644 (file)
@@ -46,6 +46,7 @@ public:
   void printMachODysymtab() override;
   void printMachOSegment() override;
   void printMachOIndirectSymbols() override;
+  void printMachOLinkerOptions () override;
 
 private:
   template<class MachHeader>
@@ -791,3 +792,22 @@ void MachODumper::printMachOIndirectSymbols() {
     }
   }
 }
+
+void MachODumper::printMachOLinkerOptions() {
+  for (const auto &Load : Obj->load_commands()) {
+    if (Load.C.cmd == MachO::LC_LINKER_OPTION) {
+      MachO::linker_option_command LOLC = Obj->getLinkerOptionLoadCommand(Load);
+      DictScope Group(W, "Linker Options");
+      W.printNumber("Size", LOLC.cmdsize);
+      ListScope D(W, "Strings");
+      uint64_t DataSize = LOLC.cmdsize - sizeof(MachO::linker_option_command);
+      const char *P = Load.Ptr + sizeof(MachO::linker_option_command);
+      StringRef Data(P, DataSize);
+      for (unsigned i = 0; i < LOLC.count; ++i) {
+        std::pair<StringRef,StringRef> Split = Data.split('\0');
+        W.printString("Value", Split.first);
+        Data = Split.second;
+      }
+    }
+  }
+}
index 6501521..1a80b0a 100644 (file)
@@ -61,6 +61,7 @@ public:
   virtual void printMachODysymtab() { }
   virtual void printMachOSegment() { }
   virtual void printMachOIndirectSymbols() { }
+  virtual void printMachOLinkerOptions() { }
 
   virtual void printStackMap() const = 0;
 
index 2e17525..a8e4ca4 100644 (file)
@@ -192,6 +192,11 @@ namespace opts {
   MachOIndirectSymbols("macho-indirect-symbols",
                   cl::desc("Display MachO indirect symbols"));
 
+  // -macho-linker-options
+  cl::opt<bool>
+  MachOLinkerOptions("macho-linker-options",
+                  cl::desc("Display MachO linker options"));
+
   // -macho-segment
   cl::opt<bool>
   MachOSegment("macho-segment",
@@ -343,6 +348,8 @@ static void dumpObject(const ObjectFile *Obj) {
       Dumper->printMachODataInCode();
     if (opts::MachOIndirectSymbols)
       Dumper->printMachOIndirectSymbols();
+    if (opts::MachOLinkerOptions)
+      Dumper->printMachOLinkerOptions();
     if (opts::MachOSegment)
       Dumper->printMachOSegment();
     if (opts::MachOVersionMin)