From 17913067f5050081771b4ad7c8499af80a696eea Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Tue, 17 Mar 2015 21:07:39 +0000 Subject: [PATCH] Add the option, -no-leading-addr llvm-objdump used with -macho and -disassemble or -section to not print the leading addresses on each line. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232547 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm-objdump/X86/macho-cstring-dump.test | 5 ++ .../X86/macho-dis-no-leading-addr.test | 24 ++++++++++ tools/llvm-objdump/MachODump.cpp | 48 +++++++++++-------- 3 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 test/tools/llvm-objdump/X86/macho-dis-no-leading-addr.test diff --git a/test/tools/llvm-objdump/X86/macho-cstring-dump.test b/test/tools/llvm-objdump/X86/macho-cstring-dump.test index a45690dbd7d..0e19f51d6a6 100644 --- a/test/tools/llvm-objdump/X86/macho-cstring-dump.test +++ b/test/tools/llvm-objdump/X86/macho-cstring-dump.test @@ -1,8 +1,13 @@ RUN: llvm-objdump -m -section __TEXT,__cstring %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s +RUN: llvm-objdump -m -section __TEXT,__cstring -no-leading-addr %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s -check-prefix=NO_ADDR RUN: llvm-objdump -m -section __TEXT,__cstring -non-verbose %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s -check-prefix=NON_VERBOSE CHECK: Contents of (__TEXT,__cstring) section CHECK: 000000000000003b Hello world\n +NO_ADDR: Contents of (__TEXT,__cstring) section +NO_ADDR: Hello world\n +NO_ADDR-NOT: 000000000000003b + NON_VERBOSE: Contents of (__TEXT,__cstring) section NON_VERBOSE: 000000000000003b 48 65 6c 6c 6f 20 77 6f 72 6c 64 0a 00 diff --git a/test/tools/llvm-objdump/X86/macho-dis-no-leading-addr.test b/test/tools/llvm-objdump/X86/macho-dis-no-leading-addr.test new file mode 100644 index 00000000000..df4618dc468 --- /dev/null +++ b/test/tools/llvm-objdump/X86/macho-dis-no-leading-addr.test @@ -0,0 +1,24 @@ +# RUN: llvm-objdump -m -d %p/Inputs/hello.obj.macho-x86_64 -no-show-raw-insn -print-imm-hex -no-leading-addr | FileCheck %s + +# CHECK: (__TEXT,__text) section +# CHECK: _main: +# CHECK: pushq %rbp +# CHECK: movq %rsp, %rbp +# CHECK: subq $0x20, %rsp +# CHECK: leaq L_.str(%rip), %rax ## literal pool for: "Hello world\n" +# CHECK: movl $_main, -0x4(%rbp) +# CHECK: movl %edi, -0x8(%rbp) +# CHECK: movq %rsi, -0x10(%rbp) +# CHECK: movq %rdx, -0x18(%rbp) +# CHECK: movq %rax, %rdi +# CHECK: movb $0x0, %al +# CHECK: callq _printf +# CHECK: movl $_main, %ecx +# CHECK: movl %eax, -0x1c(%rbp) +# CHECK: movl %ecx, %eax +# CHECK: addq $0x20, %rsp +# CHECK: popq %rbp +# CHECK: retq + +# CHECK-NOT: 0: +# CHECK-NOT: 0000000000000000 diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 3281b321fe7..2b0b268e1bc 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -63,6 +63,10 @@ static cl::opt DSYMFile("dsym", static cl::opt FullLeadingAddr("full-leading-addr", cl::desc("Print full leading address")); +static cl::opt NoLeadingAddr("no-leading-addr", + cl::desc("Print no leading address")); + + static cl::opt PrintImmHex("print-imm-hex", cl::desc("Use hex format for immediate values")); @@ -1072,20 +1076,20 @@ static void DumpSectionContents(StringRef Filename, MachOObjectFile *O, outs() << "zerofill section and has no contents in the file\n"; break; case MachO::S_CSTRING_LITERALS: - DumpCstringSection(O, sect, sect_size, sect_addr, verbose); + DumpCstringSection(O, sect, sect_size, sect_addr, !NoLeadingAddr); break; case MachO::S_4BYTE_LITERALS: - DumpLiteral4Section(O, sect, sect_size, sect_addr, verbose); + DumpLiteral4Section(O, sect, sect_size, sect_addr, !NoLeadingAddr); break; case MachO::S_8BYTE_LITERALS: - DumpLiteral8Section(O, sect, sect_size, sect_addr, verbose); + DumpLiteral8Section(O, sect, sect_size, sect_addr, !NoLeadingAddr); break; case MachO::S_16BYTE_LITERALS: - DumpLiteral16Section(O, sect, sect_size, sect_addr, verbose); - break; + DumpLiteral16Section(O, sect, sect_size, sect_addr, !NoLeadingAddr); + break; case MachO::S_LITERAL_POINTERS: DumpLiteralPointerSection(O, Section, sect, sect_size, sect_addr, - verbose); + !NoLeadingAddr); break; case MachO::S_MOD_INIT_FUNC_POINTERS: case MachO::S_MOD_TERM_FUNC_POINTERS: @@ -3290,13 +3294,15 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, MCInst Inst; uint64_t PC = SectAddress + Index; - if (FullLeadingAddr) { - if (MachOOF->is64Bit()) - outs() << format("%016" PRIx64, PC); - else - outs() << format("%08" PRIx64, PC); - } else { - outs() << format("%8" PRIx64 ":", PC); + if (!NoLeadingAddr) { + if (FullLeadingAddr) { + if (MachOOF->is64Bit()) + outs() << format("%016" PRIx64, PC); + else + outs() << format("%08" PRIx64, PC); + } else { + outs() << format("%8" PRIx64 ":", PC); + } } if (!NoShowRawInsn) outs() << "\t"; @@ -3388,13 +3394,15 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, uint64_t PC = SectAddress + Index; if (DisAsm->getInstruction(Inst, InstSize, Bytes.slice(Index), PC, DebugOut, nulls())) { - if (FullLeadingAddr) { - if (MachOOF->is64Bit()) - outs() << format("%016" PRIx64, PC); - else - outs() << format("%08" PRIx64, PC); - } else { - outs() << format("%8" PRIx64 ":", PC); + if (!NoLeadingAddr) { + if (FullLeadingAddr) { + if (MachOOF->is64Bit()) + outs() << format("%016" PRIx64, PC); + else + outs() << format("%08" PRIx64, PC); + } else { + outs() << format("%8" PRIx64 ":", PC); + } } if (!NoShowRawInsn) { outs() << "\t";