summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Georgi <patrick.georgi@coresystems.de>2010-03-14 22:20:57 +0000
committerPatrick Georgi <patrick.georgi@coresystems.de>2010-03-14 22:20:57 +0000
commitf761aef9326ebbb9d2018feaaf3471e2a15f471b (patch)
treef48b1a99780dc65b2dc648ccc31c6182fa56d3e7
parentcc6692695588efee192a64e1f70bdb343b2b39c5 (diff)
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.c22
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;