btf: improve -dA comments for testsuite

Message ID 20230525163740.6062-1-david.faust@oracle.com
State New
Headers
Series btf: improve -dA comments for testsuite |

Commit Message

David Faust May 25, 2023, 4:37 p.m. UTC
  Many BTF type kinds refer to other types via index to the final types
list. However, the order of the final types list is not guaranteed to
remain the same for the same source program between different runs of
the compiler, making it difficult to test inter-type references.

This patch updates the assembler comments output when writing a
given BTF record to include minimal information about the referenced
type, if any. This allows for the regular expressions used in the gcc
testsuite to do some basic integrity checks on inter-type references.

For example, for the type

	unsigned int *

Assembly comments like the following are written with -dA:

	.4byte	0	; TYPE 2 BTF_KIND_PTR ''
	.4byte	0x2000000	; btt_info: kind=2, kflag=0, vlen=0
	.4byte	0x1	; btt_type: (BTF_KIND_INT 'unsigned int')

Several BTF tests which can immediately be made more robust with this
change are updated. It will also be useful in new tests for the upcoming
btf_type_tag support.

Tested on BPF and x86_64, no known regressions.
OK for trunk?

Thanks.

gcc/

	* btfout.cc (btf_kind_names): New.
	(btf_kind_name): New.
	(btf_absolute_var_id): New utility function.
	(btf_relative_var_id): Likewise.
	(btf_relative_func_id): Likewise.
	(btf_absolute_datasec_id): Likewise.
	(btf_asm_type_ref): New.
	(btf_asm_type): Update asm comments and use btf_asm_type_ref ().
	(btf_asm_array): Likewise. Accept ctf_container_ref parameter.
	(btf_asm_varent): Likewise.
	(btf_asm_func_arg): Likewise.
	(btf_asm_datasec_entry): Likewise.
	(btf_asm_datasec_type): Likewise.
	(btf_asm_func_type): Likewise. Add index parameter.
	(btf_asm_sou_member): Likewise.
	(output_btf_vars): Update btf_asm_* call accordingly.
	(output_asm_btf_sou_fields): Likewise.
	(output_asm_btf_func_args_list): Likewise.
	(output_asm_btf_vlen_bytes): Likewise.
	(output_btf_func_types): Add ctf_container_ref parameter.
	Pass it to btf_asm_func_type.
	(output_btf_datasec_types): Update btf_asm_datsec_type call similarly.
	(btf_output): Update output_btf_func_types call similarly.

gcc/testsuite/

	* gcc.dg/debug/btf/btf-array-1.c: Use new BTF asm comments
	in scan-assembler expressions where useful.
	* gcc.dg/debug/btf/btf-anonymous-struct-1.c: Likewise.
	* gcc.dg/debug/btf/btf-anonymous-union-1.c: Likewise.
	* gcc.dg/debug/btf/btf-bitfields-2.c: Likewise.
	* gcc.dg/debug/btf/btf-bitfields-3.c: Likewise.
	* gcc.dg/debug/btf/btf-function-6.c: Likewise.
	* gcc.dg/debug/btf/btf-pointers-1.c: Likewise.
	* gcc.dg/debug/btf/btf-struct-1.c: Likewise.
	* gcc.dg/debug/btf/btf-struct-2.c: Likewise.
	* gcc.dg/debug/btf/btf-typedef-1.c: Likewise.
	* gcc.dg/debug/btf/btf-union-1.c: Likewise.
	* gcc.dg/debug/btf/btf-variables-1.c: Likewise.
	* gcc.dg/debug/btf/btf-variables-2.c: Likewise. Update outdated comment.
	* gcc.dg/debug/btf/btf-function-3.c: Update outdated comment.
---
 gcc/btfout.cc                                 | 220 ++++++++++++++----
 .../gcc.dg/debug/btf/btf-anonymous-struct-1.c |   3 +-
 .../gcc.dg/debug/btf/btf-anonymous-union-1.c  |   4 +-
 gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c  |   3 +
 .../gcc.dg/debug/btf/btf-bitfields-2.c        |   2 +-
 .../gcc.dg/debug/btf/btf-bitfields-3.c        |   2 +-
 .../gcc.dg/debug/btf/btf-function-3.c         |   2 +-
 .../gcc.dg/debug/btf/btf-function-6.c         |   4 +-
 .../gcc.dg/debug/btf/btf-pointers-1.c         |   3 +
 gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c |   4 +-
 gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c |   2 +-
 .../gcc.dg/debug/btf/btf-typedef-1.c          |  14 +-
 gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c  |   2 +-
 .../gcc.dg/debug/btf/btf-variables-1.c        |   6 +
 .../gcc.dg/debug/btf/btf-variables-2.c        |   7 +-
 15 files changed, 215 insertions(+), 63 deletions(-)
  

Comments

Indu Bhagat May 30, 2023, 7:30 a.m. UTC | #1
On 5/25/23 9:37 AM, David Faust via Gcc-patches wrote:
> Many BTF type kinds refer to other types via index to the final types
> list. However, the order of the final types list is not guaranteed to
> remain the same for the same source program between different runs of
> the compiler, making it difficult to test inter-type references.
> 
> This patch updates the assembler comments output when writing a
> given BTF record to include minimal information about the referenced
> type, if any. This allows for the regular expressions used in the gcc
> testsuite to do some basic integrity checks on inter-type references.
> 
> For example, for the type
> 
> 	unsigned int *
> 
> Assembly comments like the following are written with -dA:
> 
> 	.4byte	0	; TYPE 2 BTF_KIND_PTR ''
> 	.4byte	0x2000000	; btt_info: kind=2, kflag=0, vlen=0
> 	.4byte	0x1	; btt_type: (BTF_KIND_INT 'unsigned int')
> 
> Several BTF tests which can immediately be made more robust with this
> change are updated. It will also be useful in new tests for the upcoming
> btf_type_tag support.
> 

Thanks for working on this, David.  It will be nice to use these 
enhanced assembler comments in the output for some of CTF testing as 
well sometime.  But we can get to that later after this comit.

Some comments inlined below.

> Tested on BPF and x86_64, no known regressions.
> OK for trunk?
> 
> Thanks.
> 
> gcc/
> 
> 	* btfout.cc (btf_kind_names): New.
> 	(btf_kind_name): New.
> 	(btf_absolute_var_id): New utility function.
> 	(btf_relative_var_id): Likewise.
> 	(btf_relative_func_id): Likewise.
> 	(btf_absolute_datasec_id): Likewise.
> 	(btf_asm_type_ref): New.
> 	(btf_asm_type): Update asm comments and use btf_asm_type_ref ().
> 	(btf_asm_array): Likewise. Accept ctf_container_ref parameter.
> 	(btf_asm_varent): Likewise.
> 	(btf_asm_func_arg): Likewise.
> 	(btf_asm_datasec_entry): Likewise.
> 	(btf_asm_datasec_type): Likewise.
> 	(btf_asm_func_type): Likewise. Add index parameter.
> 	(btf_asm_sou_member): Likewise.
> 	(output_btf_vars): Update btf_asm_* call accordingly.
> 	(output_asm_btf_sou_fields): Likewise.
> 	(output_asm_btf_func_args_list): Likewise.
> 	(output_asm_btf_vlen_bytes): Likewise.
> 	(output_btf_func_types): Add ctf_container_ref parameter.
> 	Pass it to btf_asm_func_type.
> 	(output_btf_datasec_types): Update btf_asm_datsec_type call similarly.
> 	(btf_output): Update output_btf_func_types call similarly.
> 
> gcc/testsuite/
> 
> 	* gcc.dg/debug/btf/btf-array-1.c: Use new BTF asm comments
> 	in scan-assembler expressions where useful.
> 	* gcc.dg/debug/btf/btf-anonymous-struct-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-anonymous-union-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-bitfields-2.c: Likewise.
> 	* gcc.dg/debug/btf/btf-bitfields-3.c: Likewise.
> 	* gcc.dg/debug/btf/btf-function-6.c: Likewise.
> 	* gcc.dg/debug/btf/btf-pointers-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-struct-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-struct-2.c: Likewise.
> 	* gcc.dg/debug/btf/btf-typedef-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-union-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-variables-1.c: Likewise.
> 	* gcc.dg/debug/btf/btf-variables-2.c: Likewise. Update outdated comment.
> 	* gcc.dg/debug/btf/btf-function-3.c: Update outdated comment.
> ---
>   gcc/btfout.cc                                 | 220 ++++++++++++++----
>   .../gcc.dg/debug/btf/btf-anonymous-struct-1.c |   3 +-
>   .../gcc.dg/debug/btf/btf-anonymous-union-1.c  |   4 +-
>   gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c  |   3 +
>   .../gcc.dg/debug/btf/btf-bitfields-2.c        |   2 +-
>   .../gcc.dg/debug/btf/btf-bitfields-3.c        |   2 +-
>   .../gcc.dg/debug/btf/btf-function-3.c         |   2 +-
>   .../gcc.dg/debug/btf/btf-function-6.c         |   4 +-
>   .../gcc.dg/debug/btf/btf-pointers-1.c         |   3 +
>   gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c |   4 +-
>   gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c |   2 +-
>   .../gcc.dg/debug/btf/btf-typedef-1.c          |  14 +-
>   gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c  |   2 +-
>   .../gcc.dg/debug/btf/btf-variables-1.c        |   6 +
>   .../gcc.dg/debug/btf/btf-variables-2.c        |   7 +-
>   15 files changed, 215 insertions(+), 63 deletions(-)
> 
> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
> index 497c1ca06e6..8960acfbbaa 100644
> --- a/gcc/btfout.cc
> +++ b/gcc/btfout.cc
> @@ -114,6 +114,23 @@ static unsigned int num_types_added = 0;
>      CTF types.  */
>   static unsigned int num_types_created = 0;
>   
> +/* Name strings for BTF kinds.
> +   Note: the indices here must match the type defines in btf.h.  */
> +static const char *const btf_kind_names[] =
> +  {
> +    "UNKN", "INT", "PTR", "ARRAY", "STRUCT", "UNION", "ENUM", "FWD",
> +    "TYPEDEF", "VOLATILE", "CONST", "RESTRICT", "FUNC", "FUNC_PROTO",
> +    "VAR", "DATASEC", "FLOAT", "DECL_TAG", "TYPE_TAG", "ENUM64"
> +  };
> +
> +/* Return a name string for the given BTF_KIND.  */
> +
> +static const char *
> +btf_kind_name (uint32_t btf_kind)
> +{
> +  return btf_kind_names[btf_kind];
> +}
> +
>   /* Map a CTF type kind to the corresponding BTF type kind.  */
>   
>   static uint32_t
> @@ -141,6 +158,57 @@ get_btf_kind (uint32_t ctf_kind)
>     return BTF_KIND_UNKN;
>   }
>   
> +/* Helper routines to map between 'relative' and 'absolute' IDs.
> +
> +   In BTF all records (including variables) are output in one long list, and all
> +   inter-type references are via index into that list.  But internally since we
> +   a) translate from CTF, which separates variable records from regular types
> +   and b) create some additional tpyes after the fact, things like VARs and FUNC

typo: tpyes -> types

Also VAR instead of VARs ? ..."VAR and FUNC records"

> +   records are stored in separate vectors with their own indices.  These
> +   functions map between the 'relative' IDs (i.e.  indices in their respective
> +   containers) and 'absolute' IDs (i.e.  indices in the final contiguous
> +   output list), which goes in order:
> +     all normal type records translated from CTF
> +     all BTF_KIND_VAR records
> +     all BTF_KIND_FUNC records (synthesized split function records)
> +     all BTF_KIND_DATASEC records (synthesized)
> +
> +   The extra '+ 1's below are to account for the implicit "void" record, which
> +   has index 0 but isn't actually contained in the type list.  */
> +
> +/* Return the final BTF ID of the variable at relative index REL.  */
> +
> +static ctf_id_t
> +btf_absolute_var_id (ctf_id_t rel)
> +{
> +  return rel + (num_types_added + 1);
> +}
> +
> +/* Return the relative index of the variable with final BTF ID ABS.  */
> +
> +static ctf_id_t
> +btf_relative_var_id (ctf_id_t abs)
> +{
> +  return abs - (num_types_added + 1);
> +}
> +
> +/* Return the relative index of the func record with final BTF ID ABS.  */
> +
> +static ctf_id_t
> +btf_relative_func_id (ctf_id_t abs)
> +{
> +  return abs - ((num_types_added + 1) + num_vars_added);
> +}
> +
> +/* Return the final BTF ID of the datasec record at relative index REL.  */
> +
> +static ctf_id_t
> +btf_absolute_datasec_id (ctf_id_t rel)
> +{
> +  return rel + (num_types_added + 1) + num_vars_added + funcs->length ();
> +}
> +
> +
>   /* Allocate the btf_id_map, and initialize elements to BTF_INVALID_TYPEID.  */
>   
>   static void
> @@ -407,8 +475,7 @@ btf_collect_datasec (ctf_container_ref ctfc)
>         info.type = 0;
>         unsigned int *var_id = btf_var_ids->get (dvd);
>         if (var_id)
> -	/* +1 for the sentinel type not in the types map.  */
> -	info.type = *var_id + num_types_added + 1;
> +	info.type = btf_absolute_var_id (*var_id);
>         else
>   	continue;
>   
> @@ -620,6 +687,48 @@ btf_dmd_representable_bitfield_p (ctf_container_ref ctfc, ctf_dmdef_t *dmd)
>   
>   /* BTF asm helper routines.  */
>   
> +/* Asm'out a reference to another BTF type.  */
> +
> +static void
> +btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
> +{
> +  if (ref_id == BTF_VOID_TYPEID || ref_id == BTF_INVALID_TYPEID)
> +    {
> +      /* There is no explicit void type.
> +	 Also handle any invalid refs that made it this far, just in case.  */
> +      dw2_asm_output_data (4, ref_id, "%s: void", prefix);
> +    }
> +  else if (ref_id >= num_types_added + 1
> +	   && ref_id < num_types_added + num_vars_added + 1)
> +    {
> +      /* Ref to a variable.  Should only appear in DATASEC entries.  */
> +      ctf_id_t var_id = btf_relative_var_id (ref_id);
> +      ctf_dvdef_ref dvd = ctfc->ctfc_vars_list[var_id];
> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_VAR '%s')",
> +			   prefix, dvd->dvd_name);
> +
> +    }
> +  else if (ref_id >= num_types_added + num_vars_added + 1)
> +    {
> +      /* Ref to a FUNC record.  */
> +      size_t func_id = btf_relative_func_id (ref_id);
> +      ctf_dtdef_ref ref_type = (*funcs)[func_id];
> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_FUNC '%s')",
> +			   prefix, ref_type->dtd_name);
> +    }
> +  else
> +    {
> +      /* Ref to a standard type in the types list.  */
> +      ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[ref_id];
> +      uint32_t ref_kind
> +	= get_btf_kind (CTF_V2_INFO_KIND (ref_type->dtd_data.ctti_info));
> +
> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_%s '%s')",
> +			   prefix, btf_kind_name (ref_kind),
> +			   ref_type->dtd_name);
> +    }
> +}
> +
>   /* Asm'out a BTF type. This routine is responsible for the bulk of the task
>      of converting CTF types to their BTF representation.  */
>   
> @@ -689,7 +798,10 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>   	btf_kind = BTF_KIND_ENUM64;
>      }
>   
> -  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
> +  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
> +		       "TYPE %lu BTF_KIND_%s '%s'", > +		       get_btf_id (dtd->dtd_type), btf_kind_name (btf_kind),
> +		       dtd->dtd_name);
>     dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen),
>   		       "btt_info: kind=%u, kflag=%u, vlen=%u",
>   		       btf_kind, btf_kflag, btf_vlen);
> @@ -705,33 +817,41 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>         dw2_asm_output_data (4, dtd->dtd_data.ctti_size, "btt_size: %uB",
>   			   dtd->dtd_data.ctti_size);
>         return;
> +    case BTF_KIND_ARRAY:
> +    case BTF_KIND_FWD:
> +      /* These types do not encode any information in the size/type field
> +	 and should write 0.  */
> +      dw2_asm_output_data (4, 0, "(unused)");
> +      return;

Ideally I would split this out into a separate commit as it is unrelated 
to improving -dA comments for testsuite.

>       default:
>         break;
>       }
>   
> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
> +  ctf_id_t ref_id = get_btf_id (dtd->dtd_data.ctti_type);
> +  btf_asm_type_ref ("btt_type", ctfc, ref_id);
>   }
>   
>   /* Asm'out the variable information following a BTF_KIND_ARRAY.  */
>   
>   static void
> -btf_asm_array (ctf_dtdef_ref dtd)
> +btf_asm_array (ctf_container_ref ctfc, ctf_arinfo_t arr)
>   {
> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_contents),
> -		       "bta_contents");
> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_index),
> -		       "bta_index");
> -  dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_nelems, "bta_nelems");
> +  btf_asm_type_ref ("bta_elem_type", ctfc, get_btf_id (arr.ctr_contents));
> +  btf_asm_type_ref ("bta_index_type", ctfc, get_btf_id (arr.ctr_index));
> +  dw2_asm_output_data (4, arr.ctr_nelems, "bta_nelems");
>   }
>   
>   /* Asm'out a BTF_KIND_VAR.  */
>   
>   static void
> -btf_asm_varent (ctf_dvdef_ref var)
> +btf_asm_varent (ctf_container_ref ctfc, ctf_dvdef_ref var)
>   {
> -  dw2_asm_output_data (4, var->dvd_name_offset, "btv_name");
> +  ctf_id_t ref_id = get_btf_id (var->dvd_type);
> +  dw2_asm_output_data (4, var->dvd_name_offset, "TYPE %u BTF_KIND_VAR '%s'",
> +		       (*(btf_var_ids->get (var)) + num_types_added + 1),
> +		       var->dvd_name);
>     dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_VAR, 0, 0), "btv_info");
> -  dw2_asm_output_data (4, get_btf_id (var->dvd_type), "btv_type");
> +  btf_asm_type_ref ("btv_type", ctfc, ref_id);
>     dw2_asm_output_data (4, var->dvd_visibility, "btv_linkage");
>   }
>   
> @@ -739,7 +859,7 @@ btf_asm_varent (ctf_dvdef_ref var)
>      BTF_KIND_UNION.  */
>   
>   static void
> -btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
> +btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd, unsigned int idx)
>   {
>     ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[dmd->dmd_type];
>   
> @@ -762,15 +882,19 @@ btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
>         sou_offset &= 0x00ffffff;
>         sou_offset |= ((bits & 0xff) << 24);
>   
> +      dw2_asm_output_data (4, dmd->dmd_name_offset,
> +			   "MEMBER '%s' idx=%u",
> +			   dmd->dmd_name, idx);

I understand that the current commit can be improved further. There are 
two places, however, which I thought could be included now for a more 
complete implemenation:

1. Enum constant name dmd->dmd_name_offset ("bte_name") in 
btf_asm_enum_const ().
2. BTF_TYPE_INFO in btf_asm_datasec_type(). Perhaps we could dump the 
number of datasec entries if you think that is useful for testing.

WDYT ?

>         /* Refer to the base type of the slice.  */
> -      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
> -      dw2_asm_output_data (4, get_btf_id (base_type), "btm_type");
> +      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (base_type));
>         dw2_asm_output_data (4, sou_offset, "btm_offset");
>       }
>     else
>       {
> -      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
> -      dw2_asm_output_data (4, get_btf_id (dmd->dmd_type), "btm_type");
> +      dw2_asm_output_data (4, dmd->dmd_name_offset,
> +			   "MEMBER '%s' idx=%u",
> +			   dmd->dmd_name, idx);
> +      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (dmd->dmd_type));
>         dw2_asm_output_data (4, dmd->dmd_offset, "btm_offset");
>       }
>   }
> @@ -793,7 +917,8 @@ btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd)
>   /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO.  */
>   
>   static void
> -btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
> +btf_asm_func_arg (ctf_container_ref ctfc, ctf_func_arg_t * farg,
> +		  size_t stroffset)
>   {
>     /* If the function arg does not have a name, refer to the null string at
>        the start of the string table. This ensures correct encoding for varargs
> @@ -803,31 +928,33 @@ btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
>     else
>       dw2_asm_output_data (4, 0, "farg_name");
>   
> -  dw2_asm_output_data (4, (btf_removed_type_p (farg->farg_type)
> -			   ? BTF_VOID_TYPEID
> -			   : get_btf_id (farg->farg_type)),
> -		       "farg_type");
> +  btf_asm_type_ref ("farg_type", ctfc, (btf_removed_type_p (farg->farg_type)
> +					? BTF_VOID_TYPEID
> +					: get_btf_id (farg->farg_type)));
>   }
>   
>   /* Asm'out a BTF_KIND_FUNC type.  */
>   

Lets keep the function level comments updated.  Apart from 
btf_asm_func_type, this comment applies to other functions touched in 
this commit, like btf_asm_datasec_type.

>   static void
> -btf_asm_func_type (ctf_dtdef_ref dtd)
> +btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, size_t i)
>   {
> -  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
> -  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0,
> -                                         dtd->linkage),
> -                       "btt_info: kind=%u, kflag=%u, linkage=%u",
> -                       BTF_KIND_FUNC, 0, dtd->linkage);
> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
> +  ctf_id_t ref_id = dtd->dtd_data.ctti_type;
> +  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
> +		       "TYPE %lu BTF_KIND_FUNC '%s'",
> +		       num_types_added + num_vars_added + 1 + i,
> +		       dtd->dtd_name);
> +  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
> +		       "btt_info: kind=%u, kflag=%u, linkage=%u",
> +		       BTF_KIND_FUNC, 0, dtd->linkage);
> +  btf_asm_type_ref ("btt_type", ctfc, get_btf_id (ref_id));
>   }
>   
>   /* Asm'out a variable entry following a BTF_KIND_DATASEC.  */
>   
>   static void
> -btf_asm_datasec_entry (struct btf_var_secinfo info)
> +btf_asm_datasec_entry (ctf_container_ref ctfc, struct btf_var_secinfo info)
>   {
> -  dw2_asm_output_data (4, info.type, "bts_type");
> +  btf_asm_type_ref ("bts_type", ctfc, info.type);
>     dw2_asm_output_data (4, info.offset, "bts_offset");
>     dw2_asm_output_data (4, info.size, "bts_size");
>   }
> @@ -835,9 +962,12 @@ btf_asm_datasec_entry (struct btf_var_secinfo info)
>   /* Asm'out a whole BTF_KIND_DATASEC, including its variable entries.  */
>   
>   static void
> -btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
> +btf_asm_datasec_type (ctf_container_ref ctfc, btf_datasec_t ds, ctf_id_t id,
> +		      size_t stroffset)
>   {
> -  dw2_asm_output_data (4, ds.name_offset + stroffset, "btt_name");
> +  dw2_asm_output_data (4, ds.name_offset + stroffset,
> +		       "TYPE %lu BTF_KIND_DATASEC '%s'",
> +		       btf_absolute_datasec_id (id), ds.name);
>     dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_DATASEC, 0,
>   					 ds.entries.length ()),
>   		       "btt_info");
> @@ -845,7 +975,7 @@ btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
>        loaders such as libbpf.  */
>     dw2_asm_output_data (4, 0, "btt_size");
>     for (size_t i = 0; i < ds.entries.length (); i++)
> -    btf_asm_datasec_entry (ds.entries[i]);
> +    btf_asm_datasec_entry (ctfc, ds.entries[i]);
>   }
>   
>   /* Compute and output the header information for a .BTF section.  */
> @@ -906,7 +1036,7 @@ output_btf_vars (ctf_container_ref ctfc)
>     if (num_ctf_vars)
>       {
>         for (i = 0; i < num_ctf_vars; i++)
> -	btf_asm_varent (ctfc->ctfc_vars_list[i]);
> +	btf_asm_varent (ctfc, ctfc->ctfc_vars_list[i]);
>       }
>   }
>   
> @@ -940,9 +1070,13 @@ output_asm_btf_sou_fields (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>   {
>     ctf_dmdef_t * dmd;
>   
> +  unsigned idx = 0;
>     for (dmd = dtd->dtd_u.dtu_members;
>          dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd))
> -      btf_asm_sou_member (ctfc, dmd);
> +    {
> +      btf_asm_sou_member (ctfc, dmd, idx);
> +      idx++;
> +    }
>   }
>   
>   /* Output all enumerator constants following a BTF_KIND_ENUM{,64}.  */
> @@ -968,7 +1102,7 @@ output_asm_btf_func_args_list (ctf_container_ref ctfc,
>     ctf_func_arg_t * farg;
>     for (farg = dtd->dtd_u.dtu_argv;
>          farg != NULL; farg = (ctf_func_arg_t *) ctf_farg_list_next (farg))
> -    btf_asm_func_arg (farg, farg_name_offset);
> +    btf_asm_func_arg (ctfc, farg, farg_name_offset);
>   }
>   
>   /* Output the variable portion of a BTF type record. The information depends
> @@ -1004,7 +1138,7 @@ output_asm_btf_vlen_bytes (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>         break;
>   
>       case BTF_KIND_ARRAY:
> -      btf_asm_array (dtd);
> +      btf_asm_array (ctfc, dtd->dtd_u.dtu_arr);
>         break;
>   
>       case BTF_KIND_STRUCT:
> @@ -1068,10 +1202,10 @@ output_btf_types (ctf_container_ref ctfc)
>   /* Output all BTF_KIND_FUNC type records.  */
>   
>   static void
> -output_btf_func_types (void)
> +output_btf_func_types (ctf_container_ref ctfc)
>   {
>     for (size_t i = 0; i < vec_safe_length (funcs); i++)
> -    btf_asm_func_type ((*funcs)[i]);
> +    btf_asm_func_type (ctfc, (*funcs)[i], i);
>   }
>   
>   /* Output all BTF_KIND_DATASEC records.  */
> @@ -1082,7 +1216,7 @@ output_btf_datasec_types (ctf_container_ref ctfc)
>     size_t name_offset = ctfc_get_strtab_len (ctfc, CTF_STRTAB);
>   
>     for (size_t i = 0; i < datasecs.length(); i++)
> -    btf_asm_datasec_type (datasecs[i], name_offset);
> +    btf_asm_datasec_type (ctfc, datasecs[i], i, name_offset);
>   }
>   
>   /* Postprocess the CTF debug data post initialization.
> @@ -1209,7 +1343,7 @@ btf_output (const char * filename)
>     output_btf_header (tu_ctfc);
>     output_btf_types (tu_ctfc);
>     output_btf_vars (tu_ctfc);
> -  output_btf_func_types ();
> +  output_btf_func_types (tu_ctfc);
>     output_btf_datasec_types (tu_ctfc);
>     output_btf_strs (tu_ctfc);
>   }
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
> index 89a5701bba0..05996fe195a 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
> @@ -11,10 +11,11 @@
>   /* { dg-options "-O0 -gbtf -dA" } */
>   
>   /* Struct type with 2 members (struct foo).  */
> +/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT 'foo'" 1 } } */
>   /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
>   /* Struct type with 1 member (anon struct).  */
> +/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT ''" 1 } } */
>   /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
>   
>   struct foo
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
> index f3b120bb458..49cdc87cf59 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
> @@ -9,9 +9,9 @@
>   
>   /* Struct type with 1 member.  */
>   /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
> -/* Union type with 2 members.  */
> +/* Anonymous union type with 2 members.  */
>   /* { dg-final { scan-assembler-times "\[\t \]0x5000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_UNION ''" 1 } } */
>   
>   struct foo
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
> index ab55445bd35..967b1e8746a 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
> @@ -18,6 +18,9 @@
>   /* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*bta_nelems" 1 } } */
>   /* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*bta_nelems" 1 } } */
>   
> +/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_INT 'int'\\)" 4 } } */
> +/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_ARRAY ''\\)" 1 } } */
> +
>   int b1[2] = {0,1};
>   int c1[5] = {0,1,2,3,4};
>   int a1[2][3] = { {3,4,5}, {2,3,4} };
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
> index 9665ab67145..03c323a6d49 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
> @@ -16,7 +16,7 @@
>   /* { dg-final { scan-assembler-times "\[\t \]0x20000020\[\t \]+\[^\n\]*btm_offset" 1 } } */
>   
>   /* Only 2 members.  */
> -/* { dg-final { scan-assembler-times "btm_name" 2 } } */
> +/* { dg-final { scan-assembler-times "MEMBER" 2 } } */
>   
>   struct foo
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
> index 2984a3357eb..78b8b7d49ad 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
> @@ -22,7 +22,7 @@
>   /* { dg-final { scan-assembler-times "\[\t \]0x84000001\[\t \]+\[^\n\]*btt_info" 1 } } */
>   
>   /* Bitfield "f" points to type ID 1.  */
> -/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*btm_type" 1 } } */
> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ENUM 'foo'" 1 } } */
>   
>   enum foo
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
> index 884d25cfbda..7ca0890884e 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
> @@ -1,6 +1,6 @@
>   /* Test BTF generation for a function with an unrepresentable parameter.
>   
> -   BTF has no encoding for floating point types, among others. Function
> +   BTF has no encoding for vector types, among others. Function
>      parameters of unrepresentable types are emitted as 'void' types.
>   
>      We expect one BTF_KIND_FUNC_PROTO with 3 parameters, one of which
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> index 48a946ab14b..e014d9990a9 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> @@ -6,8 +6,8 @@
>   /* { dg-do compile } */
>   /* { dg-options "-O0 -gbtf -dA" } */
>   
> -/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=2" 1 } } */
> -/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'extfunc'" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'foo'" 1 } } */
>   
>   extern int extfunc(int a, int b);
>   
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
> index a14ac0f89b2..f80d8089877 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
> @@ -9,6 +9,9 @@
>   /* { dg-options "-O0 -gbtf -dA" } */
>   
>   /* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 2 } } */
> +/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT 'int'"}} */
> +/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'"}} */
> +
>   /* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   /* { dg-final { scan-assembler-times "ascii \"st.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
> index bc3281437c9..79156cd7bcf 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
> @@ -9,7 +9,9 @@
>   
>   /* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
>   /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
> -/* { dg-final { scan-assembler-times "btm_name" 5 } } */
> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_INT" 3 } } */
> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ARRAY" 1 } } */
> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_STRUCT" 1 } } */
>   
>   struct foo
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
> index c3aff09ed9a..e9ff06883db 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
> @@ -1,7 +1,7 @@
>   /* Test BTF generation for struct type with a member which refers to an
>      unsupported type.
>   
> -   BTF does not support floating point types (among other things). When
> +   BTF does not support vector types (among other things). When
>      generating BTF for a struct (or union) type, members which refer to
>      unsupported types should be skipped.  */
>   
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
> index 472cc63f600..36bbb292f5c 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
> @@ -41,13 +41,13 @@
>   /* { dg-final { scan-assembler-times "ascii \"node_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   /* { dg-final { scan-assembler-times "ascii \"arena_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   
> -/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0x8\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0xb\[\t \]+\[^\n\]*btv_type" 1 } } */
> -/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*btv_type" 1 } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'a'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'my_int'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'b'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'foo_int'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'c'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'bar_int'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'd'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'node_t'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'destination'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBAR'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'ticket'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBARP'" } } */
> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'suitcase'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'arena_t'" } } */
>   
>   typedef int my_int;
>   typedef int foo_int;
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
> index d66843717b3..e3a19028843 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
> @@ -5,7 +5,7 @@
>   
>   /* One union type with 4 members */
>   /* { dg-final { scan-assembler-times "\[\t \]0x5000004\[\t \]+\[^\n\]*btt_info" 1 } } */
> -/* { dg-final { scan-assembler-times "btm_name" 4 } } */
> +/* { dg-final { scan-assembler-times "MEMBER" 4 } } */
>   
>   union onion
>   {
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
> index a79ed1d53b7..42503df396f 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
> @@ -5,6 +5,12 @@
>   
>   /* We expect 6 variables */
>   /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 6 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'x1'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'bar'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_UNION" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'lala'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ENUM" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'arr'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ARRAY" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'plong'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_PTR" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'st_inst'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'" 1 } } */
>   
>   unsigned int x1;
>   
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
> index db0bdd7be16..5f0c0b6e02d 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
> @@ -1,7 +1,7 @@
>   /* BTF generation for variables with removed type.
>   
> -   BTF does not support floating point types, so no representation for the type
> -   'float' will be emitted. In this test, we check to also ensure that the
> +   BTF does not support vector types, so no representation for the type
> +   of 'bar' will be emitted. In this test, we check to also ensure that the
>      variable 'bar' is not emitted, as it references a type that is not supported
>      in BTF.  */
>   
> @@ -11,6 +11,9 @@
>   /* We expect only 3 variables.  */
>   /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 3 } } */
>   
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'foo'" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'baz'" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'myst'" 1 } } */
>   /* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   /* { dg-final { scan-assembler-times "ascii \"baz.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>   /* { dg-final { scan-assembler-times "ascii \"myst.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>
  
David Faust May 30, 2023, 4:08 p.m. UTC | #2
On 5/30/23 00:30, Indu Bhagat wrote:
> On 5/25/23 9:37 AM, David Faust via Gcc-patches wrote:
>> Many BTF type kinds refer to other types via index to the final types
>> list. However, the order of the final types list is not guaranteed to
>> remain the same for the same source program between different runs of
>> the compiler, making it difficult to test inter-type references.
>>
>> This patch updates the assembler comments output when writing a
>> given BTF record to include minimal information about the referenced
>> type, if any. This allows for the regular expressions used in the gcc
>> testsuite to do some basic integrity checks on inter-type references.
>>
>> For example, for the type
>>
>> 	unsigned int *
>>
>> Assembly comments like the following are written with -dA:
>>
>> 	.4byte	0	; TYPE 2 BTF_KIND_PTR ''
>> 	.4byte	0x2000000	; btt_info: kind=2, kflag=0, vlen=0
>> 	.4byte	0x1	; btt_type: (BTF_KIND_INT 'unsigned int')
>>
>> Several BTF tests which can immediately be made more robust with this
>> change are updated. It will also be useful in new tests for the upcoming
>> btf_type_tag support.
>>
> 
> Thanks for working on this, David.  It will be nice to use these 
> enhanced assembler comments in the output for some of CTF testing as 
> well sometime.  But we can get to that later after this comit.
> 
> Some comments inlined below.
> 
>> Tested on BPF and x86_64, no known regressions.
>> OK for trunk?
>>
>> Thanks.
>>
>> gcc/
>>
>> 	* btfout.cc (btf_kind_names): New.
>> 	(btf_kind_name): New.
>> 	(btf_absolute_var_id): New utility function.
>> 	(btf_relative_var_id): Likewise.
>> 	(btf_relative_func_id): Likewise.
>> 	(btf_absolute_datasec_id): Likewise.
>> 	(btf_asm_type_ref): New.
>> 	(btf_asm_type): Update asm comments and use btf_asm_type_ref ().
>> 	(btf_asm_array): Likewise. Accept ctf_container_ref parameter.
>> 	(btf_asm_varent): Likewise.
>> 	(btf_asm_func_arg): Likewise.
>> 	(btf_asm_datasec_entry): Likewise.
>> 	(btf_asm_datasec_type): Likewise.
>> 	(btf_asm_func_type): Likewise. Add index parameter.
>> 	(btf_asm_sou_member): Likewise.
>> 	(output_btf_vars): Update btf_asm_* call accordingly.
>> 	(output_asm_btf_sou_fields): Likewise.
>> 	(output_asm_btf_func_args_list): Likewise.
>> 	(output_asm_btf_vlen_bytes): Likewise.
>> 	(output_btf_func_types): Add ctf_container_ref parameter.
>> 	Pass it to btf_asm_func_type.
>> 	(output_btf_datasec_types): Update btf_asm_datsec_type call similarly.
>> 	(btf_output): Update output_btf_func_types call similarly.
>>
>> gcc/testsuite/
>>
>> 	* gcc.dg/debug/btf/btf-array-1.c: Use new BTF asm comments
>> 	in scan-assembler expressions where useful.
>> 	* gcc.dg/debug/btf/btf-anonymous-struct-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-anonymous-union-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-bitfields-2.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-bitfields-3.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-function-6.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-pointers-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-struct-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-struct-2.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-typedef-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-union-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-variables-1.c: Likewise.
>> 	* gcc.dg/debug/btf/btf-variables-2.c: Likewise. Update outdated comment.
>> 	* gcc.dg/debug/btf/btf-function-3.c: Update outdated comment.
>> ---
>>   gcc/btfout.cc                                 | 220 ++++++++++++++----
>>   .../gcc.dg/debug/btf/btf-anonymous-struct-1.c |   3 +-
>>   .../gcc.dg/debug/btf/btf-anonymous-union-1.c  |   4 +-
>>   gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c  |   3 +
>>   .../gcc.dg/debug/btf/btf-bitfields-2.c        |   2 +-
>>   .../gcc.dg/debug/btf/btf-bitfields-3.c        |   2 +-
>>   .../gcc.dg/debug/btf/btf-function-3.c         |   2 +-
>>   .../gcc.dg/debug/btf/btf-function-6.c         |   4 +-
>>   .../gcc.dg/debug/btf/btf-pointers-1.c         |   3 +
>>   gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c |   4 +-
>>   gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c |   2 +-
>>   .../gcc.dg/debug/btf/btf-typedef-1.c          |  14 +-
>>   gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c  |   2 +-
>>   .../gcc.dg/debug/btf/btf-variables-1.c        |   6 +
>>   .../gcc.dg/debug/btf/btf-variables-2.c        |   7 +-
>>   15 files changed, 215 insertions(+), 63 deletions(-)
>>
>> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
>> index 497c1ca06e6..8960acfbbaa 100644
>> --- a/gcc/btfout.cc
>> +++ b/gcc/btfout.cc
>> @@ -114,6 +114,23 @@ static unsigned int num_types_added = 0;
>>      CTF types.  */
>>   static unsigned int num_types_created = 0;
>>   
>> +/* Name strings for BTF kinds.
>> +   Note: the indices here must match the type defines in btf.h.  */
>> +static const char *const btf_kind_names[] =
>> +  {
>> +    "UNKN", "INT", "PTR", "ARRAY", "STRUCT", "UNION", "ENUM", "FWD",
>> +    "TYPEDEF", "VOLATILE", "CONST", "RESTRICT", "FUNC", "FUNC_PROTO",
>> +    "VAR", "DATASEC", "FLOAT", "DECL_TAG", "TYPE_TAG", "ENUM64"
>> +  };
>> +
>> +/* Return a name string for the given BTF_KIND.  */
>> +
>> +static const char *
>> +btf_kind_name (uint32_t btf_kind)
>> +{
>> +  return btf_kind_names[btf_kind];
>> +}
>> +
>>   /* Map a CTF type kind to the corresponding BTF type kind.  */
>>   
>>   static uint32_t
>> @@ -141,6 +158,57 @@ get_btf_kind (uint32_t ctf_kind)
>>     return BTF_KIND_UNKN;
>>   }
>>   
>> +/* Helper routines to map between 'relative' and 'absolute' IDs.
>> +
>> +   In BTF all records (including variables) are output in one long list, and all
>> +   inter-type references are via index into that list.  But internally since we
>> +   a) translate from CTF, which separates variable records from regular types
>> +   and b) create some additional tpyes after the fact, things like VARs and FUNC
> 
> typo: tpyes -> types
> 
> Also VAR instead of VARs ? ..."VAR and FUNC records"

Oops, thanks.

> 
>> +   records are stored in separate vectors with their own indices.  These
>> +   functions map between the 'relative' IDs (i.e.  indices in their respective
>> +   containers) and 'absolute' IDs (i.e.  indices in the final contiguous
>> +   output list), which goes in order:
>> +     all normal type records translated from CTF
>> +     all BTF_KIND_VAR records
>> +     all BTF_KIND_FUNC records (synthesized split function records)
>> +     all BTF_KIND_DATASEC records (synthesized)
>> +
>> +   The extra '+ 1's below are to account for the implicit "void" record, which
>> +   has index 0 but isn't actually contained in the type list.  */
>> +
>> +/* Return the final BTF ID of the variable at relative index REL.  */
>> +
>> +static ctf_id_t
>> +btf_absolute_var_id (ctf_id_t rel)
>> +{
>> +  return rel + (num_types_added + 1);
>> +}
>> +
>> +/* Return the relative index of the variable with final BTF ID ABS.  */
>> +
>> +static ctf_id_t
>> +btf_relative_var_id (ctf_id_t abs)
>> +{
>> +  return abs - (num_types_added + 1);
>> +}
>> +
>> +/* Return the relative index of the func record with final BTF ID ABS.  */
>> +
>> +static ctf_id_t
>> +btf_relative_func_id (ctf_id_t abs)
>> +{
>> +  return abs - ((num_types_added + 1) + num_vars_added);
>> +}
>> +
>> +/* Return the final BTF ID of the datasec record at relative index REL.  */
>> +
>> +static ctf_id_t
>> +btf_absolute_datasec_id (ctf_id_t rel)
>> +{
>> +  return rel + (num_types_added + 1) + num_vars_added + funcs->length ();
>> +}
>> +
>> +
>>   /* Allocate the btf_id_map, and initialize elements to BTF_INVALID_TYPEID.  */
>>   
>>   static void
>> @@ -407,8 +475,7 @@ btf_collect_datasec (ctf_container_ref ctfc)
>>         info.type = 0;
>>         unsigned int *var_id = btf_var_ids->get (dvd);
>>         if (var_id)
>> -	/* +1 for the sentinel type not in the types map.  */
>> -	info.type = *var_id + num_types_added + 1;
>> +	info.type = btf_absolute_var_id (*var_id);
>>         else
>>   	continue;
>>   
>> @@ -620,6 +687,48 @@ btf_dmd_representable_bitfield_p (ctf_container_ref ctfc, ctf_dmdef_t *dmd)
>>   
>>   /* BTF asm helper routines.  */
>>   
>> +/* Asm'out a reference to another BTF type.  */
>> +
>> +static void
>> +btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
>> +{
>> +  if (ref_id == BTF_VOID_TYPEID || ref_id == BTF_INVALID_TYPEID)
>> +    {
>> +      /* There is no explicit void type.
>> +	 Also handle any invalid refs that made it this far, just in case.  */
>> +      dw2_asm_output_data (4, ref_id, "%s: void", prefix);
>> +    }
>> +  else if (ref_id >= num_types_added + 1
>> +	   && ref_id < num_types_added + num_vars_added + 1)
>> +    {
>> +      /* Ref to a variable.  Should only appear in DATASEC entries.  */
>> +      ctf_id_t var_id = btf_relative_var_id (ref_id);
>> +      ctf_dvdef_ref dvd = ctfc->ctfc_vars_list[var_id];
>> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_VAR '%s')",
>> +			   prefix, dvd->dvd_name);
>> +
>> +    }
>> +  else if (ref_id >= num_types_added + num_vars_added + 1)
>> +    {
>> +      /* Ref to a FUNC record.  */
>> +      size_t func_id = btf_relative_func_id (ref_id);
>> +      ctf_dtdef_ref ref_type = (*funcs)[func_id];
>> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_FUNC '%s')",
>> +			   prefix, ref_type->dtd_name);
>> +    }
>> +  else
>> +    {
>> +      /* Ref to a standard type in the types list.  */
>> +      ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[ref_id];
>> +      uint32_t ref_kind
>> +	= get_btf_kind (CTF_V2_INFO_KIND (ref_type->dtd_data.ctti_info));
>> +
>> +      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_%s '%s')",
>> +			   prefix, btf_kind_name (ref_kind),
>> +			   ref_type->dtd_name);
>> +    }
>> +}
>> +
>>   /* Asm'out a BTF type. This routine is responsible for the bulk of the task
>>      of converting CTF types to their BTF representation.  */
>>   
>> @@ -689,7 +798,10 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>>   	btf_kind = BTF_KIND_ENUM64;
>>      }
>>   
>> -  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
>> +  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
>> +		       "TYPE %lu BTF_KIND_%s '%s'", > +		       get_btf_id (dtd->dtd_type), btf_kind_name (btf_kind),
>> +		       dtd->dtd_name);
>>     dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen),
>>   		       "btt_info: kind=%u, kflag=%u, vlen=%u",
>>   		       btf_kind, btf_kflag, btf_vlen);
>> @@ -705,33 +817,41 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>>         dw2_asm_output_data (4, dtd->dtd_data.ctti_size, "btt_size: %uB",
>>   			   dtd->dtd_data.ctti_size);
>>         return;
>> +    case BTF_KIND_ARRAY:
>> +    case BTF_KIND_FWD:
>> +      /* These types do not encode any information in the size/type field
>> +	 and should write 0.  */
>> +      dw2_asm_output_data (4, 0, "(unused)");
>> +      return;
> 
> Ideally I would split this out into a separate commit as it is unrelated 
> to improving -dA comments for testsuite.
> 

OK

>>       default:
>>         break;
>>       }
>>   
>> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
>> +  ctf_id_t ref_id = get_btf_id (dtd->dtd_data.ctti_type);
>> +  btf_asm_type_ref ("btt_type", ctfc, ref_id);
>>   }
>>   
>>   /* Asm'out the variable information following a BTF_KIND_ARRAY.  */
>>   
>>   static void
>> -btf_asm_array (ctf_dtdef_ref dtd)
>> +btf_asm_array (ctf_container_ref ctfc, ctf_arinfo_t arr)
>>   {
>> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_contents),
>> -		       "bta_contents");
>> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_index),
>> -		       "bta_index");
>> -  dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_nelems, "bta_nelems");
>> +  btf_asm_type_ref ("bta_elem_type", ctfc, get_btf_id (arr.ctr_contents));
>> +  btf_asm_type_ref ("bta_index_type", ctfc, get_btf_id (arr.ctr_index));
>> +  dw2_asm_output_data (4, arr.ctr_nelems, "bta_nelems");
>>   }
>>   
>>   /* Asm'out a BTF_KIND_VAR.  */
>>   
>>   static void
>> -btf_asm_varent (ctf_dvdef_ref var)
>> +btf_asm_varent (ctf_container_ref ctfc, ctf_dvdef_ref var)
>>   {
>> -  dw2_asm_output_data (4, var->dvd_name_offset, "btv_name");
>> +  ctf_id_t ref_id = get_btf_id (var->dvd_type);
>> +  dw2_asm_output_data (4, var->dvd_name_offset, "TYPE %u BTF_KIND_VAR '%s'",
>> +		       (*(btf_var_ids->get (var)) + num_types_added + 1),
>> +		       var->dvd_name);
>>     dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_VAR, 0, 0), "btv_info");
>> -  dw2_asm_output_data (4, get_btf_id (var->dvd_type), "btv_type");
>> +  btf_asm_type_ref ("btv_type", ctfc, ref_id);
>>     dw2_asm_output_data (4, var->dvd_visibility, "btv_linkage");
>>   }
>>   
>> @@ -739,7 +859,7 @@ btf_asm_varent (ctf_dvdef_ref var)
>>      BTF_KIND_UNION.  */
>>   
>>   static void
>> -btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
>> +btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd, unsigned int idx)
>>   {
>>     ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[dmd->dmd_type];
>>   
>> @@ -762,15 +882,19 @@ btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
>>         sou_offset &= 0x00ffffff;
>>         sou_offset |= ((bits & 0xff) << 24);
>>   
>> +      dw2_asm_output_data (4, dmd->dmd_name_offset,
>> +			   "MEMBER '%s' idx=%u",
>> +			   dmd->dmd_name, idx);
> 
> I understand that the current commit can be improved further. There are 
> two places, however, which I thought could be included now for a more 
> complete implemenation:
> 
> 1. Enum constant name dmd->dmd_name_offset ("bte_name") in 
> btf_asm_enum_const ().
> 2. BTF_TYPE_INFO in btf_asm_datasec_type(). Perhaps we could dump the 
> number of datasec entries if you think that is useful for testing.
> 
> WDYT ?

Sure, I will add them. Thanks for pointing these out.

> 
>>         /* Refer to the base type of the slice.  */
>> -      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
>> -      dw2_asm_output_data (4, get_btf_id (base_type), "btm_type");
>> +      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (base_type));
>>         dw2_asm_output_data (4, sou_offset, "btm_offset");
>>       }
>>     else
>>       {
>> -      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
>> -      dw2_asm_output_data (4, get_btf_id (dmd->dmd_type), "btm_type");
>> +      dw2_asm_output_data (4, dmd->dmd_name_offset,
>> +			   "MEMBER '%s' idx=%u",
>> +			   dmd->dmd_name, idx);
>> +      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (dmd->dmd_type));
>>         dw2_asm_output_data (4, dmd->dmd_offset, "btm_offset");
>>       }
>>   }
>> @@ -793,7 +917,8 @@ btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd)
>>   /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO.  */
>>   
>>   static void
>> -btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
>> +btf_asm_func_arg (ctf_container_ref ctfc, ctf_func_arg_t * farg,
>> +		  size_t stroffset)
>>   {
>>     /* If the function arg does not have a name, refer to the null string at
>>        the start of the string table. This ensures correct encoding for varargs
>> @@ -803,31 +928,33 @@ btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
>>     else
>>       dw2_asm_output_data (4, 0, "farg_name");
>>   
>> -  dw2_asm_output_data (4, (btf_removed_type_p (farg->farg_type)
>> -			   ? BTF_VOID_TYPEID
>> -			   : get_btf_id (farg->farg_type)),
>> -		       "farg_type");
>> +  btf_asm_type_ref ("farg_type", ctfc, (btf_removed_type_p (farg->farg_type)
>> +					? BTF_VOID_TYPEID
>> +					: get_btf_id (farg->farg_type)));
>>   }
>>   
>>   /* Asm'out a BTF_KIND_FUNC type.  */
>>   
> 
> Lets keep the function level comments updated.  Apart from 
> btf_asm_func_type, this comment applies to other functions touched in 
> this commit, like btf_asm_datasec_type.

I don't follow. All those functions are still doing the same thing.
What needs to be updated exactly?

> 
>>   static void
>> -btf_asm_func_type (ctf_dtdef_ref dtd)
>> +btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, size_t i)
>>   {
>> -  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
>> -  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0,
>> -                                         dtd->linkage),
>> -                       "btt_info: kind=%u, kflag=%u, linkage=%u",
>> -                       BTF_KIND_FUNC, 0, dtd->linkage);
>> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
>> +  ctf_id_t ref_id = dtd->dtd_data.ctti_type;
>> +  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
>> +		       "TYPE %lu BTF_KIND_FUNC '%s'",
>> +		       num_types_added + num_vars_added + 1 + i,
>> +		       dtd->dtd_name);
>> +  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
>> +		       "btt_info: kind=%u, kflag=%u, linkage=%u",
>> +		       BTF_KIND_FUNC, 0, dtd->linkage);
>> +  btf_asm_type_ref ("btt_type", ctfc, get_btf_id (ref_id));
>>   }
>>   
>>   /* Asm'out a variable entry following a BTF_KIND_DATASEC.  */
>>   
>>   static void
>> -btf_asm_datasec_entry (struct btf_var_secinfo info)
>> +btf_asm_datasec_entry (ctf_container_ref ctfc, struct btf_var_secinfo info)
>>   {
>> -  dw2_asm_output_data (4, info.type, "bts_type");
>> +  btf_asm_type_ref ("bts_type", ctfc, info.type);
>>     dw2_asm_output_data (4, info.offset, "bts_offset");
>>     dw2_asm_output_data (4, info.size, "bts_size");
>>   }
>> @@ -835,9 +962,12 @@ btf_asm_datasec_entry (struct btf_var_secinfo info)
>>   /* Asm'out a whole BTF_KIND_DATASEC, including its variable entries.  */
>>   
>>   static void
>> -btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
>> +btf_asm_datasec_type (ctf_container_ref ctfc, btf_datasec_t ds, ctf_id_t id,
>> +		      size_t stroffset)
>>   {
>> -  dw2_asm_output_data (4, ds.name_offset + stroffset, "btt_name");
>> +  dw2_asm_output_data (4, ds.name_offset + stroffset,
>> +		       "TYPE %lu BTF_KIND_DATASEC '%s'",
>> +		       btf_absolute_datasec_id (id), ds.name);
>>     dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_DATASEC, 0,
>>   					 ds.entries.length ()),
>>   		       "btt_info");
>> @@ -845,7 +975,7 @@ btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
>>        loaders such as libbpf.  */
>>     dw2_asm_output_data (4, 0, "btt_size");
>>     for (size_t i = 0; i < ds.entries.length (); i++)
>> -    btf_asm_datasec_entry (ds.entries[i]);
>> +    btf_asm_datasec_entry (ctfc, ds.entries[i]);
>>   }
>>   
>>   /* Compute and output the header information for a .BTF section.  */
>> @@ -906,7 +1036,7 @@ output_btf_vars (ctf_container_ref ctfc)
>>     if (num_ctf_vars)
>>       {
>>         for (i = 0; i < num_ctf_vars; i++)
>> -	btf_asm_varent (ctfc->ctfc_vars_list[i]);
>> +	btf_asm_varent (ctfc, ctfc->ctfc_vars_list[i]);
>>       }
>>   }
>>   
>> @@ -940,9 +1070,13 @@ output_asm_btf_sou_fields (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>>   {
>>     ctf_dmdef_t * dmd;
>>   
>> +  unsigned idx = 0;
>>     for (dmd = dtd->dtd_u.dtu_members;
>>          dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd))
>> -      btf_asm_sou_member (ctfc, dmd);
>> +    {
>> +      btf_asm_sou_member (ctfc, dmd, idx);
>> +      idx++;
>> +    }
>>   }
>>   
>>   /* Output all enumerator constants following a BTF_KIND_ENUM{,64}.  */
>> @@ -968,7 +1102,7 @@ output_asm_btf_func_args_list (ctf_container_ref ctfc,
>>     ctf_func_arg_t * farg;
>>     for (farg = dtd->dtd_u.dtu_argv;
>>          farg != NULL; farg = (ctf_func_arg_t *) ctf_farg_list_next (farg))
>> -    btf_asm_func_arg (farg, farg_name_offset);
>> +    btf_asm_func_arg (ctfc, farg, farg_name_offset);
>>   }
>>   
>>   /* Output the variable portion of a BTF type record. The information depends
>> @@ -1004,7 +1138,7 @@ output_asm_btf_vlen_bytes (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>>         break;
>>   
>>       case BTF_KIND_ARRAY:
>> -      btf_asm_array (dtd);
>> +      btf_asm_array (ctfc, dtd->dtd_u.dtu_arr);
>>         break;
>>   
>>       case BTF_KIND_STRUCT:
>> @@ -1068,10 +1202,10 @@ output_btf_types (ctf_container_ref ctfc)
>>   /* Output all BTF_KIND_FUNC type records.  */
>>   
>>   static void
>> -output_btf_func_types (void)
>> +output_btf_func_types (ctf_container_ref ctfc)
>>   {
>>     for (size_t i = 0; i < vec_safe_length (funcs); i++)
>> -    btf_asm_func_type ((*funcs)[i]);
>> +    btf_asm_func_type (ctfc, (*funcs)[i], i);
>>   }
>>   
>>   /* Output all BTF_KIND_DATASEC records.  */
>> @@ -1082,7 +1216,7 @@ output_btf_datasec_types (ctf_container_ref ctfc)
>>     size_t name_offset = ctfc_get_strtab_len (ctfc, CTF_STRTAB);
>>   
>>     for (size_t i = 0; i < datasecs.length(); i++)
>> -    btf_asm_datasec_type (datasecs[i], name_offset);
>> +    btf_asm_datasec_type (ctfc, datasecs[i], i, name_offset);
>>   }
>>   
>>   /* Postprocess the CTF debug data post initialization.
>> @@ -1209,7 +1343,7 @@ btf_output (const char * filename)
>>     output_btf_header (tu_ctfc);
>>     output_btf_types (tu_ctfc);
>>     output_btf_vars (tu_ctfc);
>> -  output_btf_func_types ();
>> +  output_btf_func_types (tu_ctfc);
>>     output_btf_datasec_types (tu_ctfc);
>>     output_btf_strs (tu_ctfc);
>>   }
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
>> index 89a5701bba0..05996fe195a 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
>> @@ -11,10 +11,11 @@
>>   /* { dg-options "-O0 -gbtf -dA" } */
>>   
>>   /* Struct type with 2 members (struct foo).  */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT 'foo'" 1 } } */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
>>   /* Struct type with 1 member (anon struct).  */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT ''" 1 } } */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
>>   
>>   struct foo
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
>> index f3b120bb458..49cdc87cf59 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
>> @@ -9,9 +9,9 @@
>>   
>>   /* Struct type with 1 member.  */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
>> -/* Union type with 2 members.  */
>> +/* Anonymous union type with 2 members.  */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x5000002\[\t \]+\[^\n\]*btt_info" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_UNION ''" 1 } } */
>>   
>>   struct foo
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
>> index ab55445bd35..967b1e8746a 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
>> @@ -18,6 +18,9 @@
>>   /* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*bta_nelems" 1 } } */
>>   /* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*bta_nelems" 1 } } */
>>   
>> +/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_INT 'int'\\)" 4 } } */
>> +/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_ARRAY ''\\)" 1 } } */
>> +
>>   int b1[2] = {0,1};
>>   int c1[5] = {0,1,2,3,4};
>>   int a1[2][3] = { {3,4,5}, {2,3,4} };
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
>> index 9665ab67145..03c323a6d49 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
>> @@ -16,7 +16,7 @@
>>   /* { dg-final { scan-assembler-times "\[\t \]0x20000020\[\t \]+\[^\n\]*btm_offset" 1 } } */
>>   
>>   /* Only 2 members.  */
>> -/* { dg-final { scan-assembler-times "btm_name" 2 } } */
>> +/* { dg-final { scan-assembler-times "MEMBER" 2 } } */
>>   
>>   struct foo
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
>> index 2984a3357eb..78b8b7d49ad 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
>> @@ -22,7 +22,7 @@
>>   /* { dg-final { scan-assembler-times "\[\t \]0x84000001\[\t \]+\[^\n\]*btt_info" 1 } } */
>>   
>>   /* Bitfield "f" points to type ID 1.  */
>> -/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*btm_type" 1 } } */
>> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ENUM 'foo'" 1 } } */
>>   
>>   enum foo
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
>> index 884d25cfbda..7ca0890884e 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
>> @@ -1,6 +1,6 @@
>>   /* Test BTF generation for a function with an unrepresentable parameter.
>>   
>> -   BTF has no encoding for floating point types, among others. Function
>> +   BTF has no encoding for vector types, among others. Function
>>      parameters of unrepresentable types are emitted as 'void' types.
>>   
>>      We expect one BTF_KIND_FUNC_PROTO with 3 parameters, one of which
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
>> index 48a946ab14b..e014d9990a9 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
>> @@ -6,8 +6,8 @@
>>   /* { dg-do compile } */
>>   /* { dg-options "-O0 -gbtf -dA" } */
>>   
>> -/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=2" 1 } } */
>> -/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'extfunc'" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'foo'" 1 } } */
>>   
>>   extern int extfunc(int a, int b);
>>   
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
>> index a14ac0f89b2..f80d8089877 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
>> @@ -9,6 +9,9 @@
>>   /* { dg-options "-O0 -gbtf -dA" } */
>>   
>>   /* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 2 } } */
>> +/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT 'int'"}} */
>> +/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'"}} */
>> +
>>   /* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   /* { dg-final { scan-assembler-times "ascii \"st.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
>> index bc3281437c9..79156cd7bcf 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
>> @@ -9,7 +9,9 @@
>>   
>>   /* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
>> -/* { dg-final { scan-assembler-times "btm_name" 5 } } */
>> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_INT" 3 } } */
>> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ARRAY" 1 } } */
>> +/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_STRUCT" 1 } } */
>>   
>>   struct foo
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
>> index c3aff09ed9a..e9ff06883db 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
>> @@ -1,7 +1,7 @@
>>   /* Test BTF generation for struct type with a member which refers to an
>>      unsupported type.
>>   
>> -   BTF does not support floating point types (among other things). When
>> +   BTF does not support vector types (among other things). When
>>      generating BTF for a struct (or union) type, members which refer to
>>      unsupported types should be skipped.  */
>>   
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
>> index 472cc63f600..36bbb292f5c 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
>> @@ -41,13 +41,13 @@
>>   /* { dg-final { scan-assembler-times "ascii \"node_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   /* { dg-final { scan-assembler-times "ascii \"arena_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   
>> -/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0x8\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0xb\[\t \]+\[^\n\]*btv_type" 1 } } */
>> -/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*btv_type" 1 } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'a'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'my_int'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'b'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'foo_int'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'c'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'bar_int'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'd'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'node_t'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'destination'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBAR'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'ticket'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBARP'" } } */
>> +/* { dg-final { scan-assembler "BTF_KIND_VAR 'suitcase'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'arena_t'" } } */
>>   
>>   typedef int my_int;
>>   typedef int foo_int;
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
>> index d66843717b3..e3a19028843 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
>> @@ -5,7 +5,7 @@
>>   
>>   /* One union type with 4 members */
>>   /* { dg-final { scan-assembler-times "\[\t \]0x5000004\[\t \]+\[^\n\]*btt_info" 1 } } */
>> -/* { dg-final { scan-assembler-times "btm_name" 4 } } */
>> +/* { dg-final { scan-assembler-times "MEMBER" 4 } } */
>>   
>>   union onion
>>   {
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
>> index a79ed1d53b7..42503df396f 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
>> @@ -5,6 +5,12 @@
>>   
>>   /* We expect 6 variables */
>>   /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 6 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'x1'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'bar'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_UNION" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'lala'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ENUM" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'arr'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ARRAY" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'plong'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_PTR" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'st_inst'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'" 1 } } */
>>   
>>   unsigned int x1;
>>   
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
>> index db0bdd7be16..5f0c0b6e02d 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
>> @@ -1,7 +1,7 @@
>>   /* BTF generation for variables with removed type.
>>   
>> -   BTF does not support floating point types, so no representation for the type
>> -   'float' will be emitted. In this test, we check to also ensure that the
>> +   BTF does not support vector types, so no representation for the type
>> +   of 'bar' will be emitted. In this test, we check to also ensure that the
>>      variable 'bar' is not emitted, as it references a type that is not supported
>>      in BTF.  */
>>   
>> @@ -11,6 +11,9 @@
>>   /* We expect only 3 variables.  */
>>   /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 3 } } */
>>   
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'foo'" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'baz'" 1 } } */
>> +/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'myst'" 1 } } */
>>   /* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   /* { dg-final { scan-assembler-times "ascii \"baz.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>   /* { dg-final { scan-assembler-times "ascii \"myst.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
>>
>
  
Indu Bhagat May 30, 2023, 4:45 p.m. UTC | #3
On 5/30/23 09:08, David Faust wrote:
>>> @@ -793,7 +917,8 @@ btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd)
>>>    /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO.  */
>>>    
>>>    static void
>>> -btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
>>> +btf_asm_func_arg (ctf_container_ref ctfc, ctf_func_arg_t * farg,
>>> +		  size_t stroffset)
>>>    {
>>>      /* If the function arg does not have a name, refer to the null string at
>>>         the start of the string table. This ensures correct encoding for varargs
>>> @@ -803,31 +928,33 @@ btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
>>>      else
>>>        dw2_asm_output_data (4, 0, "farg_name");
>>>    
>>> -  dw2_asm_output_data (4, (btf_removed_type_p (farg->farg_type)
>>> -			   ? BTF_VOID_TYPEID
>>> -			   : get_btf_id (farg->farg_type)),
>>> -		       "farg_type");
>>> +  btf_asm_type_ref ("farg_type", ctfc, (btf_removed_type_p (farg->farg_type)
>>> +					? BTF_VOID_TYPEID
>>> +					: get_btf_id (farg->farg_type)));
>>>    }
>>>    
>>>    /* Asm'out a BTF_KIND_FUNC type.  */
>>>    
>> Lets keep the function level comments updated.  Apart from
>> btf_asm_func_type, this comment applies to other functions touched in
>> this commit, like btf_asm_datasec_type.
> I don't follow. All those functions are still doing the same thing.
> What needs to be updated exactly?
> 

I meant updating the function-level comments for the additional args 
that are added.

I saw that in this patch, the new functions added follow the style of 
explaining the args, like,

+/* Return the relative index of the variable with final BTF ID ABS.  */
+
+static ctf_id_t
+btf_relative_var_id (ctf_id_t abs)

Hence, my comment.  But on second look, however, I see that the file 
keeps a mix of different styles. This one is up to you then. It makes 
sense to leave out the self-explanatory args.

>>>    static void
>>> -btf_asm_func_type (ctf_dtdef_ref dtd)
>>> +btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, size_t i)
>>>    {
>>> -  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
>>> -  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0,
>>> -                                         dtd->linkage),
>>> -                       "btt_info: kind=%u, kflag=%u, linkage=%u",
>>> -                       BTF_KIND_FUNC, 0, dtd->linkage);
>>> -  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
>>> +  ctf_id_t ref_id = dtd->dtd_data.ctti_type;
>>> +  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
>>> +		       "TYPE %lu BTF_KIND_FUNC '%s'",
>>> +		       num_types_added + num_vars_added + 1 + i,
>>> +		       dtd->dtd_name);
>>> +  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
>>> +		       "btt_info: kind=%u, kflag=%u, linkage=%u",
>>> +		       BTF_KIND_FUNC, 0, dtd->linkage);
>>> +  btf_asm_type_ref ("btt_type", ctfc, get_btf_id (ref_id));
>>>    }
>>>    
>>>    /* Asm'out a variable entry following a BTF_KIND_DATASEC.  */
>>>    
>>>    static void
>>> -btf_asm_datasec_entry (struct btf_var_secinfo info)
>>> +btf_asm_datasec_entry (ctf_container_ref ctfc, struct btf_var_secinfo info)
>>>    {
>>> -  dw2_asm_output_data (4, info.type, "bts_type");
>>> +  btf_asm_type_ref ("bts_type", ctfc, info.type);
>>>      dw2_asm_output_data (4, info.offset, "bts_offset");
>>>      dw2_asm_output_data (4, info.size, "bts_size");
>>>    }
>>> @@ -835,9 +962,12 @@ btf_asm_datasec_entry (struct btf_var_secinfo info)
>>>    /* Asm'out a whole BTF_KIND_DATASEC, including its variable entries.  */
>>>    
>>>    static void
>>> -btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
>>> +btf_asm_datasec_type (ctf_container_ref ctfc, btf_datasec_t ds, ctf_id_t id,
>>> +		      size_t stroffset)
>>>    {
>>> -  dw2_asm_output_data (4, ds.name_offset + stroffset, "btt_name");
>>> +  dw2_asm_output_data (4, ds.name_offset + stroffset,
>>> +		       "TYPE %lu BTF_KIND_DATASEC '%s'",
>>> +		       btf_absolute_datasec_id (id), ds.name);
>>>      dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_DATASEC, 0,
>>>    					 ds.entries.length ()),
>>>    		       "btt_info");
>>> @@ -845,7 +975,7 @@ btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
>>>         loaders such as libbpf.  */
>>>      dw2_asm_output_data (4, 0, "btt_size");
>>>      for (size_t i = 0; i < ds.entries.length (); i++)
>>> -    btf_asm_datasec_entry (ds.entries[i]);
>>> +    btf_asm_datasec_entry (ctfc, ds.entries[i]);
>>>    }
>>>
  

Patch

diff --git a/gcc/btfout.cc b/gcc/btfout.cc
index 497c1ca06e6..8960acfbbaa 100644
--- a/gcc/btfout.cc
+++ b/gcc/btfout.cc
@@ -114,6 +114,23 @@  static unsigned int num_types_added = 0;
    CTF types.  */
 static unsigned int num_types_created = 0;
 
+/* Name strings for BTF kinds.
+   Note: the indices here must match the type defines in btf.h.  */
+static const char *const btf_kind_names[] =
+  {
+    "UNKN", "INT", "PTR", "ARRAY", "STRUCT", "UNION", "ENUM", "FWD",
+    "TYPEDEF", "VOLATILE", "CONST", "RESTRICT", "FUNC", "FUNC_PROTO",
+    "VAR", "DATASEC", "FLOAT", "DECL_TAG", "TYPE_TAG", "ENUM64"
+  };
+
+/* Return a name string for the given BTF_KIND.  */
+
+static const char *
+btf_kind_name (uint32_t btf_kind)
+{
+  return btf_kind_names[btf_kind];
+}
+
 /* Map a CTF type kind to the corresponding BTF type kind.  */
 
 static uint32_t
@@ -141,6 +158,57 @@  get_btf_kind (uint32_t ctf_kind)
   return BTF_KIND_UNKN;
 }
 
+/* Helper routines to map between 'relative' and 'absolute' IDs.
+
+   In BTF all records (including variables) are output in one long list, and all
+   inter-type references are via index into that list.  But internally since we
+   a) translate from CTF, which separates variable records from regular types
+   and b) create some additional tpyes after the fact, things like VARs and FUNC
+   records are stored in separate vectors with their own indices.  These
+   functions map between the 'relative' IDs (i.e.  indices in their respective
+   containers) and 'absolute' IDs (i.e.  indices in the final contiguous
+   output list), which goes in order:
+     all normal type records translated from CTF
+     all BTF_KIND_VAR records
+     all BTF_KIND_FUNC records (synthesized split function records)
+     all BTF_KIND_DATASEC records (synthesized)
+
+   The extra '+ 1's below are to account for the implicit "void" record, which
+   has index 0 but isn't actually contained in the type list.  */
+
+/* Return the final BTF ID of the variable at relative index REL.  */
+
+static ctf_id_t
+btf_absolute_var_id (ctf_id_t rel)
+{
+  return rel + (num_types_added + 1);
+}
+
+/* Return the relative index of the variable with final BTF ID ABS.  */
+
+static ctf_id_t
+btf_relative_var_id (ctf_id_t abs)
+{
+  return abs - (num_types_added + 1);
+}
+
+/* Return the relative index of the func record with final BTF ID ABS.  */
+
+static ctf_id_t
+btf_relative_func_id (ctf_id_t abs)
+{
+  return abs - ((num_types_added + 1) + num_vars_added);
+}
+
+/* Return the final BTF ID of the datasec record at relative index REL.  */
+
+static ctf_id_t
+btf_absolute_datasec_id (ctf_id_t rel)
+{
+  return rel + (num_types_added + 1) + num_vars_added + funcs->length ();
+}
+
+
 /* Allocate the btf_id_map, and initialize elements to BTF_INVALID_TYPEID.  */
 
 static void
@@ -407,8 +475,7 @@  btf_collect_datasec (ctf_container_ref ctfc)
       info.type = 0;
       unsigned int *var_id = btf_var_ids->get (dvd);
       if (var_id)
-	/* +1 for the sentinel type not in the types map.  */
-	info.type = *var_id + num_types_added + 1;
+	info.type = btf_absolute_var_id (*var_id);
       else
 	continue;
 
@@ -620,6 +687,48 @@  btf_dmd_representable_bitfield_p (ctf_container_ref ctfc, ctf_dmdef_t *dmd)
 
 /* BTF asm helper routines.  */
 
+/* Asm'out a reference to another BTF type.  */
+
+static void
+btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
+{
+  if (ref_id == BTF_VOID_TYPEID || ref_id == BTF_INVALID_TYPEID)
+    {
+      /* There is no explicit void type.
+	 Also handle any invalid refs that made it this far, just in case.  */
+      dw2_asm_output_data (4, ref_id, "%s: void", prefix);
+    }
+  else if (ref_id >= num_types_added + 1
+	   && ref_id < num_types_added + num_vars_added + 1)
+    {
+      /* Ref to a variable.  Should only appear in DATASEC entries.  */
+      ctf_id_t var_id = btf_relative_var_id (ref_id);
+      ctf_dvdef_ref dvd = ctfc->ctfc_vars_list[var_id];
+      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_VAR '%s')",
+			   prefix, dvd->dvd_name);
+
+    }
+  else if (ref_id >= num_types_added + num_vars_added + 1)
+    {
+      /* Ref to a FUNC record.  */
+      size_t func_id = btf_relative_func_id (ref_id);
+      ctf_dtdef_ref ref_type = (*funcs)[func_id];
+      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_FUNC '%s')",
+			   prefix, ref_type->dtd_name);
+    }
+  else
+    {
+      /* Ref to a standard type in the types list.  */
+      ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[ref_id];
+      uint32_t ref_kind
+	= get_btf_kind (CTF_V2_INFO_KIND (ref_type->dtd_data.ctti_info));
+
+      dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_%s '%s')",
+			   prefix, btf_kind_name (ref_kind),
+			   ref_type->dtd_name);
+    }
+}
+
 /* Asm'out a BTF type. This routine is responsible for the bulk of the task
    of converting CTF types to their BTF representation.  */
 
@@ -689,7 +798,10 @@  btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
 	btf_kind = BTF_KIND_ENUM64;
    }
 
-  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
+  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
+		       "TYPE %lu BTF_KIND_%s '%s'",
+		       get_btf_id (dtd->dtd_type), btf_kind_name (btf_kind),
+		       dtd->dtd_name);
   dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen),
 		       "btt_info: kind=%u, kflag=%u, vlen=%u",
 		       btf_kind, btf_kflag, btf_vlen);
@@ -705,33 +817,41 @@  btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
       dw2_asm_output_data (4, dtd->dtd_data.ctti_size, "btt_size: %uB",
 			   dtd->dtd_data.ctti_size);
       return;
+    case BTF_KIND_ARRAY:
+    case BTF_KIND_FWD:
+      /* These types do not encode any information in the size/type field
+	 and should write 0.  */
+      dw2_asm_output_data (4, 0, "(unused)");
+      return;
     default:
       break;
     }
 
-  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
+  ctf_id_t ref_id = get_btf_id (dtd->dtd_data.ctti_type);
+  btf_asm_type_ref ("btt_type", ctfc, ref_id);
 }
 
 /* Asm'out the variable information following a BTF_KIND_ARRAY.  */
 
 static void
-btf_asm_array (ctf_dtdef_ref dtd)
+btf_asm_array (ctf_container_ref ctfc, ctf_arinfo_t arr)
 {
-  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_contents),
-		       "bta_contents");
-  dw2_asm_output_data (4, get_btf_id (dtd->dtd_u.dtu_arr.ctr_index),
-		       "bta_index");
-  dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_nelems, "bta_nelems");
+  btf_asm_type_ref ("bta_elem_type", ctfc, get_btf_id (arr.ctr_contents));
+  btf_asm_type_ref ("bta_index_type", ctfc, get_btf_id (arr.ctr_index));
+  dw2_asm_output_data (4, arr.ctr_nelems, "bta_nelems");
 }
 
 /* Asm'out a BTF_KIND_VAR.  */
 
 static void
-btf_asm_varent (ctf_dvdef_ref var)
+btf_asm_varent (ctf_container_ref ctfc, ctf_dvdef_ref var)
 {
-  dw2_asm_output_data (4, var->dvd_name_offset, "btv_name");
+  ctf_id_t ref_id = get_btf_id (var->dvd_type);
+  dw2_asm_output_data (4, var->dvd_name_offset, "TYPE %u BTF_KIND_VAR '%s'",
+		       (*(btf_var_ids->get (var)) + num_types_added + 1),
+		       var->dvd_name);
   dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_VAR, 0, 0), "btv_info");
-  dw2_asm_output_data (4, get_btf_id (var->dvd_type), "btv_type");
+  btf_asm_type_ref ("btv_type", ctfc, ref_id);
   dw2_asm_output_data (4, var->dvd_visibility, "btv_linkage");
 }
 
@@ -739,7 +859,7 @@  btf_asm_varent (ctf_dvdef_ref var)
    BTF_KIND_UNION.  */
 
 static void
-btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
+btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd, unsigned int idx)
 {
   ctf_dtdef_ref ref_type = ctfc->ctfc_types_list[dmd->dmd_type];
 
@@ -762,15 +882,19 @@  btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd)
       sou_offset &= 0x00ffffff;
       sou_offset |= ((bits & 0xff) << 24);
 
+      dw2_asm_output_data (4, dmd->dmd_name_offset,
+			   "MEMBER '%s' idx=%u",
+			   dmd->dmd_name, idx);
       /* Refer to the base type of the slice.  */
-      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
-      dw2_asm_output_data (4, get_btf_id (base_type), "btm_type");
+      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (base_type));
       dw2_asm_output_data (4, sou_offset, "btm_offset");
     }
   else
     {
-      dw2_asm_output_data (4, dmd->dmd_name_offset, "btm_name_off");
-      dw2_asm_output_data (4, get_btf_id (dmd->dmd_type), "btm_type");
+      dw2_asm_output_data (4, dmd->dmd_name_offset,
+			   "MEMBER '%s' idx=%u",
+			   dmd->dmd_name, idx);
+      btf_asm_type_ref ("btm_type", ctfc, get_btf_id (dmd->dmd_type));
       dw2_asm_output_data (4, dmd->dmd_offset, "btm_offset");
     }
 }
@@ -793,7 +917,8 @@  btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd)
 /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO.  */
 
 static void
-btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
+btf_asm_func_arg (ctf_container_ref ctfc, ctf_func_arg_t * farg,
+		  size_t stroffset)
 {
   /* If the function arg does not have a name, refer to the null string at
      the start of the string table. This ensures correct encoding for varargs
@@ -803,31 +928,33 @@  btf_asm_func_arg (ctf_func_arg_t * farg, size_t stroffset)
   else
     dw2_asm_output_data (4, 0, "farg_name");
 
-  dw2_asm_output_data (4, (btf_removed_type_p (farg->farg_type)
-			   ? BTF_VOID_TYPEID
-			   : get_btf_id (farg->farg_type)),
-		       "farg_type");
+  btf_asm_type_ref ("farg_type", ctfc, (btf_removed_type_p (farg->farg_type)
+					? BTF_VOID_TYPEID
+					: get_btf_id (farg->farg_type)));
 }
 
 /* Asm'out a BTF_KIND_FUNC type.  */
 
 static void
-btf_asm_func_type (ctf_dtdef_ref dtd)
+btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, size_t i)
 {
-  dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
-  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0,
-                                         dtd->linkage),
-                       "btt_info: kind=%u, kflag=%u, linkage=%u",
-                       BTF_KIND_FUNC, 0, dtd->linkage);
-  dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
+  ctf_id_t ref_id = dtd->dtd_data.ctti_type;
+  dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
+		       "TYPE %lu BTF_KIND_FUNC '%s'",
+		       num_types_added + num_vars_added + 1 + i,
+		       dtd->dtd_name);
+  dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
+		       "btt_info: kind=%u, kflag=%u, linkage=%u",
+		       BTF_KIND_FUNC, 0, dtd->linkage);
+  btf_asm_type_ref ("btt_type", ctfc, get_btf_id (ref_id));
 }
 
 /* Asm'out a variable entry following a BTF_KIND_DATASEC.  */
 
 static void
-btf_asm_datasec_entry (struct btf_var_secinfo info)
+btf_asm_datasec_entry (ctf_container_ref ctfc, struct btf_var_secinfo info)
 {
-  dw2_asm_output_data (4, info.type, "bts_type");
+  btf_asm_type_ref ("bts_type", ctfc, info.type);
   dw2_asm_output_data (4, info.offset, "bts_offset");
   dw2_asm_output_data (4, info.size, "bts_size");
 }
@@ -835,9 +962,12 @@  btf_asm_datasec_entry (struct btf_var_secinfo info)
 /* Asm'out a whole BTF_KIND_DATASEC, including its variable entries.  */
 
 static void
-btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
+btf_asm_datasec_type (ctf_container_ref ctfc, btf_datasec_t ds, ctf_id_t id,
+		      size_t stroffset)
 {
-  dw2_asm_output_data (4, ds.name_offset + stroffset, "btt_name");
+  dw2_asm_output_data (4, ds.name_offset + stroffset,
+		       "TYPE %lu BTF_KIND_DATASEC '%s'",
+		       btf_absolute_datasec_id (id), ds.name);
   dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_DATASEC, 0,
 					 ds.entries.length ()),
 		       "btt_info");
@@ -845,7 +975,7 @@  btf_asm_datasec_type (btf_datasec_t ds, size_t stroffset)
      loaders such as libbpf.  */
   dw2_asm_output_data (4, 0, "btt_size");
   for (size_t i = 0; i < ds.entries.length (); i++)
-    btf_asm_datasec_entry (ds.entries[i]);
+    btf_asm_datasec_entry (ctfc, ds.entries[i]);
 }
 
 /* Compute and output the header information for a .BTF section.  */
@@ -906,7 +1036,7 @@  output_btf_vars (ctf_container_ref ctfc)
   if (num_ctf_vars)
     {
       for (i = 0; i < num_ctf_vars; i++)
-	btf_asm_varent (ctfc->ctfc_vars_list[i]);
+	btf_asm_varent (ctfc, ctfc->ctfc_vars_list[i]);
     }
 }
 
@@ -940,9 +1070,13 @@  output_asm_btf_sou_fields (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
 {
   ctf_dmdef_t * dmd;
 
+  unsigned idx = 0;
   for (dmd = dtd->dtd_u.dtu_members;
        dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd))
-      btf_asm_sou_member (ctfc, dmd);
+    {
+      btf_asm_sou_member (ctfc, dmd, idx);
+      idx++;
+    }
 }
 
 /* Output all enumerator constants following a BTF_KIND_ENUM{,64}.  */
@@ -968,7 +1102,7 @@  output_asm_btf_func_args_list (ctf_container_ref ctfc,
   ctf_func_arg_t * farg;
   for (farg = dtd->dtd_u.dtu_argv;
        farg != NULL; farg = (ctf_func_arg_t *) ctf_farg_list_next (farg))
-    btf_asm_func_arg (farg, farg_name_offset);
+    btf_asm_func_arg (ctfc, farg, farg_name_offset);
 }
 
 /* Output the variable portion of a BTF type record. The information depends
@@ -1004,7 +1138,7 @@  output_asm_btf_vlen_bytes (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
       break;
 
     case BTF_KIND_ARRAY:
-      btf_asm_array (dtd);
+      btf_asm_array (ctfc, dtd->dtd_u.dtu_arr);
       break;
 
     case BTF_KIND_STRUCT:
@@ -1068,10 +1202,10 @@  output_btf_types (ctf_container_ref ctfc)
 /* Output all BTF_KIND_FUNC type records.  */
 
 static void
-output_btf_func_types (void)
+output_btf_func_types (ctf_container_ref ctfc)
 {
   for (size_t i = 0; i < vec_safe_length (funcs); i++)
-    btf_asm_func_type ((*funcs)[i]);
+    btf_asm_func_type (ctfc, (*funcs)[i], i);
 }
 
 /* Output all BTF_KIND_DATASEC records.  */
@@ -1082,7 +1216,7 @@  output_btf_datasec_types (ctf_container_ref ctfc)
   size_t name_offset = ctfc_get_strtab_len (ctfc, CTF_STRTAB);
 
   for (size_t i = 0; i < datasecs.length(); i++)
-    btf_asm_datasec_type (datasecs[i], name_offset);
+    btf_asm_datasec_type (ctfc, datasecs[i], i, name_offset);
 }
 
 /* Postprocess the CTF debug data post initialization.
@@ -1209,7 +1343,7 @@  btf_output (const char * filename)
   output_btf_header (tu_ctfc);
   output_btf_types (tu_ctfc);
   output_btf_vars (tu_ctfc);
-  output_btf_func_types ();
+  output_btf_func_types (tu_ctfc);
   output_btf_datasec_types (tu_ctfc);
   output_btf_strs (tu_ctfc);
 }
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
index 89a5701bba0..05996fe195a 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-struct-1.c
@@ -11,10 +11,11 @@ 
 /* { dg-options "-O0 -gbtf -dA" } */
 
 /* Struct type with 2 members (struct foo).  */
+/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT 'foo'" 1 } } */
 /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
 /* Struct type with 1 member (anon struct).  */
+/* { dg-final { scan-assembler-times " BTF_KIND_STRUCT ''" 1 } } */
 /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
 
 struct foo
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
index f3b120bb458..49cdc87cf59 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-anonymous-union-1.c
@@ -9,9 +9,9 @@ 
 
 /* Struct type with 1 member.  */
 /* { dg-final { scan-assembler-times "\[\t \]0x4000001\[\t \]+\[^\n\]*btt_info" 1 } } */
-/* Union type with 2 members.  */
+/* Anonymous union type with 2 members.  */
 /* { dg-final { scan-assembler-times "\[\t \]0x5000002\[\t \]+\[^\n\]*btt_info" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*btt_name" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_UNION ''" 1 } } */
 
 struct foo
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
index ab55445bd35..967b1e8746a 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-array-1.c
@@ -18,6 +18,9 @@ 
 /* { dg-final { scan-assembler-times "\[\t \]0x5\[\t \]+\[^\n\]*bta_nelems" 1 } } */
 /* { dg-final { scan-assembler-times "\[\t \]0\[\t \]+\[^\n\]*bta_nelems" 1 } } */
 
+/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_INT 'int'\\)" 4 } } */
+/* { dg-final { scan-assembler-times " bta_elem_type: \\(BTF_KIND_ARRAY ''\\)" 1 } } */
+
 int b1[2] = {0,1};
 int c1[5] = {0,1,2,3,4};
 int a1[2][3] = { {3,4,5}, {2,3,4} };
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
index 9665ab67145..03c323a6d49 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
@@ -16,7 +16,7 @@ 
 /* { dg-final { scan-assembler-times "\[\t \]0x20000020\[\t \]+\[^\n\]*btm_offset" 1 } } */
 
 /* Only 2 members.  */
-/* { dg-final { scan-assembler-times "btm_name" 2 } } */
+/* { dg-final { scan-assembler-times "MEMBER" 2 } } */
 
 struct foo
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
index 2984a3357eb..78b8b7d49ad 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-3.c
@@ -22,7 +22,7 @@ 
 /* { dg-final { scan-assembler-times "\[\t \]0x84000001\[\t \]+\[^\n\]*btt_info" 1 } } */
 
 /* Bitfield "f" points to type ID 1.  */
-/* { dg-final { scan-assembler-times "\[\t \]0x1\[\t \]+\[^\n\]*btm_type" 1 } } */
+/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ENUM 'foo'" 1 } } */
 
 enum foo
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
index 884d25cfbda..7ca0890884e 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-3.c
@@ -1,6 +1,6 @@ 
 /* Test BTF generation for a function with an unrepresentable parameter.
 
-   BTF has no encoding for floating point types, among others. Function
+   BTF has no encoding for vector types, among others. Function
    parameters of unrepresentable types are emitted as 'void' types.
 
    We expect one BTF_KIND_FUNC_PROTO with 3 parameters, one of which
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
index 48a946ab14b..e014d9990a9 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
@@ -6,8 +6,8 @@ 
 /* { dg-do compile } */
 /* { dg-options "-O0 -gbtf -dA" } */
 
-/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=2" 1 } } */
-/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'extfunc'" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'foo'" 1 } } */
 
 extern int extfunc(int a, int b);
 
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
index a14ac0f89b2..f80d8089877 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pointers-1.c
@@ -9,6 +9,9 @@ 
 /* { dg-options "-O0 -gbtf -dA" } */
 
 /* { dg-final { scan-assembler-times "\[\t \]0x2000000\[\t \]+\[^\n\]*btt_info" 2 } } */
+/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT 'int'"}} */
+/* { dg-final { scan-assembeler-times " BTF_KIND_PTR ''\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'"}} */
+
 /* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 /* { dg-final { scan-assembler-times "ascii \"st.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
index bc3281437c9..79156cd7bcf 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-1.c
@@ -9,7 +9,9 @@ 
 
 /* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
 /* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
-/* { dg-final { scan-assembler-times "btm_name" 5 } } */
+/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_INT" 3 } } */
+/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_ARRAY" 1 } } */
+/* { dg-final { scan-assembler-times " btm_type: \\(BTF_KIND_STRUCT" 1 } } */
 
 struct foo
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
index c3aff09ed9a..e9ff06883db 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
@@ -1,7 +1,7 @@ 
 /* Test BTF generation for struct type with a member which refers to an
    unsupported type.
 
-   BTF does not support floating point types (among other things). When
+   BTF does not support vector types (among other things). When
    generating BTF for a struct (or union) type, members which refer to
    unsupported types should be skipped.  */
 
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
index 472cc63f600..36bbb292f5c 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-typedef-1.c
@@ -41,13 +41,13 @@ 
 /* { dg-final { scan-assembler-times "ascii \"node_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 /* { dg-final { scan-assembler-times "ascii \"arena_t.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 
-/* { dg-final { scan-assembler-times "\[\t \]0x2\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0x3\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0x4\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0x6\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0x8\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0xb\[\t \]+\[^\n\]*btv_type" 1 } } */
-/* { dg-final { scan-assembler-times "\[\t \]0xf\[\t \]+\[^\n\]*btv_type" 1 } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'a'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'my_int'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'b'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'foo_int'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'c'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'bar_int'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'd'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'node_t'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'destination'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBAR'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'ticket'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'CBARP'" } } */
+/* { dg-final { scan-assembler "BTF_KIND_VAR 'suitcase'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_TYPEDEF 'arena_t'" } } */
 
 typedef int my_int;
 typedef int foo_int;
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
index d66843717b3..e3a19028843 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-union-1.c
@@ -5,7 +5,7 @@ 
 
 /* One union type with 4 members */
 /* { dg-final { scan-assembler-times "\[\t \]0x5000004\[\t \]+\[^\n\]*btt_info" 1 } } */
-/* { dg-final { scan-assembler-times "btm_name" 4 } } */
+/* { dg-final { scan-assembler-times "MEMBER" 4 } } */
 
 union onion
 {
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
index a79ed1d53b7..42503df396f 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-1.c
@@ -5,6 +5,12 @@ 
 
 /* We expect 6 variables */
 /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 6 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'x1'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_INT" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'bar'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_UNION" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'lala'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ENUM" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'arr'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_ARRAY" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'plong'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_PTR" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'st_inst'\[\\r\\n\]+\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_STRUCT 'st'" 1 } } */
 
 unsigned int x1;
 
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
index db0bdd7be16..5f0c0b6e02d 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-variables-2.c
@@ -1,7 +1,7 @@ 
 /* BTF generation for variables with removed type.
 
-   BTF does not support floating point types, so no representation for the type
-   'float' will be emitted. In this test, we check to also ensure that the
+   BTF does not support vector types, so no representation for the type
+   of 'bar' will be emitted. In this test, we check to also ensure that the
    variable 'bar' is not emitted, as it references a type that is not supported
    in BTF.  */
 
@@ -11,6 +11,9 @@ 
 /* We expect only 3 variables.  */
 /* { dg-final { scan-assembler-times "\[\t \]0xe000000\[\t \]+\[^\n\]*btv_info" 3 } } */
 
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'foo'" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'baz'" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_VAR 'myst'" 1 } } */
 /* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 /* { dg-final { scan-assembler-times "ascii \"baz.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */
 /* { dg-final { scan-assembler-times "ascii \"myst.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */