Skip to content

Commit

Permalink
kconfig: link menus to a symbol
Browse files Browse the repository at this point in the history
Currently, there is no direct link from (struct symbol) to (struct menu).

It is still possible to access associated menus through the P_SYMBOL
property, because property::menu is the relevant menu entry, but it
results in complex code, as seen in get_symbol_str().

Use a linked list for simpler traversal of relevant menus.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
  • Loading branch information
Masahiro Yamada committed Mar 9, 2024
1 parent 50a3399 commit e049221
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
5 changes: 5 additions & 0 deletions scripts/kconfig/expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ struct symbol {
*/
tristate visible;

/* config entries associated with this symbol */
struct list_head menus;

/* SYMBOL_* flags */
int flags;

Expand Down Expand Up @@ -222,6 +225,8 @@ struct menu {
*/
struct symbol *sym;

struct list_head link; /* link to symbol::menus */

/*
* The prompt associated with the node. This holds the prompt for a
* symbol as well as the text for a menu or comment, along with the
Expand Down
4 changes: 3 additions & 1 deletion scripts/kconfig/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,10 @@ void menu_add_entry(struct symbol *sym)
*last_entry_ptr = menu;
last_entry_ptr = &menu->next;
current_entry = menu;
if (sym)
if (sym) {
menu_add_symbol(P_SYMBOL, sym, NULL);
list_add_tail(&menu->link, &sym->menus);
}
}

struct menu *menu_add_menu(void)
Expand Down
4 changes: 4 additions & 0 deletions scripts/kconfig/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,21 @@
struct symbol symbol_yes = {
.name = "y",
.curr = { "y", yes },
.menus = LIST_HEAD_INIT(symbol_yes.menus),
.flags = SYMBOL_CONST|SYMBOL_VALID,
};

struct symbol symbol_mod = {
.name = "m",
.curr = { "m", mod },
.menus = LIST_HEAD_INIT(symbol_mod.menus),
.flags = SYMBOL_CONST|SYMBOL_VALID,
};

struct symbol symbol_no = {
.name = "n",
.curr = { "n", no },
.menus = LIST_HEAD_INIT(symbol_no.menus),
.flags = SYMBOL_CONST|SYMBOL_VALID,
};

Expand Down Expand Up @@ -838,6 +841,7 @@ struct symbol *sym_lookup(const char *name, int flags)
symbol->name = new_name;
symbol->type = S_UNKNOWN;
symbol->flags = flags;
INIT_LIST_HEAD(&symbol->menus);

hash_add(sym_hashtable, &symbol->node, hash);

Expand Down

0 comments on commit e049221

Please sign in to comment.