[llvm] 24f0b6b - [llvm-objdump] avoid crash disassembling unknown instruction
Sjoerd Meijer via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 31 04:42:14 PST 2020
Author: Sjoerd Meijer
Date: 2020-01-31T12:41:31Z
New Revision: 24f0b6b6d8e798f76621af9ea6ccda0568d28703
URL: https://github.com/llvm/llvm-project/commit/24f0b6b6d8e798f76621af9ea6ccda0568d28703
DIFF: https://github.com/llvm/llvm-project/commit/24f0b6b6d8e798f76621af9ea6ccda0568d28703.diff
LOG: [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
Added:
llvm/test/tools/llvm-objdump/ARM/unknown-instr.test
Modified:
llvm/tools/llvm-objdump/llvm-objdump.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-objdump/ARM/unknown-instr.test b/llvm/test/tools/llvm-objdump/ARM/unknown-instr.test
new file mode 100644
index 000000000000..2e4628084147
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ARM/unknown-instr.test
@@ -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"
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 984b3f58dad4..6c95d366040f 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1431,6 +1431,14 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
outs() << CommentStream.str();
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
// symbol.
if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) ||
More information about the llvm-commits
mailing list