Am 15.03.2010 03:32, schrieb Keith Hui:
> Hi all,
> 
> I regret to report that the romcc patch circulated earlier to fix the
> segfault I reported, is now causing another segfault. This also seems to
> be triggered by something in the 440BX code, as it didn't segfault when
> I compile for any mainboards that isn't 440BX. As of now I don't know
> what this new segfault is. I'll report back with more findings.
It seems the problem was that copy_triple() isn't supposed to be used on
flattened (and simple) nodes.
I built a simple test case that failed:
void main(void) {
        int c = 0;
        c |= 4;
}

With the attached patch, this testcase, your testcase, and a full abuild
run work.

Signed-off-by: Patrick Georgi <[email protected]>
Index: util/romcc/romcc.c
===================================================================
--- util/romcc/romcc.c  (Revision 5210)
+++ util/romcc/romcc.c  (Arbeitskopie)
@@ -11557,7 +11557,7 @@
 
 static struct triple *assignment_expr(struct compile_state *state)
 {
-       struct triple *def, *left, *right;
+       struct triple *def, *left, *left2, *right;
        int tok, op, sign;
        /* The C grammer in K&R shows assignment expressions
         * only taking unary expressions as input on their
@@ -11578,6 +11578,9 @@
         */
        def = conditional_expr(state);
        left = def;
+       left2 = left;
+       if (!(left2->id & TRIPLE_FLAG_FLATTENED))
+               left2 = copy_triple(state, left2);
        switch((tok = peek(state))) {
        case TOK_EQ:
                lvalue(state, left);
@@ -11603,19 +11606,19 @@
                }
                def = write_expr(state, left,
                        triple(state, op, left->type, 
-                               read_expr(state, copy_triple(state, left)), 
right));
+                               read_expr(state, left2), right));
                break;
        case TOK_PLUSEQ:
                lvalue(state, left);
                eat(state, TOK_PLUSEQ);
                def = write_expr(state, left,
-                       mk_add_expr(state, copy_triple(state, left), 
assignment_expr(state)));
+                       mk_add_expr(state, left2, assignment_expr(state)));
                break;
        case TOK_MINUSEQ:
                lvalue(state, left);
                eat(state, TOK_MINUSEQ);
                def = write_expr(state, left,
-                       mk_sub_expr(state, copy_triple(state, left), 
assignment_expr(state)));
+                       mk_sub_expr(state, left2, assignment_expr(state)));
                break;
        case TOK_SLEQ:
        case TOK_SREQ:
@@ -11639,7 +11642,7 @@
                }
                def = write_expr(state, left,
                        triple(state, op, left->type, 
-                               read_expr(state, copy_triple(state,left)), 
right));
+                               read_expr(state, left2), right));
                break;
        }
        return def;
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to