aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/bpf
diff options
context:
space:
mode:
authorCupertino Miranda <cupertino.miranda@oracle.com>2023-11-23 22:28:01 +0000
committerCupertino Miranda <cupertino.miranda@oracle.com>2023-11-28 12:54:19 +0000
commitfaf5b148588bd7fbb60ec669aefa704044037cdc (patch)
treee2d1eaf343522a6382b1b488caa2dc07f68ab622 /gcc/config/bpf
parentf5f885dd29846a7aa3e3551b74e2f8d68241e4a0 (diff)
downloadgcc-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/config/bpf')
-rw-r--r--gcc/config/bpf/bpf.cc21
1 files changed, 21 insertions, 0 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.