From 152d945d42136737305fd55f1239a3dd6037c8a7 Mon Sep 17 00:00:00 2001 From: "Jose E. Marchesi" Date: Wed, 24 Apr 2024 13:48:51 +0200 Subject: 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. --- gcc/config/bpf/bpf-c.cc | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ gcc/config/bpf/bpf.cc | 17 ---------- gcc/config/bpf/t-bpf | 4 +++ 3 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 gcc/config/bpf/bpf-c.cc (limited to 'gcc/config/bpf') 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 +. */ + +#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) -- cgit v1.1