[PATCH] D80156: [BPF] Prevent disassembly segfault for NOP insn
Yonghong Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 18 14:06:08 PDT 2020
yonghong-song created this revision.
yonghong-song added a reviewer: ast.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
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 it.
Note that instruction "r0 = r0" should not appear in non inline
asm codes, we BPF Machine Instruction Peephole optimization will
remove it.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80156
Files:
llvm/lib/Target/BPF/BPFInstrInfo.td
llvm/test/CodeGen/BPF/objdump_nop.ll
Index: llvm/test/CodeGen/BPF/objdump_nop.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/BPF/objdump_nop.ll
@@ -0,0 +1,19 @@
+; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
+;
+; Source:
+; int test() {
+; asm volatile("r0 = r0" ::);
+; return 0;
+; }
+; Compilation flag:
+; clang -target bpf -O2 -S -emit-llvm t.c
+
+; Function Attrs: nounwind
+define dso_local i32 @test() local_unnamed_addr {
+entry:
+ tail call void asm sideeffect "r0 = r0", ""()
+ ret i32 0
+}
+; CHECK-LABEL: test
+; CHECK: r0 = r0
+; CHECK: r0 = 0
Index: llvm/lib/Target/BPF/BPFInstrInfo.td
===================================================================
--- llvm/lib/Target/BPF/BPFInstrInfo.td
+++ llvm/lib/Target/BPF/BPFInstrInfo.td
@@ -526,7 +526,7 @@
let BPFClass = BPF_ALU64;
}
-let hasSideEffects = 0 in
+let hasSideEffects = 0, isCodeGenOnly = 1 in
def NOP : NOP_I<"nop">;
class RET<string OpcodeStr>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80156.264711.patch
Type: text/x-patch
Size: 1021 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200518/f07dfb26/attachment.bin>
More information about the llvm-commits
mailing list