[all-commits] [llvm/llvm-project] ddff97: [BPF] Prevent disassembly segfault for NOP insn
yonghong-song via All-commits
all-commits at lists.llvm.org
Mon May 18 17:41:06 PDT 2020
Branch: refs/heads/master
Home: https://github.com/llvm/llvm-project
Commit: ddff9799d2d0052653aa0385969b418a87bf5d7c
https://github.com/llvm/llvm-project/commit/ddff9799d2d0052653aa0385969b418a87bf5d7c
Author: Yonghong Song <yhs at fb.com>
Date: 2020-05-18 (Mon, 18 May 2020)
Changed paths:
M llvm/lib/Target/BPF/BPFInstrInfo.td
A llvm/test/CodeGen/BPF/objdump_nop.ll
Log Message:
-----------
[BPF] Prevent disassembly segfault for NOP insn
For a simple program like below:
-bash-4.4$ cat t.c
int test() {
asm volatile("r0 = r0" ::);
return 0;
}
compiled with
clang -target bpf -O2 -c t.c
the following llvm-objdump command will segfault.
llvm-objdump -d t.o
0: bf 00 00 00 00 00 00 00 nop
llvm-objdump: ../include/llvm/ADT/SmallVector.h:180
...
Assertion `idx < size()' failed
...
abort
...
llvm::BPFInstPrinter::printOperand
llvm::BPFInstPrinter::printInstruction
...
The reason is both NOP and MOV_rr (r0 = r0) having the same encoding.
The disassembly getInstruction() decodes to be a NOP instruciton but
during printInstruction() the same encoding is interpreted as
a MOV_rr instruction. Such a mismatcch caused the segfault.
The fix is to make NOP instruction as CodeGen only so disassembler
will skip NOP insn for disassembling.
Note that instruction "r0 = r0" should not appear in non inline
asm codes since BPF Machine Instruction Peephole optimization will
remove it.
Differential Revision: https://reviews.llvm.org/D80156
More information about the All-commits
mailing list