From: David Faust Date: Fri, 4 Sep 2020 08:18:56 +0000 (+0200) Subject: bpf: generate indirect calls for xBPF X-Git-Tag: releases/gcc-10.3.0~956 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00c785a4048243c002791e17f65101252d4b5f16;p=thirdparty%2Fgcc.git 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 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. (cherry picked from commit c3a0f5373919deff68819de1db88c04261d61a87) --- diff --git a/gcc/config/bpf/bpf.c b/gcc/config/bpf/bpf.c index 972a91adcd89..13181f21c5b2 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 940029ba606c..359f389a1347 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 000000000000..dc4b3cfb12dc --- /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" } } */