aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/bpf
diff options
context:
space:
mode:
authorJose E. Marchesi <jose.marchesi@oracle.com>2024-04-24 13:48:51 +0200
committerJose E. Marchesi <jose.marchesi@oracle.com>2024-04-24 13:54:56 +0200
commit152d945d42136737305fd55f1239a3dd6037c8a7 (patch)
tree2b754adae679b407beccc6c889456083e2ab5ba7 /gcc/config/bpf
parentcc48418cfc2e555d837ae9138cbfac23acb3cdf9 (diff)
downloadgcc-152d945d42136737305fd55f1239a3dd6037c8a7.zip
gcc-152d945d42136737305fd55f1239a3dd6037c8a7.tar.gz
gcc-152d945d42136737305fd55f1239a3dd6037c8a7.tar.bz2
bpf: define BPF feature pre-processor macros
This commit makes the BPF backend to define the following macros for c-family languages: __BPF_CPU_VERSION__ This is a numeric value identifying the version of the BPF "cpu" for which GCC is generating code. __BPF_FEATURE_ALU32 __BPF_FEATURE_JMP32 __BPF_FEATURE_JMP_EXT __BPF_FEATURE_BSWAP __BPF_FEATURE_SDIV_SMOD __BPF_FEATURE_MOVSX __BPF_FEATURE_LDSX __BPF_FEATURE_GOTOL __BPF_FEATURE_ST These are defines if the corresponding "feature" is enabled. The features are implicitly enabled by the BPF CPU version enabled, and most of them can also be enabled/disabled using target-specific -m[no-]FEATURE command line switches. Note that this patch moves the definition of bpf_target_macros, that implements TARGET_CPU_CPP_BUILTINS in the BPF backend, to a bpf-c.cc file. This is because we are now using facilities from c-family/* and these features are not available in compilers like lto1. A couple of tests are also added. Tested in target bpf-unknown-none-gcc and host x86_64-linux-gnu. No regressions. gcc/ChangeLog * config.gcc: Add bpf-c.o as a target object for C and C++. * config/bpf/bpf.cc (bpf_target_macros): Move to bpf-c.cc. * config/bpf/bpf-c.cc: New file. (bpf_target_macros): Move from bpf.cc and define BPF CPU feature macros. * config/bpf/t-bpf: Add rules to build bpf-c.o. gcc/testsuite/ChangeLog * gcc.target/bpf/feature-macro-1.c: New test. * gcc.target/bpf/feature-macro-2.c: Likewise.
Diffstat (limited to 'gcc/config/bpf')
-rw-r--r--gcc/config/bpf/bpf-c.cc88
-rw-r--r--gcc/config/bpf/bpf.cc17
-rw-r--r--gcc/config/bpf/t-bpf4
3 files changed, 92 insertions, 17 deletions
diff --git a/gcc/config/bpf/bpf-c.cc b/gcc/config/bpf/bpf-c.cc
new file mode 100644
index 0000000..f12f062
--- /dev/null
+++ b/gcc/config/bpf/bpf-c.cc
@@ -0,0 +1,88 @@
+/* BPF-specific code for C family languages.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Oracle Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#define IN_TARGET_CODE 1
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "c-family/c-common.h"
+#include "cpplib.h"
+
+/* Define target-specific CPP macros. This function in used in the
+ definition of TARGET_CPU_CPP_BUILTINS in bpf.h */
+
+#define builtin_define(TXT) cpp_define (pfile, TXT)
+
+void
+bpf_target_macros (cpp_reader *pfile)
+{
+ builtin_define ("__BPF__");
+ builtin_define ("__bpf__");
+
+ if (TARGET_BIG_ENDIAN)
+ builtin_define ("__BPF_BIG_ENDIAN__");
+ else
+ builtin_define ("__BPF_LITTLE_ENDIAN__");
+
+ switch (bpf_isa)
+ {
+ case ISA_V1:
+ builtin_define_with_int_value ("__BPF_CPU_VERSION__", 1);
+ break;
+ case ISA_V2:
+ builtin_define_with_int_value ("__BPF_CPU_VERSION__", 2);
+ break;
+ case ISA_V3:
+ builtin_define_with_int_value ("__BPF_CPU_VERSION__", 3);
+ break;
+ case ISA_V4:
+ builtin_define_with_int_value ("__BPF_CPU_VERSION__", 4);
+ break;
+ default:
+ gcc_unreachable ();
+ break;
+ }
+
+ /* Different BPF CPU versions support different features. Some of
+ them can be enabled/disabled explicitly. */
+ if (bpf_has_alu32)
+ builtin_define ("__BPF_FEATURE_ALU32");
+ if (bpf_has_jmp32)
+ builtin_define ("__BPF_FEATURE_JMP32");
+ if (bpf_has_jmpext)
+ builtin_define ("__BPF_FEATURE_JMP_EXT");
+ if (bpf_has_bswap)
+ builtin_define ("__BPF_FEATURE_BSWAP");
+ if (bpf_has_sdiv)
+ builtin_define ("__BPF_FEATURE_SDIV_SMOD");
+ if (bpf_has_smov)
+ builtin_define ("__BPF_FEATURE_MOVSX");
+
+ /* Other CPU features can only be enabled/disabled generically by
+ selecting the corresponding CPU version. */
+ if (bpf_isa >= ISA_V4)
+ {
+ builtin_define ("__BPF_FEATURE_LDSX");
+ builtin_define ("__BPF_FEATURE_GOTOL");
+ builtin_define ("__BPF_FEATURE_ST");
+ }
+}
diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc
index d9141dd..98fb755 100644
--- a/gcc/config/bpf/bpf.cc
+++ b/gcc/config/bpf/bpf.cc
@@ -284,23 +284,6 @@ bpf_file_end (void)
#undef TARGET_ASM_FILE_END
#define TARGET_ASM_FILE_END bpf_file_end
-/* Define target-specific CPP macros. This function in used in the
- definition of TARGET_CPU_CPP_BUILTINS in bpf.h */
-
-#define builtin_define(TXT) cpp_define (pfile, TXT)
-
-void
-bpf_target_macros (cpp_reader *pfile)
-{
- builtin_define ("__BPF__");
- builtin_define ("__bpf__");
-
- if (TARGET_BIG_ENDIAN)
- builtin_define ("__BPF_BIG_ENDIAN__");
- else
- builtin_define ("__BPF_LITTLE_ENDIAN__");
-}
-
/* Return an RTX representing the place where a function returns or
receives a value of data type RET_TYPE, a tree node representing a
data type. */
diff --git a/gcc/config/bpf/t-bpf b/gcc/config/bpf/t-bpf
index dc50332..2facccb 100644
--- a/gcc/config/bpf/t-bpf
+++ b/gcc/config/bpf/t-bpf
@@ -1,6 +1,10 @@
TM_H += $(srcdir)/config/bpf/btfext-out.h $(srcdir)/config/bpf/core-builtins.h
+bpf-c.o: $(srcdir)/config/bpf/bpf-c.cc
+ $(COMPILE) $<
+ $(POSTCOMPILE)
+
btfext-out.o: $(srcdir)/config/bpf/btfext-out.cc
$(COMPILE) $<
$(POSTCOMPILE)