aboutsummaryrefslogtreecommitdiff
path: root/scripts/parse_kconfig/parse.c
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2015-09-17 13:03:02 +0200
committerKarel Kočí <cynerd@email.cz>2015-09-17 13:03:02 +0200
commit08d906b110f6a1a9985c4e03a13a2a97b0aaf818 (patch)
treea2ce6d3a4d0b39ed01064c6d21da911d417f5cf1 /scripts/parse_kconfig/parse.c
parent610845c6f99412010baa7a84ff8880bc7046c49a (diff)
downloadlinux-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/parse.c')
-rw-r--r--scripts/parse_kconfig/parse.c38
1 files changed, 31 insertions, 7 deletions
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();