wasm: fix bugs in GC and runtime

This commit is contained in:
Alexey Andreev 2016-09-14 23:23:27 +03:00
parent 5caa400eb7
commit f2668b867d
4 changed files with 15 additions and 7 deletions

View File

@ -919,9 +919,9 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
} }
slotExpr.acceptVisitor(this); slotExpr.acceptVisitor(this);
WasmExpression slot = result; WasmExpression slotOffset = getSlotOffset(result);
WasmExpression address = new WasmGetLocal(stackVariable); WasmExpression address = new WasmGetLocal(stackVariable);
address = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, address, slot); address = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, address, slotOffset);
gcRootExpr.acceptVisitor(this); gcRootExpr.acceptVisitor(this);
WasmExpression gcRoot = result; WasmExpression gcRoot = result;
@ -936,13 +936,22 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
} }
slotExpr.acceptVisitor(this); slotExpr.acceptVisitor(this);
WasmExpression slot = result; WasmExpression slotOffset = getSlotOffset(result);
WasmExpression address = new WasmGetLocal(stackVariable); WasmExpression address = new WasmGetLocal(stackVariable);
address = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, address, slot); address = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, address, slotOffset);
result = new WasmStoreInt32(4, address, new WasmInt32Constant(0), WasmInt32Subtype.INT32); result = new WasmStoreInt32(4, address, new WasmInt32Constant(0), WasmInt32Subtype.INT32);
} }
private WasmExpression getSlotOffset(WasmExpression slot) {
if (slot instanceof WasmInt32Constant) {
int slotConstant = ((WasmInt32Constant) slot).getValue();
return new WasmInt32Constant(slotConstant << 2);
} else {
return new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.SHL, slot, new WasmInt32Constant(2));
}
}
@Override @Override
public void visit(BlockStatement statement) { public void visit(BlockStatement statement) {
WasmBlock block = new WasmBlock(false); WasmBlock block = new WasmBlock(false);

View File

@ -157,7 +157,7 @@ public class AddressIntrinsic implements WasmIntrinsic {
WasmCall call = new WasmCall(WasmMangling.mangleMethod(delegate)); WasmCall call = new WasmCall(WasmMangling.mangleMethod(delegate));
call.getArguments().addAll(invocation.getArguments().stream() call.getArguments().addAll(invocation.getArguments().stream()
.map(arg -> manager.generate(arg)) .map(arg -> manager.generate(arg))
.collect(Collectors.toSet())); .collect(Collectors.toList()));
return call; return call;
} }
case "isLessThan": { case "isLessThan": {

View File

@ -169,8 +169,6 @@ public class GcRootMaintainingTransformer {
registerInvocation.getArguments().add(slotVar); registerInvocation.getArguments().add(slotVar);
registerInvocation.getArguments().add(program.variableAt(liveVar)); registerInvocation.getArguments().add(program.variableAt(liveVar));
instructionsToAdd.add(registerInvocation); instructionsToAdd.add(registerInvocation);
++slot;
} }
while (slot < maxDepth) { while (slot < maxDepth) {

View File

@ -317,6 +317,7 @@ public final class GC {
Address address = Address.fromInt(Structure.sizeOf(RuntimeArray.class)); Address address = Address.fromInt(Structure.sizeOf(RuntimeArray.class));
address = Address.align(address, itemSize); address = Address.align(address, itemSize);
address = address.add(itemSize * array.size); address = address.add(itemSize * array.size);
address = Address.align(address, 4);
return address.toInt(); return address.toInt();
} }
} }