diff options
author | David Faust <david.faust@oracle.com> | 2020-09-04 10:18:56 +0200 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2020-09-04 10:18:56 +0200 |
commit | c3a0f5373919deff68819de1db88c04261d61a87 (patch) | |
tree | 646d735c65364ba0b994032a74149ee1ed81b9e6 /gcc | |
parent | e1336703f8220dcffdeddb5e19dd032c766fbb8f (diff) | |
download | gcc-c3a0f5373919deff68819de1db88c04261d61a87.zip gcc-c3a0f5373919deff68819de1db88c04261d61a87.tar.gz gcc-c3a0f5373919deff68819de1db88c04261d61a87.tar.bz2 |
bpf: generate indirect calls for xBPF
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/bpf/bpf.c | 9 | ||||
-rw-r--r-- | gcc/config/bpf/bpf.h | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/xbpf-indirect-call-1.c | 21 |
3 files changed, 29 insertions, 3 deletions
diff --git a/gcc/config/bpf/bpf.c b/gcc/config/bpf/bpf.c index 972a91a..13181f2 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 940029b..359f389 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 0000000..dc4b3cf --- /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" } } */ |