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.