From 68435207fec8c19955da3ea740f9de5c77ee368d Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 14 Mar 2025 15:51:34 +0000 Subject: [PATCH] fix: include correct main position and don't re-create label --- src/main/wacc/backend/LabelGenerator.scala | 4 ++-- src/main/wacc/backend/asmGenerator.scala | 6 +----- src/main/wacc/backend/assemblyIR.scala | 12 ++++++------ src/main/wacc/frontend/microWacc.scala | 2 +- src/main/wacc/frontend/renamer.scala | 2 +- src/main/wacc/frontend/semantics.scala | 2 +- 6 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/wacc/backend/LabelGenerator.scala b/src/main/wacc/backend/LabelGenerator.scala index 7653cb4..8eb9a22 100644 --- a/src/main/wacc/backend/LabelGenerator.scala +++ b/src/main/wacc/backend/LabelGenerator.scala @@ -51,9 +51,9 @@ private class LabelGenerator { permittedFuncFile match { case Some(f) if f != pos.file.getCanonicalPath => Chain.empty case _ => + val customLabel = if name == "main" then Chain.empty else Chain(LabelDef(name)) permittedFuncFile = Some(pos.file.getCanonicalPath) - Chain( - LabelDef(name), + customLabel ++ Chain( Directive.Location(getDebugFile(pos.file), pos.line, None), Directive.Type(label, SymbolType.Function), Directive.Func(name, label) diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 4c31386..4b18a6c 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -37,11 +37,7 @@ object asmGenerator { val Program(funcs, main) = microProg val mainLabel = LabelDef("main") - val mainAsm = main.headOption match { - case Some(stmt) => - labelGenerator.getDebugFunc(stmt.pos, "$main", mainLabel) + mainLabel - case None => Chain.one(mainLabel) - } + val mainAsm = labelGenerator.getDebugFunc(microProg.pos, "main", mainLabel) + mainLabel val progAsm = mainAsm.concatAll( funcPrologue(), main.foldMap(generateStmt(_)), diff --git a/src/main/wacc/backend/assemblyIR.scala b/src/main/wacc/backend/assemblyIR.scala index a6dbe20..0d20356 100644 --- a/src/main/wacc/backend/assemblyIR.scala +++ b/src/main/wacc/backend/assemblyIR.scala @@ -210,12 +210,12 @@ object assemblyIR { case Size(label: LabelDef, expr: SizeExpr) override def toString(): String = this match { - case IntelSyntax => ".intel_syntax noprefix" - case Global(name) => s".globl $name" - case Text => ".text" - case RoData => ".section .rodata" - case Int(value) => s"\t.int $value" - case Asciz(string) => s"\t.asciz \"$string\"" + case IntelSyntax => ".intel_syntax noprefix" + case Global(name) => s".globl $name" + case Text => ".text" + case RoData => ".section .rodata" + case Int(value) => s"\t.int $value" + case Asciz(string) => s"\t.asciz \"$string\"" case File(no, file) => s".file $no \"${file}\"" case Location(fileNo, lineNo, colNo) => s"\t.loc $fileNo $lineNo" + colNo.map(c => s" $c").getOrElse("") diff --git a/src/main/wacc/frontend/microWacc.scala b/src/main/wacc/frontend/microWacc.scala index d99e67a..5a60ed7 100644 --- a/src/main/wacc/frontend/microWacc.scala +++ b/src/main/wacc/frontend/microWacc.scala @@ -93,5 +93,5 @@ object microWacc { // Program case class FuncDecl(name: Ident, params: List[Ident], body: Chain[Stmt])(val pos: Position) - case class Program(funcs: Chain[FuncDecl], stmts: Chain[Stmt]) + case class Program(funcs: Chain[FuncDecl], stmts: Chain[Stmt])(val pos: Position) } diff --git a/src/main/wacc/frontend/renamer.scala b/src/main/wacc/frontend/renamer.scala index b16df04..a15a31f 100644 --- a/src/main/wacc/frontend/renamer.scala +++ b/src/main/wacc/frontend/renamer.scala @@ -200,7 +200,7 @@ object renamer { (chunks :+ func, errors ++ scope.add(name, public = true)) } // ...and main body. - val mainBodyIdent = Ident(MAIN, ty = FuncType(?, Nil))(prog.pos) + val mainBodyIdent = Ident(MAIN, ty = FuncType(?, Nil))(main.head.pos) val mainBodyErrors = scope.add(mainBodyIdent, public = false) val mainBodyChunk = FuncDecl(IntType()(prog.pos), mainBodyIdent, Nil, main)(prog.pos) diff --git a/src/main/wacc/frontend/semantics.scala b/src/main/wacc/frontend/semantics.scala index dcc5b94..9578e8a 100644 --- a/src/main/wacc/frontend/semantics.scala +++ b/src/main/wacc/frontend/semantics.scala @@ -36,7 +36,7 @@ object semantics { case Some((head, tail)) => (head.body, tail) case None => (Chain.empty, Chain.empty) } - } yield (microWacc.Program(funcs, typedMain), globalErrors ++ errors) + } yield (microWacc.Program(funcs, typedMain)(main.pos), globalErrors ++ errors) } }