Message ID | 20230530182702.8020-2-david.faust@oracle.com |
---|---|
State | New |
Headers | show |
Series | [1/2] btf: be clear when record size/type is not used | expand |
On 5/30/23 11:27, David Faust wrote: > [Changes from v1: > - Fix typos. > - Split unrelated change into separate commit. > - Improve asm comment for enum constants, update btf-enum-1 test. > - Improve asm comment for DATASEC records, update btf-datasec-2 test.] > > 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. > > Re-tested on BPF and x86_64, no known regressions. > Thanks. > LGTM. 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_enum_const): Likewise. > (btf_asm_sou_member): Likewise. > (output_btf_vars): Update btf_asm_* call accordingly. > (output_asm_btf_sou_fields): Likewise. > (output_asm_btf_enum_list): 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-datasec-2.c: Likewise. > * gcc.dg/debug/btf/btf-enum-1.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 | 227 ++++++++++++++---- > .../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-datasec-2.c | 4 +- > gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c | 4 + > .../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 +- > 17 files changed, 224 insertions(+), 69 deletions(-) > > diff --git a/gcc/btfout.cc b/gcc/btfout.cc > index ae9855716eb..f51ccf73242 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 types after the fact, things like VAR 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); > @@ -715,29 +827,31 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd) > 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"); > } > > @@ -745,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]; > > @@ -768,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"); > } > } > @@ -784,9 +902,10 @@ btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd) > /* Asm'out an enum constant following a BTF_KIND_ENUM{,64}. */ > > static void > -btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd) > +btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd, unsigned int idx) > { > - dw2_asm_output_data (4, dmd->dmd_name_offset, "bte_name"); > + dw2_asm_output_data (4, dmd->dmd_name_offset, "ENUM_CONST '%s' idx=%u", > + dmd->dmd_name, idx); > if (size == 4) > dw2_asm_output_data (size, dmd->dmd_value, "bte_value"); > else > @@ -799,7 +918,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 > @@ -809,31 +929,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"); > } > @@ -841,17 +963,20 @@ 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"); > + "btt_info: n_entries=%u", ds.entries.length ()); > /* Note: the "total section size in bytes" is emitted as 0 and patched by > 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. */ > @@ -912,7 +1037,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]); > } > } > > @@ -946,9 +1071,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}. */ > @@ -959,9 +1088,13 @@ output_asm_btf_enum_list (ctf_container_ref ARG_UNUSED (ctfc), > { > 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_enum_const (dtd->dtd_data.ctti_size, dmd); > + { > + btf_asm_enum_const (dtd->dtd_data.ctti_size, dmd, idx); > + idx++; > + } > } > > /* Output all function arguments following a BTF_KIND_FUNC_PROTO. */ > @@ -974,7 +1107,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 > @@ -1010,7 +1143,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: > @@ -1074,10 +1207,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. */ > @@ -1088,7 +1221,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. > @@ -1215,7 +1348,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-datasec-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c > index f4b298cf019..d6f3358d6fb 100644 > --- a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c > +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c > @@ -6,8 +6,8 @@ > /* { dg-options "-O0 -gbtf -dA" } */ > > /* Expect one DATASEC with vlen=1 (.foo_sec) and one with vlen=2 (.bar_sec) */ > -/* { dg-final { scan-assembler-times "0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */ > -/* { dg-final { scan-assembler-times "0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */ > +/* { dg-final { scan-assembler-times " BTF_KIND_DATASEC '.foo_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */ > +/* { dg-final { scan-assembler-times " BTF_KIND_DATASEC '.bar_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */ > > /* Function entries should have offset and size of 0 at compile time. */ > /* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 3 } } */ > diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c > index 2887cb1c5f2..021ce0345e4 100644 > --- a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c > +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c > @@ -5,6 +5,10 @@ > > /* { dg-final { scan-assembler-times "\[\t \]0x6000004\[\t \]+\[^\n\]*btt_info" 1 } } */ > /* { dg-final { scan-assembler-times "\[\t \]0x86000003\[\t \]+\[^\n\]*btt_info" 1 } } */ > +/* { dg-final { scan-assembler-times " ENUM_CONST 'QAD' idx=0" 1 } } */ > +/* { dg-final { scan-assembler-times " ENUM_CONST 'QED' idx=1" 1 } } */ > +/* { dg-final { scan-assembler-times " ENUM_CONST 'QOD' idx=2" 1 } } */ > +/* { dg-final { scan-assembler-times " ENUM_CONST 'QUD' idx=3" 1 } } */ > /* { dg-final { scan-assembler-times "ascii \"QAD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ > /* { dg-final { scan-assembler-times "ascii \"QED.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ > /* { dg-final { scan-assembler-times "ascii \"QOD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ > 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 } } */
Hi David, > On 31 May 2023, at 07:13, Indu Bhagat via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On 5/30/23 11:27, David Faust wrote: >> [Changes from v1: >> - Fix typos. >> - Split unrelated change into separate commit. >> - Improve asm comment for enum constants, update btf-enum-1 test. >> - Improve asm comment for DATASEC records, update btf-datasec-2 test.] >> 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. >> Re-tested on BPF and x86_64, no known regressions. >> Thanks. > > LGTM. This seems to break bootstrap on x86_64 darwin with two instances of : gcc/btfout.cc:802:32: error: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘ctf_id_t’ {aka ‘long long unsigned int’} [-Werror=format=] 802 | "TYPE %lu BTF_KIND_%s '%s’" And another on line 970. could you suggest where the change should be? thanks Iain
Hi Iain, On 02/06/2023 09:32, Iain Sandoe wrote: > Hi David, > > > On 31 May 2023, at 07:13, Indu Bhagat via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > > > On 5/30/23 11:27, David Faust wrote: > >> [Changes from v1: > >> - Fix typos. > >> - Split unrelated change into separate commit. > >> - Improve asm comment for enum constants, update btf-enum-1 test. > >> - Improve asm comment for DATASEC records, update btf-datasec-2 test.] > >> 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. > >> Re-tested on BPF and x86_64, no known regressions. > >> Thanks. > > > > LGTM. > > This seems to break bootstrap on x86_64 darwin with two instances of : > > gcc/btfout.cc:802:32: error: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘ctf_id_t’ {aka ‘long long unsigned int’} [-Werror=format=] > 802 | "TYPE %lu BTF_KIND_%s '%s’" > > And another on line 970. > > could you suggest where the change should be? I've pushed a fix for this: https://gcc.gnu.org/pipermail/gcc-patches/2023-June/620515.html as g:f2e60a00c7c017bd87ba9afb189cbb77d8c92925. Thanks, Alex > thanks > Iain >
diff --git a/gcc/btfout.cc b/gcc/btfout.cc index ae9855716eb..f51ccf73242 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 types after the fact, things like VAR 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); @@ -715,29 +827,31 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd) 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"); } @@ -745,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]; @@ -768,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"); } } @@ -784,9 +902,10 @@ btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd) /* Asm'out an enum constant following a BTF_KIND_ENUM{,64}. */ static void -btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd) +btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd, unsigned int idx) { - dw2_asm_output_data (4, dmd->dmd_name_offset, "bte_name"); + dw2_asm_output_data (4, dmd->dmd_name_offset, "ENUM_CONST '%s' idx=%u", + dmd->dmd_name, idx); if (size == 4) dw2_asm_output_data (size, dmd->dmd_value, "bte_value"); else @@ -799,7 +918,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 @@ -809,31 +929,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"); } @@ -841,17 +963,20 @@ 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"); + "btt_info: n_entries=%u", ds.entries.length ()); /* Note: the "total section size in bytes" is emitted as 0 and patched by 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. */ @@ -912,7 +1037,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]); } } @@ -946,9 +1071,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}. */ @@ -959,9 +1088,13 @@ output_asm_btf_enum_list (ctf_container_ref ARG_UNUSED (ctfc), { 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_enum_const (dtd->dtd_data.ctti_size, dmd); + { + btf_asm_enum_const (dtd->dtd_data.ctti_size, dmd, idx); + idx++; + } } /* Output all function arguments following a BTF_KIND_FUNC_PROTO. */ @@ -974,7 +1107,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 @@ -1010,7 +1143,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: @@ -1074,10 +1207,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. */ @@ -1088,7 +1221,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. @@ -1215,7 +1348,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-datasec-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c index f4b298cf019..d6f3358d6fb 100644 --- a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c @@ -6,8 +6,8 @@ /* { dg-options "-O0 -gbtf -dA" } */ /* Expect one DATASEC with vlen=1 (.foo_sec) and one with vlen=2 (.bar_sec) */ -/* { dg-final { scan-assembler-times "0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */ -/* { dg-final { scan-assembler-times "0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */ +/* { dg-final { scan-assembler-times " BTF_KIND_DATASEC '.foo_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */ +/* { dg-final { scan-assembler-times " BTF_KIND_DATASEC '.bar_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */ /* Function entries should have offset and size of 0 at compile time. */ /* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 3 } } */ diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c index 2887cb1c5f2..021ce0345e4 100644 --- a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c @@ -5,6 +5,10 @@ /* { dg-final { scan-assembler-times "\[\t \]0x6000004\[\t \]+\[^\n\]*btt_info" 1 } } */ /* { dg-final { scan-assembler-times "\[\t \]0x86000003\[\t \]+\[^\n\]*btt_info" 1 } } */ +/* { dg-final { scan-assembler-times " ENUM_CONST 'QAD' idx=0" 1 } } */ +/* { dg-final { scan-assembler-times " ENUM_CONST 'QED' idx=1" 1 } } */ +/* { dg-final { scan-assembler-times " ENUM_CONST 'QOD' idx=2" 1 } } */ +/* { dg-final { scan-assembler-times " ENUM_CONST 'QUD' idx=3" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QAD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QED.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QOD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ 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 } } */