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.
This commit is contained in:
Jose E. Marchesi 2024-04-24 13:48:51 +02:00
parent cc48418cfc
commit 152d945d42
6 changed files with 142 additions and 17 deletions

View file

@ -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"

88
gcc/config/bpf/bpf-c.cc Normal file
View file

@ -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");
}
}

View file

@ -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. */

View file

@ -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)

View file

@ -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

View file

@ -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