From 24f0b6b6d8e798f76621af9ea6ccda0568d28703 Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Fri, 31 Jan 2020 11:49:20 +0000 Subject: [PATCH] [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 --- .../tools/llvm-objdump/ARM/unknown-instr.test | 28 +++++++++++++++++++ llvm/tools/llvm-objdump/llvm-objdump.cpp | 8 ++++++ 2 files changed, 36 insertions(+) create mode 100644 llvm/test/tools/llvm-objdump/ARM/unknown-instr.test 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 +# 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) ||