diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..f4e6621 --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +mvn clean package -e diff --git a/generate_assembly_r.sh b/generate_assembly_r.sh new file mode 100755 index 0000000..fb40b97 --- /dev/null +++ b/generate_assembly_r.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FILENAME=$1 + +if [ -z "$1" ] ; then + echo "FILENAME is missing" + exit 1 +fi + +echo "Generating assembly code for file ${FILENAME}" + +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrr ${FILENAME} diff --git a/generate_assembly_s.sh b/generate_assembly_s.sh new file mode 100755 index 0000000..129dd7f --- /dev/null +++ b/generate_assembly_s.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FILENAME=$1 + +if [ -z "$1" ] ; then + echo "FILENAME is missing" + exit 1 +fi + +echo "Generating assembly code for file ${FILENAME}" + +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrs ${FILENAME} diff --git a/run_r.sh b/run_r.sh new file mode 100755 index 0000000..2ab3ab0 --- /dev/null +++ b/run_r.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FILENAME=$1 + +if [ -z "$1" ] ; then + echo "FILENAME is missing" + exit 1 +fi + +echo "Running file ${FILENAME}" + +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrr --run ${FILENAME} diff --git a/run_s.sh b/run_s.sh new file mode 100755 index 0000000..9d41415 --- /dev/null +++ b/run_s.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FILENAME=$1 + +if [ -z "$1" ] ; then + echo "FILENAME is missing" + exit 1 +fi + +echo "Running file ${FILENAME}" + +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrs --run ${FILENAME} diff --git a/src/main/asm/chocopy/common/allChars.s b/src/main/asm/chocopy/common/allChars.s new file mode 100644 index 0000000..0058fdd --- /dev/null +++ b/src/main/asm/chocopy/common/allChars.s @@ -0,0 +1,2 @@ +.space 5120 + .text \ No newline at end of file diff --git a/src/main/asm/chocopy/common/initchars.s b/src/main/asm/chocopy/common/initchars.s new file mode 100644 index 0000000..ffd40c3 --- /dev/null +++ b/src/main/asm/chocopy/common/initchars.s @@ -0,0 +1,22 @@ + la a0, $str$prototype + lw t0, 0(a0) + lw t1, 4(a0) + lw t2, 8(a0) + li t3, 1 + la a0, allChars + li t4, 256 + mv t5, zero +initchars_1: + sw t0, 0(a0) + sw t1, 4(a0) + sw t2, 8(a0) + sw t3, 12(a0) + sw t5, 16(a0) + addi a0, a0, 20 + addi t5, t5, 1 + bne t4, t5, initchars_1 + jr ra + .data + .align 2 + + \ No newline at end of file diff --git a/src/main/asm/chocopy/common/makeint.s b/src/main/asm/chocopy/common/makeint.s index 7fd541d..9fbf065 100644 --- a/src/main/asm/chocopy/common/makeint.s +++ b/src/main/asm/chocopy/common/makeint.s @@ -1,11 +1,11 @@ - - addi sp, sp, -8 - sw ra, 4(sp) - sw a0, 0(sp) - la a0, $int$prototype - jal ra, alloc - lw t0, 0(sp) - sw t0, @.__int__(a0) - lw ra, 4(sp) - addi sp, sp, 8 - jr ra \ No newline at end of file +# Box integer + addi sp, sp, -8 + sw ra, 4(sp) + sw a0, 0(sp) + la a0, $int$prototype + jal ra, alloc + lw t0, 0(sp) + sw t0, @.__int__(a0) + lw ra, 4(sp) + addi sp, sp, 8 + jr ra \ No newline at end of file diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index 06bf552..d75e2b8 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -1,18 +1,18 @@ package chocopy.pa3; -import java.net.Socket; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Stack; -import chocopy.common.analysis.AbstractNodeAnalyzer; -import chocopy.common.analysis.SymbolTable; +import chocopy.common.analysis.*; import chocopy.common.astnodes.*; import chocopy.common.analysis.types.*; import chocopy.common.codegen.*; -import static chocopy.common.codegen.RiscVBackend.Register.*; import chocopy.common.codegen.RiscVBackend.Register; +import static chocopy.common.codegen.RiscVBackend.Register.*; /** @@ -33,15 +33,15 @@ public class CodeGenImpl extends CodeGenBase { /** Label for built-in routines. */ protected final Label makeintLabel = new Label("makeint"); - protected final Label strneqlLablel = new Label("strneql"); - protected final Label streqlLablel = new Label("streql"); - protected final Label makeboolLablel = new Label("makebool"); - protected final Label strcatLablel = new Label("strcat"); - protected final Label concatLablel = new Label("concat"); - protected final Label conslistLablel = new Label("conslist"); - - - + protected final Label strneqlLabel = new Label("strneql"); + protected final Label streqlLabel = new Label("streql"); + protected final Label makeboolLabel = new Label("makebool"); + protected final Label strcatLabel = new Label("strcat"); + protected final Label concatLabel = new Label("concat"); + protected final Label conslistLabel = new Label("conslist"); + protected final Label initcharsLabel = new Label("initchars"); + protected final Label allCharsLabel = new Label("allChars"); + /** Operation on None. */ private final Label errorNone = new Label("error.None"); @@ -56,8 +56,12 @@ public class CodeGenImpl extends CodeGenBase /** A code generator emitting instructions to BACKEND. */ public CodeGenImpl(RiscVBackend backend) { + super(backend); - + backend.defineSym("listHeaderWords", "4"); + backend.defineSym("strHeaderWords", "4"); + backend.defineSym("bool.True", "const_1"); + backend.defineSym("bool.False", "const_0"); } @@ -76,16 +80,19 @@ public class CodeGenImpl extends CodeGenBase */ protected void emitTopLevel(List statements) { + StmtAnalyzer stmtAnalyzer = new StmtAnalyzer(null); backend.emitADDI(SP, SP, -2 * backend.getWordSize(), "Saved FP and saved RA (unused at top level)."); backend.emitSW(ZERO, SP, 0, "Top saved FP is 0."); backend.emitSW(ZERO, SP, 4, "Top saved RA is 0."); backend.emitADDI(FP, SP, 2 * backend.getWordSize(), "Set FP to previous SP."); - + backend.emitJAL(initcharsLabel,"Initialize one-character strings"); for (Stmt stmt : statements) { stmt.dispatch(stmtAnalyzer); } + stmtAnalyzer.emitSizeLabel(); + backend.emitLI(A0, EXIT_ECALL, "Code for ecall: exit"); backend.emitEcall(null); } @@ -109,9 +116,8 @@ public class CodeGenImpl extends CodeGenBase // space for return address = 1 // space for control link = 1 // space for static link = 1 - // space for params = num of params // space for locals = num of locals - int requiredStackSpace = (1 + 1 + 1 + funcInfo.getLocals().size() + funcInfo.getParams().size())*wordSize; + int requiredStackSpace = (1 + 1 + 1 + funcInfo.getLocals().size())*wordSize; backend.emitADDI(SP, SP, -requiredStackSpace, "Reserve space for stack frame."); backend.emitSW(RA, SP, requiredStackSpace-4, "return address"); @@ -122,27 +128,26 @@ public class CodeGenImpl extends CodeGenBase StmtAnalyzer stmtAnalyzer = new StmtAnalyzer(funcInfo); - int emptySlotNum = 4; + int emptySlotNum = 3; for (StackVarInfo var : funcInfo.getLocals()) { - // store at requiredStackSpace-emptySlotNum*wordSize(SP), then emptySlotNum++ - Literal varLitral = var.getInitialValue(); - varLitral.dispatch(stmtAnalyzer); + Literal varLiteral = var.getInitialValue(); + varLiteral.dispatch(stmtAnalyzer); // All Literals should save locations for the values in A0 backend.emitSW(A0, SP, requiredStackSpace-emptySlotNum*wordSize, "Push local variable " + var.getVarName() + " onto stack"); emptySlotNum++; } + // --- Function Body --- // statements load all the variables that caller put on stack // statements use fp to load the variables // example: 0(fp) is the last variable (z) while 8(fp) is the first variable (x) // for function with 3 params f(x, y, z) for (Stmt stmt : funcInfo.getStatements()) { - //System.out.println(stmt.toString()); stmt.dispatch(stmtAnalyzer); } + stmtAnalyzer.emitSizeLabel(); backend.emitJ(stmtAnalyzer.epilogue, "Jump to function epilogue"); - // --- Epilogue --- @@ -192,16 +197,48 @@ public class CodeGenImpl extends CodeGenBase private final FuncInfo funcInfo; /** Label of code that exits from block. */ - protected Label elseBlock; + protected Stack