2021-04-13 15:08:17 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef INTERNAL_H
|
|
|
|
#define INTERNAL_H
|
|
|
|
|
2024-07-20 07:27:38 +00:00
|
|
|
#include <hashtable.h>
|
2024-02-11 12:41:05 +00:00
|
|
|
|
|
|
|
#define SYMBOL_HASHSIZE (1U << 14)
|
|
|
|
|
|
|
|
extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);
|
|
|
|
|
|
|
|
#define for_all_symbols(sym) \
|
|
|
|
hash_for_each(sym_hashtable, sym, node)
|
|
|
|
|
kconfig: use hash table to reuse expressions
Currently, every expression in Kconfig files produces a new abstract
syntax tree (AST), even if it is identical to a previously encountered
one.
Consider the following code:
config FOO
bool "FOO"
depends on (A || B) && C
config BAR
bool "BAR"
depends on (A || B) && C
config BAZ
bool "BAZ"
depends on A || B
The "depends on" lines are similar, but currently a separate AST is
allocated for each one.
The current data structure looks like this:
FOO->dep ==> AND BAR->dep ==> AND BAZ->dep ==> OR
/ \ / \ / \
OR C OR C A B
/ \ / \
A B A B
This is redundant; FOO->dep and BAR->dep have identical ASTs but
different memory instances.
We can optimize this; FOO->dep and BAR->dep can share the same AST, and
BAZ->dep can reference its sub tree.
The optimized data structure looks like this:
FOO->dep, BAR->dep ==> AND
/ \
BAZ->dep ==> OR C
/ \
A B
This commit introduces a hash table to keep track of allocated
expressions. If an identical expression is found, it is reused.
This does not necessarily result in memory savings, as menu_finalize()
transforms expressions without freeing up stale ones. This will be
addressed later.
One optimization that can be easily implemented is caching the
expression's value. Once FOO's dependency, (A || B) && C, is calculated,
it can be cached, eliminating the need to recalculate it for BAR.
This commit also reverts commit e983b7b17ad1 ("kconfig/menu.c: fix
multiple references to expressions in menu_add_prop()").
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2024-09-08 12:43:20 +00:00
|
|
|
#define EXPR_HASHSIZE (1U << 14)
|
|
|
|
|
|
|
|
extern HASHTABLE_DECLARE(expr_hashtable, EXPR_HASHSIZE);
|
|
|
|
|
2024-09-08 12:43:21 +00:00
|
|
|
void expr_invalidate_all(void);
|
|
|
|
|
2021-04-13 15:08:17 +00:00
|
|
|
struct menu;
|
|
|
|
|
|
|
|
extern struct menu *current_menu, *current_entry;
|
|
|
|
|
2024-02-02 15:58:08 +00:00
|
|
|
extern const char *cur_filename;
|
|
|
|
extern int cur_lineno;
|
|
|
|
|
2021-04-13 15:08:17 +00:00
|
|
|
#endif /* INTERNAL_H */
|