diff --git a/src/pins25/phase/CodeGen.java b/src/pins25/phase/CodeGen.java index 7a83297..99c0d23 100644 --- a/src/pins25/phase/CodeGen.java +++ b/src/pins25/phase/CodeGen.java @@ -167,6 +167,16 @@ public class CodeGen { public Generator() { } + private Stack staticLinks = new Stack<>(); + + private String funLabel(AST.FunDef funDef) { + if (funDef.name.equals("main") || funDef.stmts.size() == 0) { + return funDef.name; + } + Report.Location loc = attrAST.attrLoc.get(funDef).location(); + return "$fun:" + funDef.name + "@" + loc.begLine() + ":" + loc.begColumn(); + } + @Override public List visit(AST.FunDef funDef, Mem.Frame frame) { Report.Locatable loc = attrAST.attrLoc.get(funDef); @@ -174,15 +184,17 @@ public class CodeGen { frame = attrAST.attrFrame.get(funDef); - code.add(new PDM.LABEL(funDef.name, loc)); + code.add(new PDM.LABEL(funLabel(funDef), loc)); + staticLinks.push(funDef); code.addAll(funDef.stmts.accept(this, frame)); + staticLinks.pop(); code.add(new PDM.PUSH(attrAST.attrFrame.get(funDef).parsSize, loc)); code.add(new PDM.RETN(attrAST.attrFrame.get(funDef), loc)); attrAST.attrCode.put(funDef, code); - return code; + return new ArrayList<>(); } @Override @@ -203,14 +215,13 @@ public class CodeGen { break; case STRCONST: List data = new ArrayList<>(); - String label = String.valueOf(labelCounter++); + String label = "$str@" + loc.location().begLine() + ":" + loc.location().begColumn(); data.add(new PDM.LABEL(label, loc)); for (Integer value : Memory.decodeStrConst(atomExpr, loc)) { data.add(new PDM.DATA(value, loc)); } attrAST.attrData.put(atomExpr, data); code.add(new PDM.NAME(label, loc)); -// code.add(new PDM.LOAD(loc)); break; } @@ -291,7 +302,7 @@ public class CodeGen { switch (access) { case Mem.AbsAccess absAccess: - code.add(new PDM.NAME(absAccess.name, loc)); + code.add(new PDM.NAME("$var:" + absAccess.name, loc)); break; case Mem.RelAccess relAccess: code.add(new PDM.REGN(PDM.REGN.Reg.FP, loc)); @@ -335,17 +346,17 @@ public class CodeGen { switch (unExpr.oper) { case NOT -> code.add(new PDM.OPER(PDM.OPER.Oper.NOT, loc)); - case ADD -> code.add(new PDM.OPER(PDM.OPER.Oper.ADD, loc)); // TODO case SUB -> code.add(new PDM.OPER(PDM.OPER.Oper.NEG, loc)); case VALUEAT -> code.add(new PDM.LOAD(loc)); case MEMADDR -> { if (unExpr.expr instanceof AST.VarExpr varExpr) { code.addAll(resolveAddr(varExpr, frame)); } else { - // TODO: are non variable expressions allowed? throw new Report.Error(loc, "Expression not a variable"); } } + case ADD -> { + } } attrAST.attrCode.put(unExpr, code); @@ -357,14 +368,20 @@ public class CodeGen { Report.Locatable loc = attrAST.attrLoc.get(callExpr); List code = new ArrayList<>(); + AST.FunDef funDef = (AST.FunDef) attrAST.attrDef.get(callExpr); + for (int i = callExpr.args.size() - 1; i >= 0; i--) { AST.Expr expr = (AST.Expr) callExpr.args.get(i); code.addAll(expr.accept(this, frame)); } - code.add(new PDM.REGN(PDM.REGN.Reg.FP, loc)); // SL + // SL + code.add(new PDM.REGN(PDM.REGN.Reg.FP, loc)); + if (attrAST.attrFrame.get(funDef).depth.equals(frame.depth)) { + code.add(new PDM.LOAD(loc)); + } - code.add(new PDM.NAME(callExpr.name, loc)); + code.add(new PDM.NAME(funLabel(funDef), loc)); code.add(new PDM.CALL(frame, loc)); attrAST.attrCode.put(callExpr, code); @@ -380,27 +397,31 @@ public class CodeGen { Mem.Access access = attrAST.attrVarAccess.get(varDef); switch (access) { - case Mem.AbsAccess absAccess: - data.add(new PDM.LABEL(absAccess.name, loc)); + case Mem.AbsAccess absAccess -> { + String varLabel = "$var:" + absAccess.name; + data.add(new PDM.LABEL(varLabel, loc)); for (int i = 0; i < absAccess.size / 4; i++) { data.add(new PDM.DATA(0, loc)); } - data.add(new PDM.LABEL(absAccess.name + ".init", loc)); + String initLabel = "$init:" + absAccess.name; + data.add(new PDM.LABEL(initLabel, loc)); for (Integer init : absAccess.inits) { data.add(new PDM.DATA(init, loc)); } - code.add(new PDM.NAME(absAccess.name, loc)); - code.add(new PDM.NAME(absAccess.name + ".init", loc)); + code.add(new PDM.NAME(varLabel, loc)); + code.add(new PDM.NAME(initLabel, loc)); code.add(new PDM.INIT(loc)); - break; + } - case Mem.RelAccess relAccess: - String initLabel = String.valueOf(labelCounter++); + case Mem.RelAccess relAccess -> { + String initLabel = "$init:" + varDef.name + "@" + loc.location().begLine() + ":" + loc.location().begColumn(); data.add(new PDM.LABEL(initLabel, loc)); - for (Integer init : relAccess.inits) { - data.add(new PDM.DATA(init, loc)); + if (relAccess.inits != null) { + for (Integer init : relAccess.inits) { + data.add(new PDM.DATA(init, loc)); + } } code.add(new PDM.PUSH(-relAccess.size, loc)); @@ -409,10 +430,10 @@ public class CodeGen { code.add(new PDM.REGN(PDM.REGN.Reg.SP, loc)); code.add(new PDM.NAME(initLabel, loc)); code.add(new PDM.INIT(loc)); - break; + } - default: - break; + default -> { + } } attrAST.attrCode.put(varDef, code); @@ -456,11 +477,12 @@ public class CodeGen { @Override public List visit(AST.IfStmt ifStmt, Mem.Frame frame) { - Report.Locatable loc = attrAST.attrLoc.get(ifStmt); + Report.Location loc = attrAST.attrLoc.get(ifStmt).location(); - String thenLabel = String.valueOf(labelCounter++); - String elseLabel = String.valueOf(labelCounter++); - String endLabel = String.valueOf(labelCounter++); + String locStr = loc.begLine() + ":" + loc.begColumn(); + String thenLabel = "$if:then@" + locStr; + String elseLabel = "$if:else@" + locStr; + String endLabel = "$if:end@" + locStr; List code = ifStmt.cond.accept(this, frame); code.add(new PDM.NAME(thenLabel, loc)); @@ -483,20 +505,21 @@ public class CodeGen { @Override public List visit(AST.WhileStmt whileStmt, Mem.Frame frame) { - Report.Locatable loc = attrAST.attrLoc.get(whileStmt); + Report.Location loc = attrAST.attrLoc.get(whileStmt).location(); List code = new ArrayList<>(); - String condLabel = String.valueOf(labelCounter++); - String startLabel = String.valueOf(labelCounter++); - String endLabel = String.valueOf(labelCounter++); + String locStr = loc.begLine() + ":" + loc.begColumn(); + String condLabel = "$while:cond@" + locStr; + String begLabel = "$while:beg@" + locStr; + String endLabel = "$while:end@" + locStr; code.add(new PDM.LABEL(condLabel, loc)); code.addAll(whileStmt.cond.accept(this, frame)); - code.add(new PDM.NAME(startLabel, loc)); + code.add(new PDM.NAME(begLabel, loc)); code.add(new PDM.NAME(endLabel, loc)); code.add(new PDM.CJMP(loc)); - code.add(new PDM.LABEL(startLabel, loc)); + code.add(new PDM.LABEL(begLabel, loc)); code.addAll(whileStmt.stmts.accept(this, frame)); code.add(new PDM.NAME(condLabel, loc)); diff --git a/src/pins25/phase/Machine.java b/src/pins25/phase/Machine.java index f6d834e..413cbaf 100644 --- a/src/pins25/phase/Machine.java +++ b/src/pins25/phase/Machine.java @@ -33,7 +33,7 @@ public class Machine { /** * Ali se opravi testni izpis vrednost oznak. */ - public static boolean debugLabelsList = false; + public static boolean debugLabelsList = true; /** * Ali se opravi testni izpis dogajanja na skladu.