diff options
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64 | bin | 0 -> 336 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/macho-nofirst-symbol-disassembly.test | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 29 |
3 files changed, 36 insertions, 1 deletions
diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64 Binary files differnew file mode 100644 index 00000000000..4d1ef25e676 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64 diff --git a/llvm/test/tools/llvm-objdump/X86/macho-nofirst-symbol-disassembly.test b/llvm/test/tools/llvm-objdump/X86/macho-nofirst-symbol-disassembly.test new file mode 100644 index 00000000000..98964ac8047 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/macho-nofirst-symbol-disassembly.test @@ -0,0 +1,8 @@ +// RUN: llvm-objdump -d -m %p/Inputs/nofirst-symbol.macho-x86_64 | FileCheck %s + +CHECK: 0: 90 nop +CHECK: _foo: +CHECK: 1: c3 retq +CHECK: _bar: +CHECK: 2: 90 nop +CHECK: 3: c3 retq diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index e4ddf5457fb..b70e8256625 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -6602,6 +6602,12 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, if (Bytes.size() == 0) return; + // If the section has symbols but no symbol at the start of the section + // these are used to make sure the bytes before the first symbol are + // disassembled. + bool FirstSymbol = true; + bool FirstSymbolAtSectionStart = true; + // Disassemble symbol by symbol. for (unsigned SymIdx = 0; SymIdx != Symbols.size(); SymIdx++) { Expected<StringRef> SymNameOrErr = Symbols[SymIdx].getName(); @@ -6691,11 +6697,29 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, // (i.e. we're not targeting M-class) and the function is Thumb. bool UseThumbTarget = IsThumb && ThumbTarget; - outs() << SymName << ":\n"; + // If we are not specifying a symbol to start disassembly with and this + // is the first symbol in the section but not at the start of the section + // then move the disassembly index to the start of the section and + // don't print the symbol name just yet. This is so the bytes before the + // first symbol are disassembled. + uint64_t SymbolStart = Start; + if (DisSymName.empty() && FirstSymbol && Start != 0) { + FirstSymbolAtSectionStart = false; + Start = 0; + } + else + outs() << SymName << ":\n"; + DILineInfo lastLine; for (uint64_t Index = Start; Index < End; Index += Size) { MCInst Inst; + // If this is the first symbol in the section and it was not at the + // start of the section, see if we are at its Index now and if so print + // the symbol name. + if (FirstSymbol && !FirstSymbolAtSectionStart && Index == SymbolStart) + outs() << SymName << ":\n"; + uint64_t PC = SectAddress + Index; if (!NoLeadingAddr) { if (FullLeadingAddr) { @@ -6788,6 +6812,9 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, } } } + // Now that we are done disassembled the first symbol set the bool that + // were doing this to false. + FirstSymbol = false; } if (!symbolTableWorked) { // Reading the symbol table didn't work, disassemble the whole section. |