2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

kconfig: add a function to dump all menu entries in a tree-like format

This is useful for debugging purposes. menu_finalize() re-parents menu
entries, and this function can be used to dump the final structure of
the menu tree.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
Masahiro Yamada 2025-06-30 03:48:31 +09:00
parent 65056488e8
commit 263e70bc42
2 changed files with 75 additions and 0 deletions

View File

@ -102,6 +102,7 @@ struct menu *menu_get_menu_or_parent_menu(struct menu *menu);
int get_jump_key_char(void); int get_jump_key_char(void);
struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
void menu_get_ext_help(struct menu *menu, struct gstr *help); void menu_get_ext_help(struct menu *menu, struct gstr *help);
void menu_dump(void);
/* symbol.c */ /* symbol.c */
void sym_clear_all_valid(void); void sym_clear_all_valid(void);

View File

@ -788,3 +788,77 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help)
if (sym) if (sym)
get_symbol_str(help, sym, NULL); get_symbol_str(help, sym, NULL);
} }
/**
* menu_dump - dump all menu entries in a tree-like format
*/
void menu_dump(void)
{
struct menu *menu = &rootmenu;
unsigned long long bits = 0;
int indent = 0;
while (menu) {
for (int i = indent - 1; i >= 0; i--) {
if (bits & (1ULL << i)) {
if (i > 0)
printf("| ");
else
printf("|-- ");
} else {
if (i > 0)
printf(" ");
else
printf("`-- ");
}
}
switch (menu->type) {
case M_CHOICE:
printf("choice \"%s\"\n", menu->prompt->text);
break;
case M_COMMENT:
printf("comment \"%s\"\n", menu->prompt->text);
break;
case M_IF:
printf("if\n");
break;
case M_MENU:
printf("menu \"%s\"", menu->prompt->text);
if (!menu->sym) {
printf("\n");
break;
}
printf(" + ");
/* fallthrough */
case M_NORMAL:
printf("symbol %s\n", menu->sym->name);
break;
}
if (menu->list) {
bits <<= 1;
menu = menu->list;
if (menu->next)
bits |= 1;
else
bits &= ~1;
indent++;
continue;
}
while (menu && !menu->next) {
menu = menu->parent;
bits >>= 1;
indent--;
}
if (menu) {
menu = menu->next;
if (menu->next)
bits |= 1;
else
bits &= ~1;
}
}
}