Skip to content

Commit

Permalink
Fix a bug in llvm-obdump(1) with the -macho and -disassemble options
Browse files Browse the repository at this point in the history
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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294212 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
enderby committed Feb 6, 2017
1 parent 058101e commit 91a32fe
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 1 deletion.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -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
29 changes: 28 additions & 1 deletion tools/llvm-objdump/MachODump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 91a32fe

Please sign in to comment.