[llvm-objdump] avoid crash disassembling unknown instruction

Disassembly of instructions can fail when llvm-objdump is not given the right set of
architecture features, for example when the source is compiled with:

  clang -march=..+ext1+ext2

and disassembly is attempted with:

  llvm-objdump -mattr=+ext1

This patch avoids further analysing unknown instructions (as was happening
before) when disassembly has failed.

Differential Revision: https://reviews.llvm.org/D73531
This commit is contained in:
Sjoerd Meijer 2020-01-31 11:49:20 +00:00
parent 09217b60fc
commit 24f0b6b6d8
2 changed files with 36 additions and 0 deletions

View File

@ -0,0 +1,28 @@
# RUN: yaml2obj %s -o %t
# RUN: llvm-objdump -D -triple=thumbv8.1m.main-none-eabi %t | FileCheck %s
## This is a test case with "random" data/instructions, checking that
## llvm-objdump handles such instructions cleanly. Disassembly of instructions
## can fail when it e.g. is not given the right set of architecture features,
## for example when the source is compiled with:
##
## clang -march=..+ext1+ext2
##
## and disassembly is attempted with:
##
## llvm-objdump -mattr=+ext1
# CHECK: 00000000 .text:
# CHECK-NEXT: 0: cb <unknown>
# CHECK-NEXT: 1: f3 f7 8b be b.w #-49898
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_ARM
Sections:
- Name: .text
Type: SHT_PROGBITS
Content: "cbf3f78bbe"

View File

@ -1431,6 +1431,14 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
outs() << CommentStream.str(); outs() << CommentStream.str();
Comments.clear(); Comments.clear();
// If disassembly has failed, continue with the next instruction, to
// avoid analysing invalid/incomplete instruction information.
if (!Disassembled) {
outs() << "\n";
Index += Size;
continue;
}
// Try to resolve the target of a call, tail call, etc. to a specific // Try to resolve the target of a call, tail call, etc. to a specific
// symbol. // symbol.
if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) || if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) ||