Em Tue, Dec 07, 2021 at 05:31:49PM +0000, Douglas RAILLARD escreveu: > From: Douglas Raillard <douglas.raillard@xxxxxxx> > > Add the prefix specified by --expanded_prefix to type names that have > not been specificaly requested using -C. This allows manual namespacing > so that these inner types will not conflict with existing headers. > > Signed-off-by: Douglas Raillard <douglas.raillard@xxxxxxx> > --- > dwarves.h | 1 + > pahole.c | 29 +++++++++++++++++++++++++++-- > 2 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/dwarves.h b/dwarves.h > index fc5b3fa..0967e5c 100644 > --- a/dwarves.h > +++ b/dwarves.h > @@ -90,6 +90,7 @@ struct conf_load { > */ > struct conf_fprintf { > const char *prefix; > + const char *name_prefix; > const char *suffix; > int32_t type_spacing; > int32_t name_spacing; > diff --git a/pahole.c b/pahole.c > index 42ba110..e0a1438 100644 > --- a/pahole.c > +++ b/pahole.c > @@ -2882,6 +2882,33 @@ out_btf: > > bool include_decls = find_pointers_in_structs != 0 || stats_formatter == nr_methods_formatter; > struct prototype *prototype, *n; > + static type_id_t class_id; > + > + uint32_t id; > + struct tag *pos; > + bool skip; > + const char *prefix = conf_load->conf_fprintf->name_prefix; > + const size_t prefix_len = prefix ? strlen(prefix) : 0; > + cu__for_each_type(cu, id, pos) { > + if (tag__is_type(pos)) { > + const char *name = type__name(tag__type(pos)); > + if (name && prefix) { > + skip = false; > + list_for_each_entry_safe(prototype, n, &class_names, node) { > + if (!strcmp(prototype->name, name)) { > + skip = true; > + break; > + } > + } > + if (!skip) { > + const size_t len = 1024 + prefix_len; > + char *bf = malloc(len); > + snprintf(bf, len, "%s%s", prefix, name); > + tag__namespace(pos)->name = bf; > + } > + } > + } > + } I don't like this change in place mode, but I understand it is easier to do it here instead of in all types fprintf routines, but perhaps its better that way, I'll check how big it would be. > > list_for_each_entry_safe(prototype, n, &class_names, node) { > > @@ -2891,8 +2918,6 @@ out_btf: > prototype->type_enum_resolved = type__find_type_enum(tag__type(prototype->class), cu, prototype->type_enum) == 0; > continue; > } > - > - static type_id_t class_id; > struct tag *class = cu__find_type_by_name(cu, prototype->name, include_decls, &class_id); > > // couldn't find that class name in this CU, continue to the next one. > -- > 2.25.1 -- - Arnaldo