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:
parent
0a3e6e975a
commit
5bcc0fa05e
2 changed files with 20 additions and 1 deletions
|
@ -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
|
||||
|
|
14
gcc/testsuite/gcc.target/bpf/nop-1.c
Normal file
14
gcc/testsuite/gcc.target/bpf/nop-1.c
Normal 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" } } */
|
Loading…
Add table
Reference in a new issue