aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--scripts/parse_kconfig/boolexpr.c3
-rw-r--r--scripts/parse_kconfig/parse.c38
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();