[PATCH] bpf: generate indirect calls for xBPF

David Faust david.faust@oracle.com
Thu Sep 3 16:37:44 GMT 2020


This patch updates the BPF back end to generate indirect calls via
the 'call %reg' instruction when targetting xBPF.

Additionally, the BPF ASM_SPEC is updated to pass along -mxbpf to
gas, where it is now supported.

2020-09-03  David Faust  <david.faust@oracle.com>

gcc/

	* config/bpf/bpf.h (ASM_SPEC): Pass -mxbpf to gas, if specified.
	* config/bpf/bpf.c (bpf_output_call): Support indirect calls in xBPF.

gcc/testsuite/

	* gcc.target/bpf/xbpf-indirect-call-1.c: New test.
---
 gcc/config/bpf/bpf.c                          |  9 ++++++--
 gcc/config/bpf/bpf.h                          |  2 +-
 .../gcc.target/bpf/xbpf-indirect-call-1.c     | 21 +++++++++++++++++++
 3 files changed, 29 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/bpf/xbpf-indirect-call-1.c

diff --git a/gcc/config/bpf/bpf.c b/gcc/config/bpf/bpf.c
index 972a91adcd8..13181f21c5b 100644
--- a/gcc/config/bpf/bpf.c
+++ b/gcc/config/bpf/bpf.c
@@ -705,8 +705,13 @@ bpf_output_call (rtx target)
 	break;
       }
     default:
-      error ("indirect call in function, which are not supported by eBPF");
-      output_asm_insn ("call 0", NULL);
+      if (TARGET_XBPF)
+	output_asm_insn ("call\t%0", &target);
+      else
+	{
+	  error ("indirect call in function, which are not supported by eBPF");
+	  output_asm_insn ("call 0", NULL);
+	}
       break;
     }
 
diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h
index 940029ba606..359f389a134 100644
--- a/gcc/config/bpf/bpf.h
+++ b/gcc/config/bpf/bpf.h
@@ -22,7 +22,7 @@
 
 /**** Controlling the Compilation Driver.  */
 
-#define ASM_SPEC "%{mbig-endian:-EB} %{!mbig-endian:-EL}"
+#define ASM_SPEC "%{mbig-endian:-EB} %{!mbig-endian:-EL} %{mxbpf:-mxbpf}"
 #define LINK_SPEC "%{mbig-endian:-EB} %{!mbig-endian:-EL}"
 #define LIB_SPEC ""
 #define STARTFILE_SPEC ""
diff --git a/gcc/testsuite/gcc.target/bpf/xbpf-indirect-call-1.c b/gcc/testsuite/gcc.target/bpf/xbpf-indirect-call-1.c
new file mode 100644
index 00000000000..dc4b3cfb12d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/bpf/xbpf-indirect-call-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mxbpf" } */
+
+/* GCC should generate an indirect call instruction (call %REG)
+   when targetting xBPF.  */
+
+void
+foo ()
+{
+  ;
+}
+
+void
+bar()
+{
+  void (*funp) () = &foo;
+
+  (*funp) ();
+}
+
+/* { dg-final { scan-assembler "call\t%r" } } */
-- 
2.26.2



More information about the Gcc-patches mailing list