diff options
author | Patrick Georgi <patrick.georgi@coresystems.de> | 2010-03-14 22:20:57 +0000 |
---|---|---|
committer | Patrick Georgi <patrick.georgi@coresystems.de> | 2010-03-14 22:20:57 +0000 |
commit | f761aef9326ebbb9d2018feaaf3471e2a15f471b (patch) | |
tree | f48b1a99780dc65b2dc648ccc31c6182fa56d3e7 | |
parent | cc6692695588efee192a64e1f70bdb343b2b39c5 (diff) | |
download | coreboot-f761aef9326ebbb9d2018feaaf3471e2a15f471b.tar.xz |
Fix segfault of romcc when complex assignment operators
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
-rw-r--r-- | util/romcc/romcc.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/util/romcc/romcc.c b/util/romcc/romcc.c index b961d66c32..5fa7ede182 100644 --- a/util/romcc/romcc.c +++ b/util/romcc/romcc.c @@ -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; |