Skip to content

Commit 6f41848

Browse files
Fixes to bytecode compiler
Revised IR output - local var names shown, register names shortened and prefixed with % Fix to unary op Test cases updated with expected results
1 parent 45445d2 commit 6f41848

File tree

5 files changed

+274
-78
lines changed

5 files changed

+274
-78
lines changed

registervm/src/main/java/com/compilerprogramming/ezlang/bytecode/BasicBlock.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,13 @@ public static StringBuilder toStr(StringBuilder sb, BasicBlock bb, BitSet visite
3232
visited.set(bb.bid);
3333
sb.append("L").append(bb.bid).append(":\n");
3434
for (Instruction n: bb.instructions) {
35-
sb.append("\t");
35+
sb.append(" ");
3636
n.toStr(sb).append("\n");
3737
}
3838
for (BasicBlock succ: bb.successors) {
3939
toStr(sb, succ, visited);
4040
}
4141
return sb;
4242
}
43+
4344
}

registervm/src/main/java/com/compilerprogramming/ezlang/bytecode/FunctionBuilder.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ public FunctionBuilder(Symbol.FunctionTypeSymbol functionSymbol) {
3737
this.currentBreakTarget = null;
3838
this.currentContinueTarget = null;
3939
compileStatement(funcDecl.block);
40+
exitBlockIfNeeded();
41+
}
42+
43+
private void exitBlockIfNeeded() {
44+
if (currentBlock != null &&
45+
currentBlock != exit) {
46+
startBlock(exit);
47+
}
4048
}
4149

4250
private void setVirtualRegisters(Scope scope) {
@@ -127,7 +135,7 @@ private void compileAssign(AST.AssignStmt assignStmt) {
127135
codeIndexedStore();
128136
else if (assignStmt.lhs instanceof AST.NameExpr symbolExpr) {
129137
Symbol.VarSymbol varSymbol = (Symbol.VarSymbol) symbolExpr.symbol;
130-
code(new Instruction.Move(pop(), new Operand.LocalRegisterOperand(varSymbol.reg)));
138+
code(new Instruction.Move(pop(), new Operand.LocalRegisterOperand(varSymbol.reg, varSymbol.name)));
131139
}
132140
else
133141
throw new CompilerException("Invalid assignment expression: " + assignStmt.lhs);
@@ -182,7 +190,8 @@ private boolean isBlockTerminated(BasicBlock block) {
182190
}
183191

184192
private void jumpTo(BasicBlock block) {
185-
currentBlock.add(new Instruction.Jump(currentBlock, block));
193+
assert !isBlockTerminated(currentBlock);
194+
currentBlock.add(new Instruction.Jump(block));
186195
currentBlock.addSuccessor(block);
187196
}
188197

@@ -221,7 +230,7 @@ private void compileLet(AST.VarStmt letStmt) {
221230
boolean indexed = compileExpr(letStmt.expr);
222231
if (indexed)
223232
codeIndexedLoad();
224-
code(new Instruction.Move(pop(), new Operand.LocalRegisterOperand(letStmt.symbol.reg)));
233+
code(new Instruction.Move(pop(), new Operand.LocalRegisterOperand(letStmt.symbol.reg, letStmt.symbol.name)));
225234
}
226235
}
227236

@@ -373,7 +382,7 @@ private boolean compileSymbolExpr(AST.NameExpr symbolExpr) {
373382
pushOperand(new Operand.LocalFunctionOperand(functionType));
374383
else {
375384
Symbol.VarSymbol varSymbol = (Symbol.VarSymbol) symbolExpr.symbol;
376-
pushLocal(varSymbol.reg);
385+
pushLocal(varSymbol.reg, varSymbol.name);
377386
}
378387
return false;
379388
}
@@ -429,13 +438,9 @@ private boolean compileUnaryExpr(AST.UnaryExpr unaryExpr) {
429438
default: throw new CompilerException("Invalid unary op");
430439
}
431440
}
432-
else if (top instanceof Operand.LocalRegisterOperand) {
433-
code(new Instruction.UnaryInstruction(opCode, top));
434-
}
435441
else {
436442
var temp = createTemp();
437-
code(new Instruction.Move(top, temp));
438-
code(new Instruction.UnaryInstruction(opCode, temp));
443+
code(new Instruction.UnaryInstruction(opCode, temp, top));
439444
}
440445
return false;
441446
}
@@ -455,8 +460,8 @@ private Operand.TempRegisterOperand createTemp() {
455460
return tempRegister;
456461
}
457462

458-
private void pushLocal(int regnum) {
459-
virtualStack.add(new Operand.LocalRegisterOperand(regnum));
463+
private void pushLocal(int regnum, String varName) {
464+
virtualStack.add(new Operand.LocalRegisterOperand(regnum, varName));
460465
}
461466

462467
private void pushOperand(Operand operand) {

registervm/src/main/java/com/compilerprogramming/ezlang/bytecode/Instruction.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ public StringBuilder toStr(StringBuilder sb) {
2525

2626
public static class UnaryInstruction extends Instruction {
2727
public final String unop;
28+
public final Operand result;
2829
public final Operand operand;
29-
public UnaryInstruction(String unop, Operand operand) {
30+
public UnaryInstruction(String unop, Operand result, Operand operand) {
3031
this.unop = unop;
32+
this.result = result;
3133
this.operand = operand;
3234
}
3335
@Override
3436
public StringBuilder toStr(StringBuilder sb) {
35-
return sb.append(operand).append(" = ").append(unop).append(operand);
37+
return sb.append(result).append(" = ").append(unop).append(operand);
3638
}
3739
}
3840

@@ -62,7 +64,7 @@ public AStoreAppend(Operand array, Operand value) {
6264
}
6365
@Override
6466
public StringBuilder toStr(StringBuilder sb) {
65-
return sb.append("ArrayAdd(").append(array).append(", ").append(value).append(")");
67+
return sb.append(array).append(".append(").append(value).append(")");
6668
}
6769
}
6870

@@ -96,18 +98,20 @@ public Call(Operand callee, Operand... args) {
9698
}
9799
@Override
98100
public StringBuilder toStr(StringBuilder sb) {
99-
sb.append(callee).append("(");
101+
sb.append("call ").append(callee);
102+
if (args.length > 0)
103+
sb.append(" params ");
100104
for (int i = 0; i < args.length; i++) {
101105
if (i > 0) sb.append(", ");
102106
sb.append(args[i]);
103107
}
104-
return sb.append(")");
108+
return sb;
105109
}
106110
}
107111

108112
public static class Jump extends Instruction {
109113
public final BasicBlock jumpTo;
110-
public Jump(BasicBlock currentBlock, BasicBlock jumpTo) {
114+
public Jump(BasicBlock jumpTo) {
111115
this.jumpTo = jumpTo;
112116
}
113117
@Override

registervm/src/main/java/com/compilerprogramming/ezlang/bytecode/Operand.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ public String toString() {
1717

1818
public static class LocalRegisterOperand extends Operand {
1919
public final int regnum;
20-
public LocalRegisterOperand(int regnum) {
20+
public final String varName;
21+
public LocalRegisterOperand(int regnum, String varName) {
2122
this.regnum = regnum;
23+
this.varName = varName;
2224
}
2325
@Override
2426
public String toString() {
25-
return "Local{" + regnum + '}';
27+
return varName;
2628
}
2729
}
2830

@@ -45,7 +47,7 @@ public String toString() {
4547
public static class ReturnRegisterOperand extends Operand {
4648
public ReturnRegisterOperand() {}
4749
@Override
48-
public String toString() { return "RET"; }
50+
public String toString() { return "%ret"; }
4951
}
5052

5153
/**
@@ -60,7 +62,7 @@ public TempRegisterOperand(int regnum) {
6062
}
6163
@Override
6264
public String toString() {
63-
return "T" + regnum;
65+
return "%t" + regnum;
6466
}
6567
}
6668

@@ -89,7 +91,7 @@ public LoadFieldOperand(Operand structOperand, String fieldName, int field) {
8991

9092
@Override
9193
public String toString() {
92-
return structOperand + "." + fieldName + "(" + fieldIndex + ")";
94+
return structOperand + "." + fieldName;
9395
}
9496
}
9597

0 commit comments

Comments
 (0)