diff options
author | Kevin Enderby <enderby@apple.com> | 2012-05-18 00:13:56 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2012-05-18 00:13:56 +0000 |
commit | badd100c260da2cb4ec6f82e1c68c7e203082511 (patch) | |
tree | c21309a9a830f0f22e33232ab48435d0f672a23f /llvm/tools/llvm-objdump/MachODump.cpp | |
parent | 874e4013829a2f9c46b364f302418165e909bc9e (diff) | |
download | bcm5719-llvm-badd100c260da2cb4ec6f82e1c68c7e203082511.tar.gz bcm5719-llvm-badd100c260da2cb4ec6f82e1c68c7e203082511.zip |
Fixed a bug in llvm-objdump when disassembling using -macho option for a binary
containing no symbols. Fixed the crash and fixed it not disassembling anything.
llvm-svn: 157031
Diffstat (limited to 'llvm/tools/llvm-objdump/MachODump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 60c33f27892..5e175a004d4 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -286,8 +286,10 @@ void llvm::DisassembleInputMachO(StringRef Filename) { // Read and register the symbol table data. InMemoryStruct<macho::SymtabLoadCommand> SymtabLC; - MachOObj->ReadSymtabLoadCommand(*SymtabLCI, SymtabLC); - MachOObj->RegisterStringTable(*SymtabLC); + if (SymtabLCI) { + MachOObj->ReadSymtabLoadCommand(*SymtabLCI, SymtabLC); + MachOObj->RegisterStringTable(*SymtabLC); + } std::vector<SectionRef> Sections; std::vector<SymbolRef> Symbols; @@ -498,6 +500,31 @@ void llvm::DisassembleInputMachO(StringRef Filename) { InstrAnalysis.get(), Start, DebugOut, FunctionMap, Functions); } } + if (!CFG && !symbolTableWorked) { + // Reading the symbol table didn't work, disassemble the whole section. + uint64_t SectAddress; + Sections[SectIdx].getAddress(SectAddress); + uint64_t SectSize; + Sections[SectIdx].getSize(SectSize); + uint64_t InstSize; + for (uint64_t Index = 0; Index < SectSize; Index += InstSize) { + MCInst Inst; + + if (DisAsm->getInstruction(Inst, InstSize, memoryObject, Index, + DebugOut, nulls())) { + outs() << format("%8" PRIx64 ":\t", SectAddress + Index); + + DumpBytes(StringRef(Bytes.data() + Index, InstSize)); + IP->printInst(&Inst, outs(), ""); + + outs() << "\n"; + } else { + errs() << "llvm-objdump: warning: invalid instruction encoding\n"; + if (InstSize == 0) + InstSize = 1; // skip illegible bytes + } + } + } if (CFG) { if (!symbolTableWorked) { |