]> gcc.gnu.org Git - gcc.git/commitdiff
bpf: emit empty epilogues in naked functions
authorJose E. Marchesi <jose.marchesi@oracle.com>
Mon, 29 Jan 2024 16:47:00 +0000 (17:47 +0100)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Mon, 29 Jan 2024 17:51:45 +0000 (18:51 +0100)
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.

gcc/config/bpf/bpf.cc
gcc/testsuite/gcc.target/bpf/naked-1.c
gcc/testsuite/gcc.target/bpf/naked-2.c [new file with mode: 0644]

index 9af1728d8520c6608c04220dd17b6f3a2918e33e..d6ca47eeecbeb0072edb2804b401928eea79d0fa 100644 (file)
@@ -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 ());
 }
 
index cbbc4c5169769fc07ee18504d7170d18fe5a104d..dc8ac2619ccbd000cdd7bdab36167b8d8df4f885 100644 (file)
@@ -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 (file)
index 0000000..25aebf8
--- /dev/null
@@ -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 } } */
This page took 0.075548 seconds and 5 git commands to generate.