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
}
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(),