On Fri, Dec 13, 2024 at 10:36:53PM +0000, Ihor Solodrai wrote: SNIP > + btf_encoders__for_each_encoder(e) { > + list_for_each_entry(s, &e->func_states, node) > + nr_saved_fns++; > + } > + > + if (nr_saved_fns == 0) > + return 0; > + > + saved_fns = calloc(nr_saved_fns, sizeof(*saved_fns)); > + btf_encoders__for_each_encoder(e) { > + list_for_each_entry(s, &e->func_states, node) > + saved_fns[i++] = s; > + } > + qsort(saved_fns, nr_saved_fns, sizeof(*saved_fns), saved_functions_cmp); > + > + for (i = 0; i < nr_saved_fns; i = j) { > + struct btf_encoder_func_state *state = saved_fns[i]; > + > + /* Compare across sorted functions that match by name/prefix; > + * share inconsistent/unexpected reg state between them. > + */ > + j = i + 1; > + > + while (j < nr_saved_fns && saved_functions_combine(saved_fns[i], saved_fns[j]) == 0) > + j++; > + > + /* do not exclude functions with optimized-out parameters; they > + * may still be _called_ with the right parameter values, they > + * just do not _use_ them. Only exclude functions with > + * unexpected register use or multiple inconsistent prototypes. > + */ > + if (!encoder->skip_encoding_inconsistent_proto || > + (!state->unexpected_reg && !state->inconsistent_proto)) { > + if (btf_encoder__add_func(state->encoder, state)) { > + free(saved_fns); > + return -1; > + } > + } > + } > + /* Now that we are done with function states, free them. */ > + free(saved_fns); > + btf_encoders__for_each_encoder(e) > + btf_encoder__delete_saved_funcs(e); nit, wrong indent jirka > + return 0; > +} > + > static int btf_encoder__collect_function(struct btf_encoder *encoder, GElf_Sym *sym) SNIP