[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

llvm-svn: 247106
This commit is contained in:
Davide Italiano 2015-09-09 00:21:18 +00:00
parent ee381ffba4
commit 9a429b766f
5 changed files with 63 additions and 49 deletions

View 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: }

View 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"}}}

View 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;
}
}
}
}

View File

@ -61,6 +61,7 @@ public:
virtual void printMachODysymtab() { }
virtual void printMachOSegment() { }
virtual void printMachOIndirectSymbols() { }
virtual void printMachOLinkerOptions() { }
virtual void printStackMap() const = 0;

View 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)