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