diff options
author | Karel Kočí <cynerd@email.cz> | 2015-09-17 13:03:02 +0200 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2015-09-17 13:03:02 +0200 |
commit | 08d906b110f6a1a9985c4e03a13a2a97b0aaf818 (patch) | |
tree | a2ce6d3a4d0b39ed01064c6d21da911d417f5cf1 /scripts/parse_kconfig | |
parent | 610845c6f99412010baa7a84ff8880bc7046c49a (diff) | |
download | linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.tar.gz linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.tar.bz2 linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.zip |
Fix parse_kconfig symbol default
Generated rules for symbols default values was used without information
about their order. Kconfig documentation specifies that only first
valid default value specification should be used.
Diffstat (limited to 'scripts/parse_kconfig')
-rw-r--r-- | scripts/parse_kconfig/boolexpr.c | 3 | ||||
-rw-r--r-- | scripts/parse_kconfig/parse.c | 38 |
2 files changed, 33 insertions, 8 deletions
diff --git a/scripts/parse_kconfig/boolexpr.c b/scripts/parse_kconfig/boolexpr.c index b6f008d..0595461 100644 --- a/scripts/parse_kconfig/boolexpr.c +++ b/scripts/parse_kconfig/boolexpr.c @@ -286,6 +286,7 @@ void boolexpr_free(struct boolexpr *e) { } struct boolexpr *boolexpr_copy(struct boolexpr *e) { + struct boolexpr *cop = e; struct boolexpr **stack; size_t stack_size = 2, stack_pos = 0; stack = malloc(stack_size * sizeof(struct boolexpr *)); @@ -311,5 +312,5 @@ struct boolexpr *boolexpr_copy(struct boolexpr *e) { } } free(stack); - return e; + return cop; } diff --git a/scripts/parse_kconfig/parse.c b/scripts/parse_kconfig/parse.c index 9de456f..6dc08ce 100644 --- a/scripts/parse_kconfig/parse.c +++ b/scripts/parse_kconfig/parse.c @@ -126,22 +126,46 @@ void cpy_dep() { goto choice_exception; } // Default value + struct boolexpr **defexpr = NULL; + size_t defexpr_size = 0; + int z; + bool exitdef = false; for_all_defaults(sym, prop) { Dprintf(" Default value:\n"); doutput_expr(prop->expr); struct boolexpr *def = boolexpr_kconfig(gsymlist, prop->expr, true, NULL); + struct boolexpr *vis; if (prop->visible.expr != NULL) - def = - boolexpr_and(def, - boolexpr_kconfig(gsymlist, - prop->visible.expr, - false, NULL)); - if (el->def == NULL) { - el->def = def; + vis = boolexpr_kconfig(gsymlist, prop->visible.expr, + false, NULL); + else + vis = boolexpr_true(); + if (vis->type != BT_TRUE) { + defexpr = realloc(defexpr, + ++defexpr_size * sizeof(struct boolexpr *)); + defexpr[defexpr_size - 1] = boolexpr_copy(vis); } else { + ++defexpr_size; + exitdef = true; + } + def = boolexpr_and(def, vis); + for (z = 0; z < ((int)defexpr_size - 1); z++) { + def = boolexpr_and(def, boolexpr_not( + boolexpr_copy(defexpr[z]))); + } + if (el->def == NULL) + el->def = def; + else el->def = boolexpr_or(el->def, def); + if (exitdef) + break; + } + if (defexpr != NULL) { + for (z = 0; z < defexpr_size - 1; z++) { + boolexpr_free(defexpr[z]); } + free(defexpr); } if (el->def == NULL) el->def = boolexpr_false(); |