]> rtime.felk.cvut.cz Git - linux-conf-perf.git/commitdiff
Fix parse_kconfig symbol default
authorKarel Kočí <cynerd@email.cz>
Thu, 17 Sep 2015 11:03:02 +0000 (13:03 +0200)
committerKarel Kočí <cynerd@email.cz>
Thu, 17 Sep 2015 11:03:02 +0000 (13:03 +0200)
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.

scripts/parse_kconfig/boolexpr.c
scripts/parse_kconfig/parse.c

index b6f008dd6fd6583a06494c4bdc3453a13771c142..05954611b55c556f3553f7c37b9f41b7f0ab3617 100644 (file)
@@ -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;
 }
index 9de456fe94d384079eee11e0750486620ca5e6c5..6dc08cec655e0bb5dc4a851e703c122b216cfa18 100644 (file)
@@ -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();