diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index fe30af7..6fbbd82 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -99,17 +99,13 @@ object asmGenerator { ).toList } - def wrapFunc(labelName: String, funcBody: Chain[AsmLine])(using - stack: Stack, - strings: ListBuffer[String] + private def wrapBuiltinFunc(labelName: String, funcBody: Chain[AsmLine])(using + stack: Stack ): Chain[AsmLine] = { - var chain = Chain.empty[AsmLine] - - chain += LabelDef(labelName) + var chain = Chain.one[AsmLine](LabelDef(labelName)) chain ++= funcPrologue() chain ++= funcBody chain ++= funcEpilogue() - chain } @@ -120,13 +116,15 @@ object asmGenerator { given stack: Stack = Stack() // Setup the stack with param 7 and up func.params.drop(argRegs.size).foreach(stack.reserve(_)) - var chain = Chain.empty[AsmLine] + var chain = Chain.one[AsmLine](LabelDef(labelGenerator.getLabel(func.name))) + chain ++= funcPrologue() // Push the rest of params onto the stack for simplicity argRegs.zip(func.params).foreach { (reg, param) => chain += stack.push(param, reg) } chain ++= func.body.foldMap(generateStmt(_)) - wrapFunc(labelGenerator.getLabel(func.name), chain) + // No need for epilogue here since all user functions must return explicitly + chain } def generateBuiltInFuncs()(using @@ -136,12 +134,12 @@ object asmGenerator { ): Chain[AsmLine] = { var chain = Chain.empty[AsmLine] - chain ++= wrapFunc( + chain ++= wrapBuiltinFunc( labelGenerator.getLabel(Builtin.Exit), Chain(stack.align(), assemblyIR.Call(CLibFunc.Exit)) ) - chain ++= wrapFunc( + chain ++= wrapBuiltinFunc( labelGenerator.getLabel(Builtin.Printf), Chain( stack.align(), @@ -151,14 +149,14 @@ object asmGenerator { ) ) - chain ++= wrapFunc( + chain ++= wrapBuiltinFunc( labelGenerator.getLabel(Builtin.Malloc), Chain.one(stack.align()) ) - chain ++= wrapFunc(labelGenerator.getLabel(Builtin.Free), Chain.empty) + chain ++= wrapBuiltinFunc(labelGenerator.getLabel(Builtin.Free), Chain.empty) - chain ++= wrapFunc( + chain ++= wrapBuiltinFunc( labelGenerator.getLabel(Builtin.Read), Chain( stack.align(),