bpf: do not save/restore callee-saved registers in function prolog/epilog
authorJose E. Marchesi <jose.marchesi@oracle.com>
Tue, 19 May 2020 09:46:40 +0000 (11:46 +0200)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Tue, 19 May 2020 09:46:40 +0000 (11:46 +0200)
commit98456a64b0b5c20eeb8f964c7718072ba9b0e568
tree3d36b779e491302a4e2072b5fec294e59c9c1b37
parent51e10276d6792f67f1d88d90f299e7ac1b1f1f24
bpf: do not save/restore callee-saved registers in function prolog/epilog

BPF considers that every call to a function allocates a fresh set of
registers that are available to the callee, of which the first five
may have bee initialized with the function arguments.  This is
implemented by both interpreter and JIT in the Linux kernel.

This is enforced by the kernel BPF verifier, which will reject any
code in which non-initialized registers are accessed before being
written.  Consequently, the spill instructions generated in function
prologue were causing the verifier to reject our compiled programs.

This patch makes GCC to not save/restore callee-saved registers in
function prologue/epilogue, unless xBPF mode is enabled.

2020-05-19  Jose E. Marchesi  <jose.marchesi@oracle.com>

gcc/
* config/bpf/bpf.c (bpf_compute_frame_layout): Include space for
callee saved registers only in xBPF.
(bpf_expand_prologue): Save callee saved registers only in xBPF.
(bpf_expand_epilogue): Likewise for restoring.
* doc/invoke.texi (eBPF Options): Document this is activated by
-mxbpf.

gcc/testsuite/
* gcc.target/bpf/xbpf-callee-saved-regs-1.c: New test.
* gcc.target/bpf/xbpf-callee-saved-regs-2.c: Likewise.
gcc/ChangeLog
gcc/config/bpf/bpf.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/bpf/xbpf-callee-saved-regs-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/xbpf-callee-saved-regs-2.c [new file with mode: 0644]