mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
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:
parent
d5fce26d3c
commit
e1387d2ab9
BIN
test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64
Normal file
BIN
test/tools/llvm-objdump/X86/Inputs/nofirst-symbol.macho-x86_64
Normal file
Binary file not shown.
@ -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
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user