Hi Cuper.

OK.  Hopefully all the roots are marked now to avoid these nodes being
collected.

Thanks.

> Hi everyone,
>
> This patch fixes BPF CO-RE builtins support that missed information for
> garbage collector (GC).
>
> The BPF CO-RE implementation defines several data structures that keep
> builtin information throught all of the compilation flow aside from
> code.  This intentionally avoids having the builtin calls arguments
> expressions/enum/types tree nodes within the compiling code in order to
> avoid the compiler to optimize those away, based on information in
> current compilation unit.
> CO-RE builtins are target kernel specific and very little can be infered
> from type inforamtion within the compilation unit.
>
> Fault was triggered when attempting to compile some BPF kernel big
> examples that revealed the lack of GC information.
>
> Patch also removes some spurious includes of header files.
>
> Best regards,
> Cupertino
>
>
>
> commit c71b5c604189d04664c5b5ee155326fa4b79808b
> Author: Cupertino Miranda <cupertino.mira...@oracle.com>
> Date:   Tue Aug 8 11:12:00 2023 +0100
>
>     bpf: Fixed GC mistakes in BPF builtins code.
>     
>     This patches fixes problems with GC within the CO-RE builtins
>     implementation.
>     List of included headers was also reviseD.
>     
>     gcc/ChangeLog:
>     
>             * config/bpf/core-builtins.cc: Cleaned include headers.
>             (struct cr_builtins): Added GTY.
>             (cr_builtins_ref): Created.
>             (builtins_data) Changed to GC root.
>             (allocate_builtin_data): Changed.
>             Included gt-core-builtins.h.
>             * config/bpf/coreout.cc: (bpf_core_extra) Added GTY.
>             (bpf_core_extra_ref): Created.
>             (bpf_comment_info): Changed to GC root.
>             (bpf_core_reloc_add, output_btfext_header, btf_ext_init): Changed.
>
> diff --git a/gcc/config/bpf/core-builtins.cc b/gcc/config/bpf/core-builtins.cc
> index 575e63d8ea77..c3222b4c7804 100644
> --- a/gcc/config/bpf/core-builtins.cc
> +++ b/gcc/config/bpf/core-builtins.cc
> @@ -22,52 +22,23 @@ along with GCC; see the file COPYING3.  If not see
>  #include "config.h"
>  #include "system.h"
>  #include "coretypes.h"
> -#include "tm.h"
> +#include "target.h"
>  #include "rtl.h"
> -#include "regs.h"
> -#include "insn-config.h"
> -#include "insn-attr.h"
> -#include "recog.h"
>  #include "output.h"
> -#include "alias.h"
>  #include "tree.h"
>  #include "stringpool.h"
>  #include "attribs.h"
> -#include "varasm.h"
> -#include "stor-layout.h"
> -#include "calls.h"
>  #include "function.h"
> -#include "explow.h"
>  #include "memmodel.h"
>  #include "emit-rtl.h"
> -#include "reload.h"
> -#include "tm_p.h"
> -#include "target.h"
> -#include "basic-block.h"
>  #include "expr.h"
> -#include "optabs.h"
> -#include "bitmap.h"
> -#include "df.h"
> -#include "c-family/c-common.h"
>  #include "diagnostic.h"
> -#include "builtins.h"
> -#include "predict.h"
>  #include "langhooks.h"
> -#include "flags.h"
> -
> -#include "cfg.h"
> +#include "basic-block.h"
>  #include "gimple.h"
>  #include "gimple-iterator.h"
>  #include "gimple-walk.h"
>  #include "tree-pass.h"
> -#include "tree-iterator.h"
> -
> -#include "context.h"
> -#include "pass_manager.h"
> -
> -#include "gimplify.h"
> -#include "gimplify-me.h"
> -
>  #include "plugin.h"
>  
>  #include "ctfc.h"
> @@ -159,37 +130,41 @@ along with GCC; see the file COPYING3.  If not see
>      as a builtin.  */
>  
>  
> -struct cr_builtins
> +struct GTY(()) cr_builtins
>  {
>    tree type;
>    tree expr;
>    tree default_value;
>    rtx rtx_default_value;
> -  enum btf_core_reloc_kind kind; /* Recovered from proper argument.  */
> +  enum btf_core_reloc_kind kind;
>    enum bpf_builtins orig_builtin_code;
>    tree orig_arg_expr;
>  };
> +typedef struct cr_builtins *cr_builtins_ref;
>  
>  #define CORE_BUILTINS_DATA_EMPTY \
>    { NULL_TREE, NULL_TREE, NULL_TREE, NULL_RTX, BPF_RELO_INVALID, \
>      BPF_BUILTIN_UNUSED, NULL }
>  
>  /* Vector definition and its access function.  */
> -vec<struct cr_builtins> builtins_data;
> +static GTY(()) vec<cr_builtins_ref, va_gc> *builtins_data = NULL;
>  
>  static inline int
>  allocate_builtin_data ()
>  {
> -  struct cr_builtins data = CORE_BUILTINS_DATA_EMPTY;
> -  int ret = builtins_data.length ();
> -  builtins_data.safe_push (data);
> +  if (builtins_data == NULL)
> +    vec_alloc (builtins_data, 1);
> +
> +  cr_builtins_ref data = ggc_cleared_alloc<struct cr_builtins> ();
> +  int ret = builtins_data->length ();
> +  vec_safe_push (builtins_data, data);
>    return ret;
>  }
>  
>  static inline struct cr_builtins *
>  get_builtin_data (int index)
>  {
> -  return &builtins_data[index];
> +  return (*builtins_data)[index];
>  }
>  
>  typedef bool
> @@ -200,11 +175,12 @@ search_builtin_data (builtin_local_data_compare_fn 
> callback,
>                    struct cr_builtins *elem)
>  {
>    unsigned int i;
> -  for (i = 0; i < builtins_data.length (); i++)
> -    if ((callback != NULL && (callback) (elem, &builtins_data[i]))
> -       || (callback == NULL
> -        && (builtins_data[i].orig_arg_expr == elem->orig_arg_expr)))
> -      return (int) i;
> +  if(builtins_data != NULL)
> +    for (i = 0; i < builtins_data->length (); i++)
> +      if ((callback != NULL && (callback) (elem, (*builtins_data)[i]))
> +       || (callback == NULL
> +           && ((*builtins_data)[i]->orig_arg_expr == elem->orig_arg_expr)))
> +     return (int) i;
>  
>    return -1;
>  }
> @@ -1392,3 +1368,5 @@ bpf_replace_core_move_operands (rtx *operands)
>         }
>        }
>  }
> +
> +#include "gt-core-builtins.h"
> diff --git a/gcc/config/bpf/coreout.cc b/gcc/config/bpf/coreout.cc
> index b84585fb104e..0c5d166298fb 100644
> --- a/gcc/config/bpf/coreout.cc
> +++ b/gcc/config/bpf/coreout.cc
> @@ -147,11 +147,12 @@ static char 
> btf_ext_info_section_label[MAX_BTF_EXT_LABEL_BYTES];
>  
>  static GTY (()) vec<bpf_core_section_ref, va_gc> *bpf_core_sections;
>  
> -struct bpf_core_extra {
> +struct GTY(()) bpf_core_extra {
>    const char *accessor_str;
>    tree type;
>  };
> -static hash_map<bpf_core_reloc_ref, struct bpf_core_extra *> 
> bpf_comment_info;
> +typedef struct bpf_core_extra *bpf_core_extra_ref;
> +static GTY(()) hash_map<bpf_core_reloc_ref, bpf_core_extra_ref> 
> *bpf_comment_info;
>  
>  /* Create a new BPF CO-RE relocation record, and add it to the appropriate
>     CO-RE section.  */
> @@ -162,7 +163,7 @@ bpf_core_reloc_add (const tree type, const char * 
> section_name,
>                   enum btf_core_reloc_kind kind)
>  {
>    bpf_core_reloc_ref bpfcr = ggc_cleared_alloc<bpf_core_reloc_t> ();
> -  struct bpf_core_extra *info = ggc_cleared_alloc<struct bpf_core_extra> ();
> +  bpf_core_extra_ref info = ggc_cleared_alloc<struct bpf_core_extra> ();
>    ctf_container_ref ctfc = ctf_get_tu_ctfc ();
>  
>    /* Buffer the access string in the auxiliary strtab.  */
> @@ -173,7 +174,7 @@ bpf_core_reloc_add (const tree type, const char * 
> section_name,
>  
>    info->accessor_str = accessor;
>    info->type = type;
> -  bpf_comment_info.put (bpfcr, info);
> +  bpf_comment_info->put (bpfcr, info);
>  
>    /* Add the CO-RE reloc to the appropriate section.  */
>    bpf_core_section_ref sec;
> @@ -288,7 +289,7 @@ output_btfext_header (void)
>  static void
>  output_asm_btfext_core_reloc (bpf_core_reloc_ref bpfcr)
>  {
> -  struct bpf_core_extra **info = bpf_comment_info.get (bpfcr);
> +  bpf_core_extra_ref *info = bpf_comment_info->get (bpfcr);
>    gcc_assert (info != NULL);
>  
>    bpfcr->bpfcr_astr_off += ctfc_get_strtab_len (ctf_get_tu_ctfc (),
> @@ -365,6 +366,7 @@ btf_ext_init (void)
>                              btf_ext_label_num++);
>  
>    vec_alloc (bpf_core_sections, 1);
> +  bpf_comment_info = hash_map<bpf_core_reloc_ref, 
> bpf_core_extra_ref>::create_ggc ();
>  }
>  
>  /* Output the entire .BTF.ext section.  */

Reply via email to