]> www.infradead.org Git - users/jedix/linux-maple.git/commit
kconfig: use hash table to reuse expressions
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 8 Sep 2024 12:43:20 +0000 (21:43 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Fri, 20 Sep 2024 00:21:52 +0000 (09:21 +0900)
commitf93d6bfbd2f74d79041c153a59df5336f6e9a14a
tree7661981cefb2b35765a7ade7d22b9b742cb050a2
parent440f67ccdcd31ca33d8d0439b16e4b6d4d7aba17
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>
scripts/include/hash.h
scripts/kconfig/expr.c
scripts/kconfig/expr.h
scripts/kconfig/internal.h
scripts/kconfig/menu.c