refactor: do not append epilogue to user functions since they all return anyway

This commit is contained in:
Gleb Koval 2025-02-26 18:45:03 +00:00
parent c748a34e4c
commit 16de964f74
Signed by: cyclane
GPG Key ID: 15E168A8B332382C

View File

@ -99,17 +99,13 @@ object asmGenerator {
).toList ).toList
} }
def wrapFunc(labelName: String, funcBody: Chain[AsmLine])(using private def wrapBuiltinFunc(labelName: String, funcBody: Chain[AsmLine])(using
stack: Stack, stack: Stack
strings: ListBuffer[String]
): Chain[AsmLine] = { ): Chain[AsmLine] = {
var chain = Chain.empty[AsmLine] var chain = Chain.one[AsmLine](LabelDef(labelName))
chain += LabelDef(labelName)
chain ++= funcPrologue() chain ++= funcPrologue()
chain ++= funcBody chain ++= funcBody
chain ++= funcEpilogue() chain ++= funcEpilogue()
chain chain
} }
@ -120,13 +116,15 @@ object asmGenerator {
given stack: Stack = Stack() given stack: Stack = Stack()
// Setup the stack with param 7 and up // Setup the stack with param 7 and up
func.params.drop(argRegs.size).foreach(stack.reserve(_)) 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 // Push the rest of params onto the stack for simplicity
argRegs.zip(func.params).foreach { (reg, param) => argRegs.zip(func.params).foreach { (reg, param) =>
chain += stack.push(param, reg) chain += stack.push(param, reg)
} }
chain ++= func.body.foldMap(generateStmt(_)) 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 def generateBuiltInFuncs()(using
@ -136,12 +134,12 @@ object asmGenerator {
): Chain[AsmLine] = { ): Chain[AsmLine] = {
var chain = Chain.empty[AsmLine] var chain = Chain.empty[AsmLine]
chain ++= wrapFunc( chain ++= wrapBuiltinFunc(
labelGenerator.getLabel(Builtin.Exit), labelGenerator.getLabel(Builtin.Exit),
Chain(stack.align(), assemblyIR.Call(CLibFunc.Exit)) Chain(stack.align(), assemblyIR.Call(CLibFunc.Exit))
) )
chain ++= wrapFunc( chain ++= wrapBuiltinFunc(
labelGenerator.getLabel(Builtin.Printf), labelGenerator.getLabel(Builtin.Printf),
Chain( Chain(
stack.align(), stack.align(),
@ -151,14 +149,14 @@ object asmGenerator {
) )
) )
chain ++= wrapFunc( chain ++= wrapBuiltinFunc(
labelGenerator.getLabel(Builtin.Malloc), labelGenerator.getLabel(Builtin.Malloc),
Chain.one(stack.align()) 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), labelGenerator.getLabel(Builtin.Read),
Chain( Chain(
stack.align(), stack.align(),