From 98da6136d027353eedbc4721cc71c8a63a6a91af Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Tue, 20 Jan 2015 21:47:46 +0000 Subject: [PATCH] For llvm-objdump, hook up existing options to work when using -macho (the Mach-O parser). llvm-svn: 226612 --- .../tools/llvm-objdump/X86/macho-relocations.test | 7 +++++ .../llvm-objdump/X86/macho-section-contents.test | 17 ++++++++++++ .../llvm-objdump/X86/macho-section-headers.test | 8 ++++++ .../tools/llvm-objdump/X86/macho-symbol-table.test | 8 ++++++ .../tools/llvm-objdump/X86/macho-unwind-info.test | 7 +++++ llvm/tools/llvm-objdump/MachODump.cpp | 24 ++++++++--------- llvm/tools/llvm-objdump/llvm-objdump.cpp | 30 +++++++++++----------- llvm/tools/llvm-objdump/llvm-objdump.h | 9 +++++++ 8 files changed, 81 insertions(+), 29 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/X86/macho-relocations.test create mode 100644 llvm/test/tools/llvm-objdump/X86/macho-section-contents.test create mode 100644 llvm/test/tools/llvm-objdump/X86/macho-section-headers.test create mode 100644 llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test create mode 100644 llvm/test/tools/llvm-objdump/X86/macho-unwind-info.test diff --git a/llvm/test/tools/llvm-objdump/X86/macho-relocations.test b/llvm/test/tools/llvm-objdump/X86/macho-relocations.test new file mode 100644 index 0000000..536aec8 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-relocations.test @@ -0,0 +1,7 @@ +RUN: llvm-objdump -macho -r %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: RELOCATION RECORDS FOR [__text]: +CHECK: 0000000000000027 X86_64_RELOC_BRANCH _printf +CHECK: 000000000000000b X86_64_RELOC_SIGNED L_.str +CHECK: RELOCATION RECORDS FOR [__compact_unwind]: +CHECK: 0000000000000000 X86_64_RELOC_UNSIGNED __text diff --git a/llvm/test/tools/llvm-objdump/X86/macho-section-contents.test b/llvm/test/tools/llvm-objdump/X86/macho-section-contents.test new file mode 100644 index 0000000..f62b5a7 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-section-contents.test @@ -0,0 +1,17 @@ +RUN: llvm-objdump -macho -s %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: Contents of section __text: +CHECK: 0000 554889e5 4883ec20 488d0500 000000c7 UH..H.. H....... +CHECK: 0010 45fc0000 0000897d f8488975 f0488955 E......}.H.u.H.U +CHECK: 0020 e84889c7 b000e800 000000b9 00000000 .H.............. +CHECK: 0030 8945e489 c84883c4 205dc3 .E...H.. ]. +CHECK: Contents of section __cstring: +CHECK: 003b 48656c6c 6f20776f 726c640a 00 Hello world.. +CHECK: Contents of section __compact_unwind: +CHECK: 0048 00000000 00000000 3b000000 00000001 ........;....... +CHECK: 0058 00000000 00000000 00000000 00000000 ................ +CHECK: Contents of section __eh_frame: +CHECK: 0068 14000000 00000000 017a5200 01781001 .........zR..x.. +CHECK: 0078 100c0708 90010000 24000000 1c000000 ........$....... +CHECK: 0088 78ffffff ffffffff 3b000000 00000000 x.......;....... +CHECK: 0098 00410e10 8602430d 06000000 00000000 .A....C......... diff --git a/llvm/test/tools/llvm-objdump/X86/macho-section-headers.test b/llvm/test/tools/llvm-objdump/X86/macho-section-headers.test new file mode 100644 index 0000000..5159d18 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-section-headers.test @@ -0,0 +1,8 @@ +RUN: llvm-objdump -macho -h %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: Sections: +CHECK: Idx Name Size Address Type +CHECK: 0 __text 0000003b 0000000000000000 TEXT +CHECK: 1 __cstring 0000000d 000000000000003b DATA +CHECK: 2 __compact_unwind 00000020 0000000000000048 DATA +CHECK: 3 __eh_frame 00000040 0000000000000068 DATA diff --git a/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test b/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test new file mode 100644 index 0000000..5b9a4f84 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-symbol-table.test @@ -0,0 +1,8 @@ +RUN: llvm-objdump -macho -t %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: SYMBOL TABLE: +CHECK: 000000000000003b l F __TEXT,__cstring 0000000d L_.str +CHECK: 0000000000000068 l F __TEXT,__eh_frame 00000018 EH_frame0 +CHECK: 0000000000000000 g F __TEXT,__text 0000003b _main +CHECK: 0000000000000080 g F __TEXT,__eh_frame 00000028 _main.eh +CHECK: 0000000000000000 *UND* 00000000 _printf diff --git a/llvm/test/tools/llvm-objdump/X86/macho-unwind-info.test b/llvm/test/tools/llvm-objdump/X86/macho-unwind-info.test new file mode 100644 index 0000000..33db84f --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-unwind-info.test @@ -0,0 +1,7 @@ +RUN: llvm-objdump -macho -u %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: Contents of __compact_unwind section: +CHECK: Entry at offset 0x0: +CHECK: start: 0x0 _main +CHECK: length: 0x3b +CHECK: compact encoding: 0x01000000 diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 0a83843..34ad571 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -318,20 +318,16 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF, if (Disassemble) DisassembleMachO(Filename, MachOOF); - // TODO: These should/could be printed in Darwin's otool(1) or nm(1) style - // for -macho. Or just used a new option that maps to the otool(1) - // option like -r, -l, etc. Or just the normal llvm-objdump option - // but now for this slice so that the -arch options can be used. - // if (Relocations) - // PrintRelocations(MachOOF); - // if (SectionHeaders) - // PrintSectionHeaders(MachOOF); - // if (SectionContents) - // PrintSectionContents(MachOOF); - // if (SymbolTable) - // PrintSymbolTable(MachOOF); - // if (UnwindInfo) - // PrintUnwindInfo(MachOOF); + if (Relocations) + PrintRelocations(MachOOF); + if (SectionHeaders) + PrintSectionHeaders(MachOOF); + if (SectionContents) + PrintSectionContents(MachOOF); + if (SymbolTable) + PrintSymbolTable(MachOOF); + if (UnwindInfo) + printMachOUnwindInfo(MachOOF); if (PrivateHeaders) printMachOFileHeader(MachOOF); if (ExportsTrie) diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 6334859..76c8af4 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -68,14 +68,14 @@ static cl::alias Disassembled("d", cl::desc("Alias for --disassemble"), cl::aliasopt(Disassemble)); -static cl::opt -Relocations("r", cl::desc("Display the relocation entries in the file")); +cl::opt +llvm::Relocations("r", cl::desc("Display the relocation entries in the file")); -static cl::opt -SectionContents("s", cl::desc("Display the content of each section")); +cl::opt +llvm::SectionContents("s", cl::desc("Display the content of each section")); -static cl::opt -SymbolTable("t", cl::desc("Display the symbol table")); +cl::opt +llvm::SymbolTable("t", cl::desc("Display the symbol table")); cl::opt llvm::ExportsTrie("exports-trie", cl::desc("Display mach-o exported symbols")); @@ -111,9 +111,9 @@ cl::opt llvm::ArchName("arch-name", cl::desc("Target arch to disassemble for, " "see -version for available targets")); -static cl::opt -SectionHeaders("section-headers", cl::desc("Display summaries of the headers " - "for each section.")); +cl::opt +llvm::SectionHeaders("section-headers", cl::desc("Display summaries of the " + "headers for each section.")); static cl::alias SectionHeadersShort("headers", cl::desc("Alias for --section-headers"), cl::aliasopt(SectionHeaders)); @@ -132,8 +132,8 @@ llvm::NoShowRawInsn("no-show-raw-insn", cl::desc("When disassembling " "instructions, do not print " "the instruction bytes.")); -static cl::opt -UnwindInfo("unwind-info", cl::desc("Display unwind information")); +cl::opt +llvm::UnwindInfo("unwind-info", cl::desc("Display unwind information")); static cl::alias UnwindInfoShort("u", cl::desc("Alias for --unwind-info"), @@ -453,7 +453,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { } } -static void PrintRelocations(const ObjectFile *Obj) { +void llvm::PrintRelocations(const ObjectFile *Obj) { StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; // Regular objdump doesn't print relocations in non-relocatable object @@ -490,7 +490,7 @@ static void PrintRelocations(const ObjectFile *Obj) { } } -static void PrintSectionHeaders(const ObjectFile *Obj) { +void llvm::PrintSectionHeaders(const ObjectFile *Obj) { outs() << "Sections:\n" "Idx Name Size Address Type\n"; unsigned i = 0; @@ -511,7 +511,7 @@ static void PrintSectionHeaders(const ObjectFile *Obj) { } } -static void PrintSectionContents(const ObjectFile *Obj) { +void llvm::PrintSectionContents(const ObjectFile *Obj) { std::error_code EC; for (const SectionRef &Section : Obj->sections()) { StringRef Name; @@ -614,7 +614,7 @@ static void PrintCOFFSymbolTable(const COFFObjectFile *coff) { } } -static void PrintSymbolTable(const ObjectFile *o) { +void llvm::PrintSymbolTable(const ObjectFile *o) { outs() << "SYMBOL TABLE:\n"; if (const COFFObjectFile *coff = dyn_cast(o)) { diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 491a819..a0e0d5a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -36,6 +36,11 @@ extern cl::opt LazyBind; extern cl::opt WeakBind; extern cl::opt UniversalHeaders; extern cl::opt ArchiveHeaders; +extern cl::opt Relocations; +extern cl::opt SectionHeaders; +extern cl::opt SectionContents; +extern cl::opt SymbolTable; +extern cl::opt UnwindInfo; // Various helper functions. bool error(std::error_code ec); @@ -57,6 +62,10 @@ void printRebaseTable(const object::ObjectFile *o); void printBindTable(const object::ObjectFile *o); void printLazyBindTable(const object::ObjectFile *o); void printWeakBindTable(const object::ObjectFile *o); +void PrintRelocations(const object::ObjectFile *o); +void PrintSectionHeaders(const object::ObjectFile *o); +void PrintSectionContents(const object::ObjectFile *o); +void PrintSymbolTable(const object::ObjectFile *o); } // end namespace llvm -- 2.7.4