summaryrefslogtreecommitdiff
path: root/pp2cc.py
diff options
context:
space:
mode:
authorPeter Wu <lekensteyn@gmail.com>2011-11-30 21:14:48 +0000
committerPeter Wu <lekensteyn@gmail.com>2011-11-30 21:14:48 +0000
commitf8c1ccfac7fc22ba7d316a5b25ee58cd4d26a031 (patch)
tree7c4d17114218fc143eb0b80d0a25554f49c15662 /pp2cc.py
parent4ac454608da0616f4727c10e19161e47570b54db (diff)
downloadpp2cc-f8c1ccfac7fc22ba7d316a5b25ee58cd4d26a031.tar.gz
Support for array reference (both assignment and rvalue), update README
Diffstat (limited to 'pp2cc.py')
-rwxr-xr-xpp2cc.py30
1 files changed, 24 insertions, 6 deletions
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 = []