[llvm] r247106 - [llvm-readobj] MachO -- dump LinkerOptions load command.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 8 17:21:18 PDT 2015


Author: davide
Date: Tue Sep  8 19:21:18 2015
New Revision: 247106

URL: http://llvm.org/viewvc/llvm-project?rev=247106&view=rev
Log:
[llvm-readobj] MachO -- dump LinkerOptions load command.

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

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

Modified: llvm/trunk/test/MC/MachO/linker-option-2.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/linker-option-2.s?rev=247106&r1=247105&r2=247106&view=diff
==============================================================================
--- llvm/trunk/test/MC/MachO/linker-option-2.s (original)
+++ llvm/trunk/test/MC/MachO/linker-option-2.s Tue Sep  8 19:21:18 2015
@@ -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: }

Modified: llvm/trunk/test/MC/MachO/linker-options.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/linker-options.ll?rev=247106&r1=247105&r2=247106&view=diff
==============================================================================
--- llvm/trunk/test/MC/MachO/linker-options.ll (original)
+++ llvm/trunk/test/MC/MachO/linker-options.ll Tue Sep  8 19:21:18 2015
@@ -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"}}}
 

Modified: llvm/trunk/tools/llvm-readobj/MachODumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/MachODumper.cpp?rev=247106&r1=247105&r2=247106&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/MachODumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/MachODumper.cpp Tue Sep  8 19:21:18 2015
@@ -46,6 +46,7 @@ public:
   void printMachODysymtab() override;
   void printMachOSegment() override;
   void printMachOIndirectSymbols() override;
+  void printMachOLinkerOptions () override;
 
 private:
   template<class MachHeader>
@@ -790,4 +791,23 @@ void MachODumper::printMachOIndirectSymb
       }
     }
   }
+}
+
+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;
+      }
+    }
+  }
 }

Modified: llvm/trunk/tools/llvm-readobj/ObjDumper.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ObjDumper.h?rev=247106&r1=247105&r2=247106&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ObjDumper.h (original)
+++ llvm/trunk/tools/llvm-readobj/ObjDumper.h Tue Sep  8 19:21:18 2015
@@ -61,6 +61,7 @@ public:
   virtual void printMachODysymtab() { }
   virtual void printMachOSegment() { }
   virtual void printMachOIndirectSymbols() { }
+  virtual void printMachOLinkerOptions() { }
 
   virtual void printStackMap() const = 0;
 

Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=247106&r1=247105&r2=247106&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Tue Sep  8 19:21:18 2015
@@ -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
       Dumper->printMachODataInCode();
     if (opts::MachOIndirectSymbols)
       Dumper->printMachOIndirectSymbols();
+    if (opts::MachOLinkerOptions)
+      Dumper->printMachOLinkerOptions();
     if (opts::MachOSegment)
       Dumper->printMachOSegment();
     if (opts::MachOVersionMin)




More information about the llvm-commits mailing list