aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose E. Marchesi <jose.marchesi@oracle.com>2024-01-29 17:47:00 +0100
committerJose E. Marchesi <jose.marchesi@oracle.com>2024-01-29 18:51:45 +0100
commit1959aeee1e0e0b5eca12178444ba2f28c0ae558f (patch)
tree8034dba31a0778c30910d079d4d6be4def3a2607
parent25cd22bf02d55d0778ee7b883eb698204a120a16 (diff)
downloadgcc-1959aeee1e0e0b5eca12178444ba2f28c0ae558f.zip
gcc-1959aeee1e0e0b5eca12178444ba2f28c0ae558f.tar.gz
gcc-1959aeee1e0e0b5eca12178444ba2f28c0ae558f.tar.bz2
bpf: emit empty epilogues in naked functions
This patch fixes the BPF backend to not generate `exit' (return) instructions in epilogues of functions that are declared as naked via the corresponding compiler attribute. Having extra exit instructions upsets the kernel BPF verifier. Tested in bpf-unknown-none target in x86_64-linux-gnu host. gcc/ChangeLog * config/bpf/bpf.cc (bpf_expand_epilogue): Do not emit a return instruction in naked function epilogues. gcc/testsuite/ChangeLog * gcc.target/bpf/naked-1.c: Update test to not expect an exit instruction in naked function. * gcc.target/bpf/naked-2.c: New test.
-rw-r--r--gcc/config/bpf/bpf.cc5
-rw-r--r--gcc/testsuite/gcc.target/bpf/naked-1.c1
-rw-r--r--gcc/testsuite/gcc.target/bpf/naked-2.c10
3 files changed, 12 insertions, 4 deletions
diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc
index 9af1728..d6ca47e 100644
--- a/gcc/config/bpf/bpf.cc
+++ b/gcc/config/bpf/bpf.cc
@@ -420,9 +420,8 @@ 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. */
-
+ if (lookup_attribute ("naked", DECL_ATTRIBUTES (cfun->decl)) != NULL_TREE)
+ return;
emit_jump_insn (gen_exit ());
}
diff --git a/gcc/testsuite/gcc.target/bpf/naked-1.c b/gcc/testsuite/gcc.target/bpf/naked-1.c
index cbbc4c5..dc8ac26 100644
--- a/gcc/testsuite/gcc.target/bpf/naked-1.c
+++ b/gcc/testsuite/gcc.target/bpf/naked-1.c
@@ -9,4 +9,3 @@ int __attribute__((naked)) foo()
__asm__ volatile ("@ naked");
}
/* { dg-final { scan-assembler "\t@ naked" } } */
-/* { dg-final { scan-assembler "\texit\n" } } */
diff --git a/gcc/testsuite/gcc.target/bpf/naked-2.c b/gcc/testsuite/gcc.target/bpf/naked-2.c
new file mode 100644
index 0000000..25aebf8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/bpf/naked-2.c
@@ -0,0 +1,10 @@
+/* Verify that __attribute__((naked)) produces functions without implicit
+ `exit' instructions in the epilogue. */
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+int __attribute__((naked)) foo()
+{
+ __asm__ volatile ("exit");
+}
+/* { dg-final { scan-assembler-times "\texit" 1 } } */