From f8c1ccfac7fc22ba7d316a5b25ee58cd4d26a031 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Wed, 30 Nov 2011 21:14:48 +0000 Subject: Support for array reference (both assignment and rvalue), update README --- pp2cc.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'pp2cc.py') diff --git a/pp2cc.py b/pp2cc.py index 11ff592..6e6e614 100755 --- a/pp2cc.py +++ b/pp2cc.py @@ -1131,8 +1131,12 @@ class Parse(object): linked_lval = LinkedNode(node.lvalue, linked_node) # this lvalue may be an expression if there is an indirection - if isinstance(node.lvalue, c_ast.UnaryOp) and node.lvalue.op == "*": - lvalue = self.parseExpression(linked_lval.node.expr, linked_lval) + if (linked_lval.type == "UnaryOp" and node.lvalue.op == "*" or + linked_lval.type == "ArrayRef"): + if linked_lval.type == "UnaryOp": + lvalue = self.parseExpression(linked_lval.node.expr, linked_lval) + else: + lvalue = self.parseExpression(linked_lval.node, linked_node) lvalue_result_reg = self.registers.find_register(lvalue) for line in lvalue: # if the right value register is modified, we need to pull @@ -1186,14 +1190,24 @@ class Parse(object): linked_type = LinkedNode(linked_node.node.type, linked_node) var_name = linked_node.variables.declName(linked_node.node.name, 1) if linked_type.type == "ArrayDecl": - size = self.determineConstValue(LinkedNode(linked_type.node.dim, + if linked_type.node.dim is not None: + size = self.determineConstValue(LinkedNode(linked_type.node.dim, linked_node)) + else: + size = None node_init = linked_node.node.init + # determine the array dimension based on the initializer if node_init and isinstance(node_init, c_ast.ExprList): real_size = len(node_init.exprs) - if real_size > size: + if size is None: + size = real_size + elif real_size > size: self.logger.warning("excess elements in array initializer", linked_node=linked_node) + # it's an error if the array dimension is unavailable, e.g.: + # int a[]; + if size is None: + raise RuntimeError("Array size missing in '{}'".format(var_name)) var_array = linked_node.variables.declName(var_name, size, prefix="arr") elif linked_type.type == "PtrDecl": @@ -1332,8 +1346,12 @@ class Parse(object): else: lines += index_expr - lines.append(self.asm.binary_op("LOAD", name_reg, - "[" + name_reg + "+" + index_reg + "]")) + if (linked_node.parent and linked_node.parent.type == "Assignment" and + linked_node.parent.node.lvalue is linked_node.node): + lines.append(self.asm.binary_op("ADD", name_reg, index_reg)) + else: + lines.append(self.asm.binary_op("LOAD", name_reg, + "[" + name_reg + "+" + index_reg + "]")) return lines def parseLabel(self, linked_node): lines = [] -- cgit v1.2.1