Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

kconfig: call expr_eliminate_yn() at least once in expr_eliminate_dups()

Kconfig simplifies expressions, but redundant '&&' and '||' operators
involving constant symbols 'y' and 'n' are sometimes trimmed and
sometimes not.

[Test Code]

config DEP
def_bool y

config A
bool "A"
depends on DEP && y

config B
bool "B"
depends on DEP && y && y

[Result]

$ make helpnewconfig
[ snip ]
-----

There is no help available for this option.
Symbol: A [=n]
Type : bool
Defined at Kconfig:4
Prompt: A
Depends on: DEP [=y] && y [=y]
Location:
-> A (A [=n])

-----
-----

There is no help available for this option.
Symbol: B [=n]
Type : bool
Defined at Kconfig:8
Prompt: B
Depends on: DEP [=y]
Location:
-> B (B [=n])

-----

The dependency for A, 'DEP && y', remains as-is, while that for B,
'DEP && y && y', has been reduced to 'DEP'.

Currently, expr_eliminate_dups() calls expr_eliminate_yn() only when
trans_count != 0, in other words, only when expr_eliminate_dups1() has
trimmed at least one leaf. It fails to trim a single '&& y', etc.

To fix this inconsistent behavior, expr_eliminate_yn() should be called
at least once even if no leaf has been trimmed.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+2 -5
+2 -5
scripts/kconfig/expr.c
··· 637 637 return e; 638 638 639 639 oldcount = trans_count; 640 - while (1) { 640 + do { 641 641 trans_count = 0; 642 642 switch (e->type) { 643 643 case E_OR: case E_AND: ··· 645 645 default: 646 646 ; 647 647 } 648 - if (!trans_count) 649 - /* No simplifications done in this pass. We're done */ 650 - break; 651 648 e = expr_eliminate_yn(e); 652 - } 649 + } while (trans_count); /* repeat until we get no more simplifications */ 653 650 trans_count = oldcount; 654 651 return e; 655 652 }