Fix a bug in llvm-obdump(1) with the -macho and -disassemble options

which caused it to not disassemble the bytes a the start of the section if
the section had symbols and the first symbol was not at the start of the
section.

rdar://30143243

llvm-svn: 294212
This commit is contained in:
Kevin Enderby 2017-02-06 18:43:18 +00:00
parent 4ee1c95216
commit c138da3479
3 changed files with 36 additions and 1 deletions

View File

@ -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

View File

@ -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.