Fix segfault of romcc when complex assignment operators
authorPatrick Georgi <patrick.georgi@coresystems.de>
Sun, 14 Mar 2010 22:20:57 +0000 (22:20 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Sun, 14 Mar 2010 22:20:57 +0000 (22:20 +0000)
were applied to non-trivial LHSs, eg.  c[4] |= 1;

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5210 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/romcc/romcc.c

index b961d66c3294fd67def0d600dee19f905bf7a6a6..5fa7ede182027dc3a4a2e9f8ca8414c152af5e40 100644 (file)
@@ -1896,12 +1896,16 @@ static void use_triple(struct triple *used, struct triple *user)
                return;
        if (!user)
                return;
-       ptr = &used->use;
-       while(*ptr) {
-               if ((*ptr)->member == user) {
-                       return;
+       if (used->use == (void*)-1)
+               used->use = 0;
+       if (used->use) {
+               ptr = &used->use;
+               while(*ptr) {
+                       if ((*ptr)->member == user) {
+                               return;
+                       }
+                       ptr = &(*ptr)->next;
                }
-               ptr = &(*ptr)->next;
        }
        /* Append new to the head of the list, 
         * copy_func and rename_block_variables
@@ -11599,19 +11603,19 @@ static struct triple *assignment_expr(struct compile_state *state)
                }
                def = write_expr(state, left,
                        triple(state, op, left->type, 
-                               read_expr(state, left), right));
+                               read_expr(state, copy_triple(state, left)), right));
                break;
        case TOK_PLUSEQ:
                lvalue(state, left);
                eat(state, TOK_PLUSEQ);
                def = write_expr(state, left,
-                       mk_add_expr(state, left, assignment_expr(state)));
+                       mk_add_expr(state, copy_triple(state, left), assignment_expr(state)));
                break;
        case TOK_MINUSEQ:
                lvalue(state, left);
                eat(state, TOK_MINUSEQ);
                def = write_expr(state, left,
-                       mk_sub_expr(state, left, assignment_expr(state)));
+                       mk_sub_expr(state, copy_triple(state, left), assignment_expr(state)));
                break;
        case TOK_SLEQ:
        case TOK_SREQ:
@@ -11635,7 +11639,7 @@ static struct triple *assignment_expr(struct compile_state *state)
                }
                def = write_expr(state, left,
                        triple(state, op, left->type, 
-                               read_expr(state, left), right));
+                               read_expr(state, copy_triple(state,left)), right));
                break;
        }
        return def;