diff options
author | Cupertino Miranda <cupertino.miranda@oracle.com> | 2023-11-23 22:28:01 +0000 |
---|---|---|
committer | Cupertino Miranda <cupertino.miranda@oracle.com> | 2023-11-28 12:54:19 +0000 |
commit | faf5b148588bd7fbb60ec669aefa704044037cdc (patch) | |
tree | e2d1eaf343522a6382b1b488caa2dc07f68ab622 /gcc | |
parent | f5f885dd29846a7aa3e3551b74e2f8d68241e4a0 (diff) | |
download | gcc-faf5b148588bd7fbb60ec669aefa704044037cdc.zip gcc-faf5b148588bd7fbb60ec669aefa704044037cdc.tar.gz gcc-faf5b148588bd7fbb60ec669aefa704044037cdc.tar.bz2 |
This patch enables errors when external calls are created.
When architectural limitations or usage of builtins implies the compiler
to create function calls to external libraries that implement the
functionality, GCC will now report an error claiming that this function
calls are not compatible with eBPF target.
Examples of those are the usage of __builtin_memmove and a sign division
in BPF ISA v3 or below that will require to call __divdi3.
This is currently an eBPF limitation which does not support linking of
object files but rather "raw" non linked ones. Those object files are
loaded and relocated by libbpf and the kernel.
gcc/ChangeLog:
* config/bpf/bpf.cc (bpf_output_call): Report error in case the
function call is for a builtin.
(bpf_external_libcall): Added target hook to detect and report
error when other external calls that are not builtins.
gcc/testsuite/ChangeLog:
* gcc.target/bpf/atomic-cmpxchg-2.c: Adapted.
* gcc.target/bpf/atomic-fetch-op-3.c: Adapted.
* gcc.target/bpf/atomic-op-3.c: Adapted.
* gcc.target/bpf/atomic-xchg-2.c: Adapted.
* gcc.target/bpf/diag-sdiv.c: Adapted.
* gcc.target/bpf/diag-smod.c: Adapted.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/bpf/bpf.cc | 21 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/atomic-cmpxchg-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/atomic-fetch-op-3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/atomic-op-3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/atomic-xchg-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/diag-sdiv.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/bpf/diag-smod.c | 2 |
7 files changed, 27 insertions, 6 deletions
diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc index 4bfba28..8010801 100644 --- a/gcc/config/bpf/bpf.cc +++ b/gcc/config/bpf/bpf.cc @@ -746,6 +746,15 @@ bpf_output_call (rtx target) xops[0] = GEN_INT (TREE_INT_CST_LOW (TREE_VALUE (attr_args))); output_asm_insn ("call\t%0", xops); } + else if (fndecl_built_in_p (decl)) + { + /* For now lets report this as an error while we are not able to + link eBPF object files. In particular with libgcc. */ + tree name = DECL_NAME (decl); + error ("call to external builtin %s in function, which is not supported by " + "eBPF", name != NULL_TREE ? IDENTIFIER_POINTER (name) : "(anon)"); + output_asm_insn ("call 0", NULL); + } else output_asm_insn ("call\t%0", &target); @@ -765,6 +774,18 @@ bpf_output_call (rtx target) return ""; } +static void +bpf_external_libcall (rtx fun) +{ + tree decl = SYMBOL_REF_DECL (fun); + tree name = DECL_NAME (decl); + error ("call to external libcall %s in function, which is not supported by " + "eBPF", name != NULL_TREE ? IDENTIFIER_POINTER (name) : "(anon)"); +} + +#undef TARGET_ASM_EXTERNAL_LIBCALL +#define TARGET_ASM_EXTERNAL_LIBCALL bpf_external_libcall + /* Print register name according to assembly dialect. In normal syntax registers are printed like %rN where N is the register number. diff --git a/gcc/testsuite/gcc.target/bpf/atomic-cmpxchg-2.c b/gcc/testsuite/gcc.target/bpf/atomic-cmpxchg-2.c index 4036570..fec7205 100644 --- a/gcc/testsuite/gcc.target/bpf/atomic-cmpxchg-2.c +++ b/gcc/testsuite/gcc.target/bpf/atomic-cmpxchg-2.c @@ -6,7 +6,7 @@ foo (int *p, int *expected, int desired) { return __atomic_compare_exchange (p, expected, &desired, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED); -} +} /* { dg-error "call to external builtin" } */ int foo64 (long *p, long *expected, long desired) diff --git a/gcc/testsuite/gcc.target/bpf/atomic-fetch-op-3.c b/gcc/testsuite/gcc.target/bpf/atomic-fetch-op-3.c index 044a2f7..ea1b8e4 100644 --- a/gcc/testsuite/gcc.target/bpf/atomic-fetch-op-3.c +++ b/gcc/testsuite/gcc.target/bpf/atomic-fetch-op-3.c @@ -9,7 +9,7 @@ long test_atomic_fetch_add (long x) { return __atomic_fetch_add (&val, x, __ATOMIC_ACQUIRE); -} +} /* { dg-error "call to external builtin" } */ long test_atomic_fetch_sub (long x) diff --git a/gcc/testsuite/gcc.target/bpf/atomic-op-3.c b/gcc/testsuite/gcc.target/bpf/atomic-op-3.c index b2ce289..fefafd6 100644 --- a/gcc/testsuite/gcc.target/bpf/atomic-op-3.c +++ b/gcc/testsuite/gcc.target/bpf/atomic-op-3.c @@ -20,7 +20,7 @@ void test_atomic_and (int x) { __atomic_and_fetch (&val, x, __ATOMIC_ACQUIRE); -} +} /* { dg-error "call to external builtin" } */ void test_atomic_nand (int x) diff --git a/gcc/testsuite/gcc.target/bpf/atomic-xchg-2.c b/gcc/testsuite/gcc.target/bpf/atomic-xchg-2.c index 3b6324e..eab695b 100644 --- a/gcc/testsuite/gcc.target/bpf/atomic-xchg-2.c +++ b/gcc/testsuite/gcc.target/bpf/atomic-xchg-2.c @@ -7,7 +7,7 @@ int foo (int *p, int *new) int old; __atomic_exchange (p, new, &old, __ATOMIC_RELAXED); return old; -} +} /* { dg-error "call to external builtin" } */ int foo64 (long *p, long *new) { diff --git a/gcc/testsuite/gcc.target/bpf/diag-sdiv.c b/gcc/testsuite/gcc.target/bpf/diag-sdiv.c index c48bbf0..c333255 100644 --- a/gcc/testsuite/gcc.target/bpf/diag-sdiv.c +++ b/gcc/testsuite/gcc.target/bpf/diag-sdiv.c @@ -7,6 +7,6 @@ foo () { signed int x = 5; signed int y = 2; - signed int z = x / y; + signed int z = x / y; /* { dg-error "call to external libcall" } */ } /* { dg-final { scan-assembler-not "sdiv(32)?\t%r" } } */ diff --git a/gcc/testsuite/gcc.target/bpf/diag-smod.c b/gcc/testsuite/gcc.target/bpf/diag-smod.c index d3df308..25bcb1e 100644 --- a/gcc/testsuite/gcc.target/bpf/diag-smod.c +++ b/gcc/testsuite/gcc.target/bpf/diag-smod.c @@ -7,6 +7,6 @@ foo () { signed int x = 5; signed int y = 2; - signed int z = x % y; + signed int z = x % y; /* { dg-error "call to external libcall" } */ } /* { dg-final { scan-assembler-not "smod(32)?\t%r" } } */ |