mirror of https://github.com/aamine/cbc
* 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:
parent
99b5be5455
commit
487cf1a714
19
ChangeLog
19
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue