bpf: use the expected instruction for NOPs

The BPF ISA doesn't have a no-operation instruction, but in practice
the Linux kernel verifier performs some optimizations that rely on
these instructions to be encoded in a particular way.  As it turns
out, we were using the "wrong" instruction in GCC.

This patch makes GCC to generate the expected instruction for NOP (a
`ja 0') and also adds a test to make sure this is the case.

Tested in bpf-unknown-none targets.

2020-09-14  Jose E. Marchesi  <jose.marchesi@oracle.com>

gcc/

	* config/bpf/bpf.md ("nop"): Re-define as `ja 0'.

gcc/testsuite/

	* gcc.target/bpf/nop-1.c: New test.
This commit is contained in:
Jose E. Marchesi 2020-09-14 20:35:22 +02:00
parent 0a3e6e975a
commit 5bcc0fa05e
2 changed files with 20 additions and 1 deletions

View file

@ -82,10 +82,15 @@
;;;; NOPs
;; The Linux kernel verifier performs some optimizations that rely on
;; nop instructions to be encoded as `ja 0', i.e. a jump to offset 0,
;; which actually means to jump to the next instruction, since in BPF
;; offsets are expressed in 64-bit words _minus one_.
(define_insn "nop"
[(const_int 0)]
""
"mov\t%%r0,%%r0"
"ja\t0"
[(set_attr "type" "alu")])
;;;; Arithmetic/Logical

View file

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu99 --patchable-function-entry=2,1" } */
/* The purpose of this test is to make sure the right instruction is
generated for NOPs. See bpf.md for a description on why this is
important. */
int
foo ()
{
return 0;
}
/* { dg-final { scan-assembler "foo:\n\t*ja\t0" } } */