Thanks! Pushed to master.

Jose E. Marchesi writes:

> 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