refactor: do not append epilogue to user functions since they all return anyway
This commit is contained in:
parent
c748a34e4c
commit
16de964f74
@ -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(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user