feat: implement .loc, .file and .func debug directives
This commit is contained in:
@@ -2,6 +2,7 @@ package wacc
|
||||
|
||||
import scala.collection.mutable
|
||||
import cats.data.Chain
|
||||
import wacc.ast.Position
|
||||
|
||||
private class LabelGenerator {
|
||||
import assemblyIR._
|
||||
@@ -9,7 +10,9 @@ private class LabelGenerator {
|
||||
import asmGenerator.escaped
|
||||
|
||||
private val strings = mutable.HashMap[String, String]()
|
||||
private val files = mutable.HashMap[String, Int]()
|
||||
private var labelVal = -1
|
||||
private var permittedFuncFile: Option[String] = None
|
||||
|
||||
/** Get an arbitrary label. */
|
||||
def getLabel(): String = {
|
||||
@@ -39,6 +42,25 @@ private class LabelGenerator {
|
||||
def getLabelArg(src: String, name: String): LabelArg =
|
||||
LabelArg(strings.getOrElseUpdate(src, s".L.$name.str${strings.size}"))
|
||||
|
||||
/** Get a debug directive for a file. */
|
||||
def getDebugFile(file: java.io.File): Int =
|
||||
files.getOrElseUpdate(file.getCanonicalPath, files.size)
|
||||
|
||||
/** Get a debug directive for a function. */
|
||||
def getDebugFunc(pos: Position, name: String, label: LabelDef): Chain[AsmLine] = {
|
||||
permittedFuncFile match {
|
||||
case Some(f) if f != pos.file.getCanonicalPath => Chain.empty
|
||||
case _ =>
|
||||
permittedFuncFile = Some(pos.file.getCanonicalPath)
|
||||
Chain(
|
||||
LabelDef(name),
|
||||
Directive.Location(getDebugFile(pos.file), pos.line, None),
|
||||
Directive.Type(label, SymbolType.Function),
|
||||
Directive.Func(name, label)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/** Generate the assembly labels for constants that were labelled using the LabelGenerator. */
|
||||
def generateConstants: Chain[AsmLine] =
|
||||
strings.foldLeft(Chain.empty) { case (acc, (str, label)) =>
|
||||
@@ -47,4 +69,10 @@ private class LabelGenerator {
|
||||
Directive.Asciz(str.escaped)
|
||||
)
|
||||
}
|
||||
|
||||
/** Generates debug directives that were created using the LabelGenerator. */
|
||||
def generateDebug: Chain[AsmLine] =
|
||||
files.foldLeft(Chain.empty) { case (acc, (file, no)) =>
|
||||
acc :+ Directive.File(no, file)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user