Memory Fixes

This commit is contained in:
Gašper Dobrovoljc 2025-05-09 11:44:56 +02:00
parent a0cad251cd
commit 89c84d2cb5
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5

View File

@ -206,8 +206,8 @@ public class Memory {
} }
static private class FrameBuilder { static private class FrameBuilder {
int depth = 0; int depth = 1;
int varOffset = 8; // FP + RA int varOffset = -8; // FP + RA
Vector<Mem.RelAccess> debugVars = new Vector<>(); Vector<Mem.RelAccess> debugVars = new Vector<>();
} }
@ -230,12 +230,7 @@ public class Memory {
int parOffset = 4; // +SL int parOffset = 4; // +SL
Vector<Mem.RelAccess> debugPars = new Vector<>(); Vector<Mem.RelAccess> debugPars = new Vector<>();
for (AST.ParDef parDef : funDef.pars) { for (AST.ParDef parDef : funDef.pars) {
Vector<Integer> inits = new Vector<>(); Mem.RelAccess access = new Mem.RelAccess(parOffset, frameBuilder.depth, 4, null, parDef.name);
inits.add(1);
inits.add(1);
inits.add(1);
inits.add(0);
Mem.RelAccess access = new Mem.RelAccess(parOffset, frameBuilder.depth, 4, inits, parDef.name);
parOffset += access.size; parOffset += access.size;
debugPars.add(access); debugPars.add(access);
attrAST.attrParAccess.put(parDef, access); attrAST.attrParAccess.put(parDef, access);
@ -247,7 +242,7 @@ public class Memory {
funDef.name, funDef.name,
frameBuilder.depth, frameBuilder.depth,
parOffset, parOffset,
frameBuilder.varOffset, -frameBuilder.varOffset,
debugPars, debugPars,
frameBuilder.debugVars frameBuilder.debugVars
); );
@ -260,35 +255,40 @@ public class Memory {
public FrameBuilder visit(AST.VarDef varDef, FrameBuilder frameBuilder) { public FrameBuilder visit(AST.VarDef varDef, FrameBuilder frameBuilder) {
Vector<Integer> inits = new Vector<>(); Vector<Integer> inits = new Vector<>();
inits.add(varDef.inits.size()); inits.add(varDef.inits.size());
int size = 0;
for (AST.Init init : varDef.inits) { for (AST.Init init : varDef.inits) {
Report.Locatable valLoc = attrAST.attrLoc.get(init.value); Report.Locatable valLoc = attrAST.attrLoc.get(init.value);
Report.Locatable numLoc = attrAST.attrLoc.get(init.num); Report.Locatable numLoc = attrAST.attrLoc.get(init.num);
inits.add(decodeIntConst(init.num, numLoc)); int num = decodeIntConst(init.num, numLoc);
inits.add(num);
switch (init.value.type) { switch (init.value.type) {
case INTCONST: case INTCONST:
inits.add(1); inits.add(1);
inits.add(decodeIntConst(init.value, valLoc)); inits.add(decodeIntConst(init.value, valLoc));
size += 4 * num;
break; break;
case CHRCONST: case CHRCONST:
inits.add(1); inits.add(1);
inits.add(decodeChrConst(init.value, valLoc)); inits.add(decodeChrConst(init.value, valLoc));
size += 4 * num;
break; break;
case STRCONST: case STRCONST:
Vector<Integer> str = decodeStrConst(init.value, valLoc); Vector<Integer> str = decodeStrConst(init.value, valLoc);
inits.add(str.size()); inits.add(str.size());
inits.addAll(str); inits.addAll(str);
size += 4 * str.size() * num;
break; break;
} }
} }
if (frameBuilder == null) { if (frameBuilder == null) {
Mem.AbsAccess access = new Mem.AbsAccess(varDef.name, inits.size(), inits); Mem.AbsAccess access = new Mem.AbsAccess(varDef.name, size, inits);
attrAST.attrVarAccess.put(varDef, access); attrAST.attrVarAccess.put(varDef, access);
} else { } else {
Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset, frameBuilder.depth, inits.size(), inits, varDef.name); Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset - size, frameBuilder.depth, size, inits, varDef.name);
frameBuilder.varOffset += inits.size(); frameBuilder.varOffset -= inits.size();
frameBuilder.debugVars.add(access); frameBuilder.debugVars.add(access);
attrAST.attrVarAccess.put(varDef, access); attrAST.attrVarAccess.put(varDef, access);
} }