On 8/7/19 12:59 PM, Andrii Nakryiko wrote: > 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? Hmm. Take a const into the helper and drop it there? I'd like to avoid all these 'void *'.