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>
This commit is contained in:
parent
d67015eedd
commit
8bfd6f0923
@ -637,7 +637,7 @@ struct expr *expr_eliminate_dups(struct expr *e)
|
||||
return e;
|
||||
|
||||
oldcount = trans_count;
|
||||
while (1) {
|
||||
do {
|
||||
trans_count = 0;
|
||||
switch (e->type) {
|
||||
case E_OR: case E_AND:
|
||||
@ -645,11 +645,8 @@ struct expr *expr_eliminate_dups(struct expr *e)
|
||||
default:
|
||||
;
|
||||
}
|
||||
if (!trans_count)
|
||||
/* No simplifications done in this pass. We're done */
|
||||
break;
|
||||
e = expr_eliminate_yn(e);
|
||||
}
|
||||
} while (trans_count); /* repeat until we get no more simplifications */
|
||||
trans_count = oldcount;
|
||||
return e;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user