diff --git a/gcc/config.gcc b/gcc/config.gcc index ce683adcc8a42c315a2e857d1fc9047bf4705651..c2764095f0ce2c0ecf8462ec6b165d623d30759d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -394,6 +394,8 @@ bfin*-*) ;; bpf-*-*) cpu_type=bpf + c_target_objs="bpf-c.o" + cxx_target_objs="bpf-c.o" ;; frv*) cpu_type=frv extra_options="${extra_options} g.opt" diff --git a/gcc/config/bpf/bpf-c.cc b/gcc/config/bpf/bpf-c.cc new file mode 100644 index 0000000000000000000000000000000000000000..f12f0627103606b130c73ba72bc0c546059205bb --- /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 d9141dd625a97eea9e379ce50496abb35702a094..98fb755bb8b705aea48b532acf0ec1f9582ee390 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 dc50332350c419fc658f3eb3ee66aaf0e636bc75..2facccbd57a75b6d5a65fe2acbe669d58223548d 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) diff --git a/gcc/testsuite/gcc.target/bpf/feature-macro-1.c b/gcc/testsuite/gcc.target/bpf/feature-macro-1.c new file mode 100644 index 0000000000000000000000000000000000000000..5fa7d3f46a2a62c0ce70636e569d487dac4ad310 --- /dev/null +++ b/gcc/testsuite/gcc.target/bpf/feature-macro-1.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=v1 -malu32 -mjmp32 -mjmpext -mbswap -msdiv -msmov" } */ + +#ifndef __BPF_FEATURE_ALU32 +#error __BPF_FEATURE_ALU32 undefined +#endif + +#ifndef __BPF_FEATURE_JMP32 +#error __BPF_FEATURE_JMP32 undefined +#endif + +#ifndef __BPF_FEATURE_JMP_EXT +#error __BPF_FEATURE_JMP_EXT undefined +#endif + +#ifndef __BPF_FEATURE_SDIV_SMOD +#error __BPF_FEATURE_SDIV_SMOD undefined +#endif + +#ifndef __BPF_FEATURE_MOVSX +#error __BPF_FEATURE_MOVSX undefined +#endif + +#ifdef __BPF_FEATURE_LDSX +#error __BPF_FEATURE_LDSX defined with -mcpu=v1 +#endif + +#ifdef __BPF_FEATURE_GOTOL +#error __BPF_FEATURE_GOTOL defined with -mcpu=v4 +#endif + +#ifdef __BPF_FEATURE_ST +#error __BPF_FEATURE_ST defined with -mcpu=v4 +#endif diff --git a/gcc/testsuite/gcc.target/bpf/feature-macro-2.c b/gcc/testsuite/gcc.target/bpf/feature-macro-2.c new file mode 100644 index 0000000000000000000000000000000000000000..0ae0fc72f710e770d8359b3f7e303f3f6b1953b0 --- /dev/null +++ b/gcc/testsuite/gcc.target/bpf/feature-macro-2.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=v4" } */ + +#ifndef __BPF_FEATURE_LDSX +#error __BPF_FEATURE_LDSX undefined with -mcpu=v4 +#endif + +#ifndef __BPF_FEATURE_GOTOL +#error __BPF_FEATURE_GOTOL undefined with -mcpu=v4 +#endif + +#ifndef __BPF_FEATURE_ST +#error __BPF_FEATURE_ST undefined with -mcpu=v4 +#endif