* [COMMITTED] bpf: support `naked' function attributes in BPF targets
@ 2023-08-17 12:41 Jose E. Marchesi
0 siblings, 0 replies; only message in thread
From: Jose E. Marchesi @ 2023-08-17 12:41 UTC (permalink / raw)
To: gcc-patches
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-08-17 12:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-17 12:41 [COMMITTED] bpf: support `naked' function attributes in BPF targets Jose E. Marchesi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).