* net/loveruby/cflat/compiler/Simplifier.java (SuffixOp): too few deref.

* net/loveruby/cflat/compiler/Simplifier.java (MemberNode): should set type.
* net/loveruby/cflat/compiler/Simplifier.java (PtrMemberNode): should set type.
* net/loveruby/cflat/compiler/Simplifier.java (Deref, Addr): should compile child expr.
* net/loveruby/cflat/ast/BinaryOpNode.java (ctor): accept type.
* net/loveruby/cflat/ast/TypeNode.java (location): do not raise exception when no typeRef exist.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4144 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-04-26 04:22:42 +00:00
parent 99b5be5455
commit 487cf1a714
4 changed files with 48 additions and 9 deletions

View File

@ -1,3 +1,22 @@
Sun Apr 26 13:22:39 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/Simplifier.java (SuffixOp): too few
deref.
* net/loveruby/cflat/compiler/Simplifier.java (MemberNode): should
set type.
* net/loveruby/cflat/compiler/Simplifier.java (PtrMemberNode):
should set type.
* net/loveruby/cflat/compiler/Simplifier.java (Deref, Addr):
should compile child expr.
* net/loveruby/cflat/ast/BinaryOpNode.java (ctor): accept type.
* net/loveruby/cflat/ast/TypeNode.java (location): do not raise
exception when no typeRef exist.
Sun Apr 26 12:17:51 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/asm/PeepholeOptimizer.java: fix bad operator

View File

@ -13,6 +13,14 @@ public class BinaryOpNode extends ExprNode {
this.right = right;
}
public BinaryOpNode(Type t, ExprNode left, String op, ExprNode right) {
super();
this.operator = op;
this.left = left;
this.right = right;
this.type = t;
}
public String operator() {
return operator;
}

View File

@ -34,7 +34,7 @@ public class TypeNode extends Node {
}
public Location location() {
return typeRef.location();
return typeRef == null ? null : typeRef.location();
}
protected void _dump(Dumper d) {

View File

@ -490,7 +490,7 @@ class Simplifier implements ASTVisitor<Void, ExprNode> {
DefinedVariable tmp = tmpVar(addr.type());
String op = binOp(node.operator());
assignBeforeStmt(ref(tmp), addr);
ExprNode lhs = transformOpAssign(ref(tmp), op, intValue(1));
ExprNode lhs = transformOpAssign(deref(tmp), op, intValue(1));
ExprNode rhs = expandPointerArithmetic(intValue(1), op, lhs);
return binaryOp(lhs, invert(op), rhs);
}
@ -573,24 +573,28 @@ class Simplifier implements ASTVisitor<Void, ExprNode> {
// #@@}
public ExprNode visit(MemberNode node) {
ExprNode addr = binaryOp(addressOf(transform(node.expr())),
"+", intValue(node.offset()));
ExprNode addr = binaryOp(pointerTo(node.type()),
addressOf(transform(node.expr())),
"+",
intValue(node.offset()));
return node.shouldEvaluatedToAddress() ? addr : deref(addr);
}
public ExprNode visit(PtrMemberNode node) {
ExprNode addr = binaryOp(transform(node.expr()),
"+", intValue(node.offset()));
ExprNode addr = binaryOp(pointerTo(node.type()),
transform(node.expr()),
"+",
intValue(node.offset()));
return node.shouldEvaluatedToAddress() ? addr : deref(addr);
}
public ExprNode visit(DereferenceNode node) {
node.setExpr(node.expr());
node.setExpr(transform(node.expr()));
return node;
}
public ExprNode visit(AddressNode node) {
node.setExpr(node.expr());
node.setExpr(transform(node.expr()));
return node;
}
@ -640,7 +644,7 @@ class Simplifier implements ASTVisitor<Void, ExprNode> {
else {
AddressNode n = new AddressNode(expr);
Type base = expr.type();
n.setType(expr.shouldEvaluatedToAddress() ? base : typeTable.pointerTo(base));
n.setType(expr.shouldEvaluatedToAddress() ? base : pointerTo(base));
return n;
}
}
@ -659,10 +663,18 @@ class Simplifier implements ASTVisitor<Void, ExprNode> {
return new DereferenceNode(expr);
}
private Type pointerTo(Type t) {
return typeTable.pointerTo(t);
}
private BinaryOpNode binaryOp(ExprNode left, String op, ExprNode right) {
return new BinaryOpNode(left, op, right);
}
private BinaryOpNode binaryOp(Type t, ExprNode left, String op, ExprNode right) {
return new BinaryOpNode(t, left, op, right);
}
private IntegerLiteralNode intValue(long n) {
// FIXME?: location
return ptrDiff(n, null);