forked from OSchip/llvm-project
[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:
parent
09217b60fc
commit
24f0b6b6d8
|
@ -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"
|
|
@ -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) ||
|
||||||
|
|
Loading…
Reference in New Issue