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 <[email protected]>
---
scripts/kconfig/expr.h | 5 +++++
scripts/kconfig/menu.c | 4 +++-
scripts/kconfig/symbol.c | 4 ++++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index 3bc375f1a1cd..0158f5eac454 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -108,6 +108,9 @@ struct symbol {
*/
tristate visible;
+ /* config entries associated with this symbol */
+ struct list_head menus;
+
/* SYMBOL_* flags */
int flags;
@@ -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
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index 44465945d6b1..571394ed71e0 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -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)
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index dd5cf9727a9a..81fe1884ef8a 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -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,
};
@@ -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);
--
2.40.1
Commit 5a1aa8a1aff6 ("kconfig: add named choice group") did not provide
enough explanation. A use case was found in another project [1], but
this has never been used in the kernel.
[1]: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Masahiro Yamada <[email protected]>
---
Documentation/kbuild/kconfig-language.rst | 6 +-----
scripts/kconfig/parser.y | 10 +++-------
2 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/Documentation/kbuild/kconfig-language.rst b/Documentation/kbuild/kconfig-language.rst
index 0135905c0aa3..79ac2e8184f6 100644
--- a/Documentation/kbuild/kconfig-language.rst
+++ b/Documentation/kbuild/kconfig-language.rst
@@ -393,7 +393,7 @@ of C0, which doesn't depend on M::
choices::
- "choice" [symbol]
+ "choice"
<choice options>
<choice block>
"endchoice"
@@ -412,10 +412,6 @@ the kernel, but all drivers can be compiled as modules.
A choice accepts another option "optional", which allows to set the
choice to 'n' and no entry needs to be selected.
-If no [symbol] is associated with a choice, then you can not have multiple
-definitions of that choice. If a [symbol] is associated to the choice,
-then you may define the same choice (i.e. with the same entries) in another
-place.
comment::
diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y
index b505e43e0d02..22f616334585 100644
--- a/scripts/kconfig/parser.y
+++ b/scripts/kconfig/parser.y
@@ -94,7 +94,7 @@ struct menu *current_menu, *current_entry;
%type <expr> if_expr
%type <string> end
%type <menu> if_entry menu_entry choice_entry
-%type <string> word_opt assign_val
+%type <string> assign_val
%type <flavor> assign_op
%destructor {
@@ -222,13 +222,12 @@ config_option: T_MODULES T_EOL
/* choice entry */
-choice: T_CHOICE word_opt T_EOL
+choice: T_CHOICE T_EOL
{
- struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
+ struct symbol *sym = sym_lookup(NULL, SYMBOL_CHOICE);
sym->flags |= SYMBOL_NO_WRITE;
menu_add_entry(sym);
menu_add_expr(P_CHOICE, NULL, NULL);
- free($2);
printd(DEBUG_PARSE, "%s:%d:choice\n", cur_filename, cur_lineno);
};
@@ -449,9 +448,6 @@ symbol: nonconst_symbol
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
;
-word_opt: /* empty */ { $$ = NULL; }
- | T_WORD
-
/* assignment statement */
assignment_stmt: T_WORD assign_op assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); }
--
2.40.1
On Sun, Mar 03, 2024 at 01:00:33PM +0900 Masahiro Yamada wrote:
> 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 <[email protected]>
> ---
>
> scripts/kconfig/expr.h | 5 +++++
> scripts/kconfig/menu.c | 4 +++-
> scripts/kconfig/symbol.c | 4 ++++
> 3 files changed, 12 insertions(+), 1 deletion(-)
Thanks, the whole series looks good to me.
Reviewed-by: Nicolas Schier <[email protected]>
On Sun, Mar 03, 2024 at 01:00:35PM +0900 Masahiro Yamada wrote:
> Commit 5a1aa8a1aff6 ("kconfig: add named choice group") did not provide
> enough explanation. A use case was found in another project [1], but
> this has never been used in the kernel.
>
> [1]: https://lore.kernel.org/all/[email protected]/
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---
>
> Documentation/kbuild/kconfig-language.rst | 6 +-----
> scripts/kconfig/parser.y | 10 +++-------
> 2 files changed, 4 insertions(+), 12 deletions(-)
>
Reviewed-by: Nicolas Schier <[email protected]>