mirror of
https://github.com/irmen/prog8.git
synced 2025-11-05 01:16:10 +00:00
IR: rename <CODE> to <CHUNK> , put the code lines in a new sub node <CODE> for improved xml structure
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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()}")
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user