On Wed, Aug 7, 2019 at 12:30 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > On Tue, Aug 06, 2019 at 10:37:54PM -0700, Andrii Nakryiko wrote: > > Simplify code by relying on newly added BTF helper functions. > > > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > .. > > > > - for (i = 0, vsi = (struct btf_var_secinfo *)(t + 1); > > - i < vars; i++, vsi++) { > > + for (i = 0, vsi = (void *)btf_var_secinfos(t); i < vars; i++, vsi++) { > > > + struct btf_member *m = (void *)btf_members(t); > ... > > case BTF_KIND_ENUM: { > > - struct btf_enum *m = (struct btf_enum *)(t + 1); > > - __u16 vlen = BTF_INFO_VLEN(t->info); > > + struct btf_enum *m = (void *)btf_enum(t); > > + __u16 vlen = btf_vlen(t); > ... > > case BTF_KIND_FUNC_PROTO: { > > - struct btf_param *m = (struct btf_param *)(t + 1); > > - __u16 vlen = BTF_INFO_VLEN(t->info); > > + struct btf_param *m = (void *)btf_params(t); > > + __u16 vlen = btf_vlen(t); > > So all of these 'void *' type hacks are only to drop const-ness ? Yes. > May be the helpers shouldn't be taking const then? > Probably not, because then we'll have much wider-spread problem of casting const pointers into non-const when passing btf_type into helpers. I think const as a default is the right choice, because normally BTF is immutable and btf__type_by_id is returning const pointer, etc. That's typical and expected use-case. btf_dedup and BTF sanitization + datasec size setting pieces are an exception that have to modify BTF types in place before passing it to user. So realistically I think we can just leave it as (void *), or I can do explicit non-const type casts, or we can just not use helpers for mutable cases. Do you have a preference?