[coreboot] [commit] r5210 - trunk/util/romcc

repository service svn at coreboot.org
Sun Mar 14 23:20:57 CET 2010


Author: oxygene
Date: Sun Mar 14 23:20:57 2010
New Revision: 5210
URL: http://tracker.coreboot.org/trac/coreboot/changeset/5210

Log:
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 at coresystems.de>
Acked-by: Stefan Reinauer <stepan at coresystems.de>

Modified:
   trunk/util/romcc/romcc.c

Modified: trunk/util/romcc/romcc.c
==============================================================================
--- trunk/util/romcc/romcc.c	Sun Mar 14 22:31:05 2010	(r5209)
+++ trunk/util/romcc/romcc.c	Sun Mar 14 23:20:57 2010	(r5210)
@@ -1896,12 +1896,16 @@
 		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 @@
 		}
 		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 @@
 		}
 		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;




More information about the coreboot mailing list