prog8/intermediate/test/TestIRFileInOut.kt

117 lines
3.3 KiB
Kotlin
Raw Normal View History

2022-09-21 00:59:36 +00:00
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.ints.shouldBeGreaterThan
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.instanceOf
import prog8.code.StStaticVariable
import prog8.code.core.CbmPrgLauncherType
import prog8.code.core.CompilationOptions
import prog8.code.core.OutputType
import prog8.code.core.ZeropageType
import prog8.code.target.Cx16Target
import prog8.intermediate.IRFileReader
import prog8.intermediate.IRFileWriter
import prog8.intermediate.IRProgram
import prog8.intermediate.IRSymbolTable
import kotlin.io.path.*
2022-09-21 00:59:36 +00:00
class TestIRFileInOut: FunSpec({
test("test IR writer") {
val target = Cx16Target()
val tempdir = Path(System.getProperty("java.io.tmpdir"))
2022-09-21 00:59:36 +00:00
val options = CompilationOptions(
OutputType.RAW,
CbmPrgLauncherType.NONE,
ZeropageType.DONTUSE,
emptyList(),
floats = false,
noSysInit = true,
compTarget = target,
loadAddress = target.machine.PROGRAM_LOAD_ADDRESS,
outputDir = tempdir
)
val program = IRProgram("unittest-irwriter", IRSymbolTable(null), options, target)
val writer = IRFileWriter(program, null)
val generatedFile = writer.write()
2022-09-21 00:59:36 +00:00
val lines = generatedFile.readLines()
2022-11-11 22:35:52 +00:00
lines[0] shouldBe "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
lines[1] shouldBe "<PROGRAM NAME=\"unittest-irwriter\">"
2022-09-21 00:59:36 +00:00
lines.last() shouldBe "</PROGRAM>"
generatedFile.deleteExisting()
lines.size shouldBeGreaterThan 20
}
test("test IR reader") {
2022-11-11 22:35:52 +00:00
val source="""<?xml version="1.0" encoding="utf-8"?>
<PROGRAM NAME="test-ir-reader">
2022-09-21 00:59:36 +00:00
<OPTIONS>
compTarget=virtual
output=PRG
launcher=BASIC
zeropage=KERNALSAFE
loadAddress=0
dontReinitGlobals=true
2022-09-21 00:59:36 +00:00
evalStackBaseAddress=null
</OPTIONS>
<ASMSYMBOLS>
</ASMSYMBOLS>
<BSS>
uword sys.bssvar zp=DONTCARE
</BSS>
2022-09-21 00:59:36 +00:00
<VARIABLES>
uword sys.wait.jiffies=10 zp=DONTCARE
2022-09-21 00:59:36 +00:00
</VARIABLES>
<MEMORYMAPPEDVARIABLES>
2022-11-11 22:35:52 +00:00
@uword cx16.r0=65282
2022-09-21 00:59:36 +00:00
</MEMORYMAPPEDVARIABLES>
<MEMORYSLABS>
</MEMORYSLABS>
<INITGLOBALS>
<CODE>
2022-09-21 00:59:36 +00:00
load.b r1,42
</CODE>
2022-09-21 00:59:36 +00:00
</INITGLOBALS>
2022-11-11 22:35:52 +00:00
<BLOCK NAME="main" ADDRESS="null" ALIGN="NONE" POS="[examples/test.p8: line 2 col 2-5]">
<SUB NAME="main.start" RETURNTYPE="null" POS="[examples/test.p8: line 4 col 6-8]">
2022-09-21 00:59:36 +00:00
<PARAMS>
</PARAMS>
<CODE LABEL="main.start">
2022-09-21 00:59:36 +00:00
return
</CODE>
2022-09-21 00:59:36 +00:00
</SUB>
</BLOCK>
2022-11-11 22:35:52 +00:00
<BLOCK NAME="sys" ADDRESS="null" ALIGN="NONE" POS="[library:/prog8lib/virtual/syslib.p8: line 3 col 2-4]">
<SUB NAME="sys.wait" RETURNTYPE="null" POS="[library:/prog8lib/virtual/syslib.p8: line 15 col 6-8]">
2022-09-21 00:59:36 +00:00
<PARAMS>
uword sys.wait.jiffies
</PARAMS>
2022-11-11 22:35:52 +00:00
<INLINEASM LABEL="sys.wait" IR="true" POS="[library:/prog8lib/virtual/syslib.p8: line 17 col 10-13]">
2022-09-21 00:59:36 +00:00
loadm.w r0,sys.wait.jiffies
syscall 13
</INLINEASM>
<CODE>
2022-09-21 00:59:36 +00:00
return
</CODE>
2022-09-21 00:59:36 +00:00
</SUB>
</BLOCK>
</PROGRAM>
"""
val tempfile = createTempFile(suffix = ".p8ir")
2022-09-21 00:59:36 +00:00
tempfile.writeText(source)
val program = IRFileReader().read(tempfile)
2022-09-21 00:59:36 +00:00
tempfile.deleteExisting()
program.name shouldBe "test-ir-reader"
program.blocks.size shouldBe 2
program.st.allVariables().count() shouldBe 2
val var1 = program.st.lookup("sys.wait.jiffies") as StStaticVariable
val var2 = program.st.lookup("sys.bssvar") as StStaticVariable
var1.bss shouldBe false
var2.bss shouldBe true
2022-09-21 00:59:36 +00:00
}
})