The kernel selftests and other BPF programs make extensive use of the `naked' function attribute with bodies written using basic inline assembly. This patch adds support for the attribute to bpf-unkonwn-none, makes it to inhibit warnings due to lack of explicit `return' statement, and updates documentation and testsuite accordingly.
Tested in x86_64-linux-gnu host and bpf-unknown-none target. gcc/ChangeLog PR target/111046 * config/bpf/bpf.cc (bpf_attribute_table): Add entry for the `naked' function attribute. (bpf_warn_func_return): New function. (TARGET_WARN_FUNC_RETURN): Define. (bpf_expand_prologue): Add preventive comment. (bpf_expand_epilogue): Likewise. * doc/extend.texi (BPF Function Attributes): Document the `naked' function attribute. gcc/testsuite/ChangeLog * gcc.target/bpf/naked-1.c: New test. --- gcc/config/bpf/bpf.cc | 25 +++++++++++++++++++++++++ gcc/doc/extend.texi | 11 +++++++++++ gcc/testsuite/gcc.target/bpf/naked-1.c | 12 ++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/gcc.target/bpf/naked-1.c diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc index 1d0abd7fbb3..437bd652de3 100644 --- a/gcc/config/bpf/bpf.cc +++ b/gcc/config/bpf/bpf.cc @@ -154,6 +154,10 @@ static const struct attribute_spec bpf_attribute_table[] = { "preserve_access_index", 0, -1, false, true, false, true, bpf_handle_preserve_access_index_attribute, NULL }, + /* Support for `naked' function attribute. */ + { "naked", 0, 1, false, false, false, false, + bpf_handle_fndecl_attribute, NULL }, + /* The last attribute spec is set to be NULL. */ { NULL, 0, 0, false, false, false, false, NULL, NULL } }; @@ -335,6 +339,21 @@ bpf_function_value_regno_p (const unsigned int regno) #undef TARGET_FUNCTION_VALUE_REGNO_P #define TARGET_FUNCTION_VALUE_REGNO_P bpf_function_value_regno_p + +/* Determine whether to warn about lack of return statement in a + function. */ + +static bool +bpf_warn_func_return (tree decl) +{ + /* Naked functions are implemented entirely in assembly, including + the return instructions. */ + return lookup_attribute ("naked", DECL_ATTRIBUTES (decl)) == NULL_TREE; +} + +#undef TARGET_WARN_FUNC_RETURN +#define TARGET_WARN_FUNC_RETURN bpf_warn_func_return + /* Compute the size of the function's stack frame, including the local area and the register-save area. */ @@ -388,6 +407,9 @@ bpf_expand_prologue (void) dynamically. This should have been checked already and an error emitted. */ gcc_assert (!cfun->calls_alloca); + + /* If we ever need to have a proper prologue here, please mind the + `naked' function attribute. */ } /* Expand to the instructions in a function epilogue. This function @@ -399,6 +421,9 @@ bpf_expand_epilogue (void) /* See note in bpf_expand_prologue for an explanation on why we are not restoring callee-saved registers in BPF. */ + /* If we ever need to do anything else than just generating a return + instruction here, please mind the `naked' function attribute. */ + emit_jump_insn (gen_exit ()); } diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index b363386df6e..f657032cbef 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -5172,6 +5172,17 @@ attribute. Example: int bpf_probe_read (void *dst, int size, const void *unsafe_ptr) __attribute__ ((kernel_helper (4))); @end smallexample + +@cindex @code{naked} function attribute, BPF +@item naked +This attribute allows the compiler to construct the requisite function +declaration, while allowing the body of the function to be assembly +code. The specified function will not have prologue/epilogue +sequences generated by the compiler. Only basic @code{asm} statements +can safely be included in naked functions (@pxref{Basic Asm}). While +using extended @code{asm} or a mixture of basic @code{asm} and C code +may appear to work, they cannot be depended upon to work reliably and +are not supported. @end table @node C-SKY Function Attributes diff --git a/gcc/testsuite/gcc.target/bpf/naked-1.c b/gcc/testsuite/gcc.target/bpf/naked-1.c new file mode 100644 index 00000000000..cbbc4c51697 --- /dev/null +++ b/gcc/testsuite/gcc.target/bpf/naked-1.c @@ -0,0 +1,12 @@ +/* Verify that __attribute__((naked)) is accepted and + produces a naked function. Also, the compiler must not + warn for the lack of return statement. */ +/* { dg-do compile } */ +/* { dg-options "-O0 -Wreturn-type" } */ + +int __attribute__((naked)) foo() +{ + __asm__ volatile ("@ naked"); +} +/* { dg-final { scan-assembler "\t@ naked" } } */ +/* { dg-final { scan-assembler "\texit\n" } } */ -- 2.30.2