[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