2022-08-21 17:21:29 +02:00
|
|
|
package prog8.codegen.experimental
|
|
|
|
|
|
|
|
import prog8.code.SymbolTable
|
2022-09-19 18:09:56 +02:00
|
|
|
import prog8.code.ast.PtProgram
|
2023-04-07 22:34:23 +02:00
|
|
|
import prog8.code.core.CompilationOptions
|
2025-02-24 22:06:52 +01:00
|
|
|
import prog8.code.IAssemblyProgram
|
|
|
|
import prog8.code.ICodeGeneratorBackend
|
2023-04-07 22:34:23 +02:00
|
|
|
import prog8.code.core.IErrorReporter
|
2022-09-19 19:41:43 +02:00
|
|
|
import prog8.codegen.intermediate.IRCodeGen
|
2022-09-19 18:09:56 +02:00
|
|
|
import prog8.intermediate.IRFileWriter
|
|
|
|
|
2023-02-12 23:49:48 +01:00
|
|
|
class ExperiCodeGen: ICodeGeneratorBackend {
|
|
|
|
override fun generate(
|
|
|
|
program: PtProgram,
|
|
|
|
symbolTable: SymbolTable,
|
|
|
|
options: CompilationOptions,
|
|
|
|
errors: IErrorReporter
|
2023-07-30 18:42:45 +02:00
|
|
|
): IAssemblyProgram {
|
2023-03-16 02:27:30 +01:00
|
|
|
|
2022-09-19 18:09:56 +02:00
|
|
|
// you could write a code generator directly on the PtProgram AST,
|
|
|
|
// but you can also use the Intermediate Representation to build a codegen on:
|
2022-09-19 19:41:43 +02:00
|
|
|
val irCodeGen = IRCodeGen(program, symbolTable, options, errors)
|
2022-09-19 18:09:56 +02:00
|
|
|
val irProgram = irCodeGen.generate()
|
2025-01-03 04:14:11 +01:00
|
|
|
irProgram.verifyRegisterTypes(irCodeGen.registerTypes())
|
2022-08-21 17:21:29 +02:00
|
|
|
|
2022-09-19 18:09:56 +02:00
|
|
|
// this stub only writes the IR program to disk but doesn't generate anything else.
|
2022-09-26 14:44:24 +02:00
|
|
|
IRFileWriter(irProgram, null).write()
|
2022-08-21 19:01:53 +02:00
|
|
|
|
2022-09-19 18:09:56 +02:00
|
|
|
println("** experimental codegen stub: no assembly generated **")
|
2023-07-06 23:13:00 +02:00
|
|
|
return EmptyProgram
|
2022-08-21 19:01:53 +02:00
|
|
|
}
|
2023-07-06 23:13:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private object EmptyProgram : IAssemblyProgram {
|
|
|
|
override val name = "<Empty Program>"
|
|
|
|
override fun assemble(options: CompilationOptions, errors: IErrorReporter): Boolean {
|
|
|
|
println("** nothing assembled **")
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|