IR: rename <CODE> to <CHUNK> , put the code lines in a new sub node <CODE> for improved xml structure

This commit is contained in:
Irmen de Jong
2025-10-01 19:32:05 +02:00
parent 9d3b2f12fd
commit 4187f97f7a
4 changed files with 23 additions and 18 deletions

View File

@@ -1,7 +1,7 @@
TODO TODO
==== ====
IR: rename <CODE> to <CHUNK> , put the code lines in a new sub node <CODE> for improved xml structure. IR: register type error when compiling examples/textelite with expericodegen
TestVMCodegen: add tests for SSA block split/joins/check last instruction to be a valid SSE block ender TestVMCodegen: add tests for SSA block split/joins/check last instruction to be a valid SSE block ender

View File

@@ -404,7 +404,7 @@ class IRFileReader {
require(start.name.localPart=="INITGLOBALS") { "missing INITGLOBALS" } require(start.name.localPart=="INITGLOBALS") { "missing INITGLOBALS" }
skipText(reader) skipText(reader)
val chunk: IRCodeChunk = if(reader.peek().isStartElement) val chunk: IRCodeChunk = if(reader.peek().isStartElement)
parseCodeChunk(reader) parseCodeBlock(reader)
else else
IRCodeChunk(null, null) IRCodeChunk(null, null)
skipText(reader) skipText(reader)
@@ -412,10 +412,10 @@ class IRFileReader {
return chunk return chunk
} }
private fun parseCodeChunk(reader: XMLEventReader): IRCodeChunk { private fun parseCodeBlock(reader: XMLEventReader): IRCodeChunk {
skipText(reader) skipText(reader)
val codeStart = reader.nextEvent().asStartElement() val chunkStart = reader.nextEvent().asStartElement()
require(codeStart.name.localPart=="CODE") { "missing CODE" } require(chunkStart.name.localPart=="CHUNK") { "missing CHUNK" }
// now skip <REGS> as it is informational // now skip <REGS> as it is informational
val regsStart = reader.nextEvent().asStartElement() val regsStart = reader.nextEvent().asStartElement()
@@ -428,7 +428,10 @@ class IRFileReader {
reader.nextEvent() // skip the P8SRC node reader.nextEvent() // skip the P8SRC node
while(!reader.nextEvent().isEndElement) { /* skip until end of P8SRC node */ } while(!reader.nextEvent().isEndElement) { /* skip until end of P8SRC node */ }
} }
val label = codeStart.attributes.asSequence().singleOrNull { it.name.localPart == "LABEL" }?.value?.ifBlank { null } val label = chunkStart.attributes.asSequence().singleOrNull { it.name.localPart == "LABEL" }?.value?.ifBlank { null }
val codeStart = reader.nextEvent().asStartElement()
require(codeStart.name.localPart=="CODE") { "missing CODE" }
val text = readText(reader).trim() val text = readText(reader).trim()
val chunk = IRCodeChunk(label, null) val chunk = IRCodeChunk(label, null)
if(text.isNotBlank()) { if(text.isNotBlank()) {
@@ -447,7 +450,8 @@ class IRFileReader {
} }
} }
require(reader.nextEvent().isEndElement) require(reader.nextEvent().isEndElement) // close CODE
require(reader.nextEvent().isEndElement) // close CHUNK
return chunk return chunk
} }
@@ -484,8 +488,8 @@ class IRFileReader {
"ASMSUB" -> block += parseAsmSubroutine(reader) "ASMSUB" -> block += parseAsmSubroutine(reader)
"ASM" -> block += parseInlineAssembly(reader) "ASM" -> block += parseInlineAssembly(reader)
"BYTES" -> block += parseBinaryBytes(reader) "BYTES" -> block += parseBinaryBytes(reader)
"CODE" -> { "CB" -> {
val chunk = parseCodeChunk(reader) val chunk = parseCodeBlock(reader)
if(chunk.isNotEmpty() || chunk.label==null) if(chunk.isNotEmpty() || chunk.label==null)
throw IRParseException("code chunk in block should only contain a label name") throw IRParseException("code chunk in block should only contain a label name")
block += chunk block += chunk
@@ -513,7 +517,7 @@ class IRFileReader {
skipText(reader) skipText(reader)
while(reader.peek().isStartElement) { while(reader.peek().isStartElement) {
sub += when(reader.peek().asStartElement().name.localPart) { sub += when(reader.peek().asStartElement().name.localPart) {
"CODE" -> parseCodeChunk(reader) "CHUNK" -> parseCodeBlock(reader)
"BYTES" -> parseBinaryBytes(reader) "BYTES" -> parseBinaryBytes(reader)
"ASM" -> parseInlineAssembly(reader) "ASM" -> parseInlineAssembly(reader)
else -> throw IRParseException("invalid line in SUB: ${reader.peek()}") else -> throw IRParseException("invalid line in SUB: ${reader.peek()}")

View File

@@ -151,15 +151,15 @@ class IRFileWriter(private val irProgram: IRProgram, outfileOverride: Path?) {
regs.append(" write: ${usedRegs.writeFpRegs.toSortedMap().map { (reg, amount) -> "fr$reg=${amount}" }}\n") regs.append(" write: ${usedRegs.writeFpRegs.toSortedMap().map { (reg, amount) -> "fr$reg=${amount}" }}\n")
} }
xml.writeStartElement("CODE") xml.writeStartElement("CHUNK")
chunk.label?.let { xml.writeAttribute("LABEL", chunk.label) } chunk.label?.let { xml.writeAttribute("LABEL", chunk.label) }
// xml.writeAttribute("used-registers", chunk.usedRegisters().toString()) // xml.writeAttribute("used-registers", chunk.usedRegisters().toString())
xml.writeStartElement("REGS") xml.writeStartElement("REGS")
xml.writeCData(regs.toString()) xml.writeCData(regs.toString())
xml.writeEndElement() xml.writeEndElement()
writeSourcelines(xml, chunk) writeSourcelines(xml, chunk)
xml.writeStartElement("CODE")
xml.writeCharacters("\n") xml.writeCharacters("\n")
chunk.instructions.forEach { instr -> chunk.instructions.forEach { instr ->
numInstr++ numInstr++
@@ -167,6 +167,7 @@ class IRFileWriter(private val irProgram: IRProgram, outfileOverride: Path?) {
xml.writeCharacters("\n") xml.writeCharacters("\n")
} }
xml.writeEndElement() xml.writeEndElement()
xml.writeEndElement()
xml.writeCharacters("\n") xml.writeCharacters("\n")
} }

View File

@@ -80,18 +80,18 @@ ubyte main.thing=42
</MEMORYSLABS> </MEMORYSLABS>
<INITGLOBALS> <INITGLOBALS>
<CODE><REGS>dummy</REGS> <CHUNK><REGS>dummy</REGS><CODE>
load.b r1,42 load.b r1,42
</CODE> </CODE></CHUNK>
</INITGLOBALS> </INITGLOBALS>
<BLOCK NAME="main" ADDRESS="" LIBRARY="false" FORCEOUTPUT="false" NOPREFIXING="false" VERAFXMULS="false" ALIGN="NONE" POS="[examples/test.p8: line 2 col 2-5]"> <BLOCK NAME="main" ADDRESS="" LIBRARY="false" FORCEOUTPUT="false" NOPREFIXING="false" VERAFXMULS="false" ALIGN="NONE" POS="[examples/test.p8: line 2 col 2-5]">
<SUB NAME="main.start" RETURNS="" POS="[examples/test.p8: line 4 col 6-8]"> <SUB NAME="main.start" RETURNS="" POS="[examples/test.p8: line 4 col 6-8]">
<PARAMS> <PARAMS>
</PARAMS> </PARAMS>
<CODE LABEL="main.start"><REGS>dummy</REGS> <CHUNK LABEL="main.start"><REGS>dummy</REGS><CODE>
return return
</CODE> </CODE></CHUNK>
</SUB> </SUB>
</BLOCK> </BLOCK>
@@ -103,9 +103,9 @@ uword sys.wait.jiffies
<ASM LABEL="sys.wait" IR="true" POS="[library:/prog8lib/virtual/syslib.p8: line 17 col 10-13]"> <ASM LABEL="sys.wait" IR="true" POS="[library:/prog8lib/virtual/syslib.p8: line 17 col 10-13]">
loadm.w r0,sys.wait.jiffies loadm.w r0,sys.wait.jiffies
</ASM> </ASM>
<CODE><REGS>dummy</REGS> <CHUNK><REGS>dummy</REGS><CODE>
return return
</CODE> </CODE></CHUNK>
</SUB> </SUB>
</BLOCK> </BLOCK>
</PROGRAM> </PROGRAM>