WIP on IR

This commit is contained in:
2023-11-22 07:23:33 -08:00
parent 76290a401a
commit 2d88666f05
35 changed files with 532 additions and 0 deletions

7
bir/build.gradle.kts Normal file
View File

@ -0,0 +1,7 @@
plugins {
id("gay.pizza.pork.module")
}
dependencies {
implementation(project(":common"))
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrAccess(val target: IrSymbol) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrBreak(val target: IrSymbol) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
}

View File

@ -0,0 +1,13 @@
package gay.pizza.pork.bir
data class IrCall(
val target: IrSymbol,
val arguments: List<IrCodeElement>,
val variableArguments: List<IrCodeElement>?
) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
arguments.forEach(block)
variableArguments?.forEach(block)
}
}

View File

@ -0,0 +1,3 @@
package gay.pizza.pork.bir
data class IrCodeBlock(val items: List<IrCodeElement>) : IrCodeElement

View File

@ -0,0 +1,3 @@
package gay.pizza.pork.bir
sealed interface IrCodeElement : IrElement

View File

@ -0,0 +1,13 @@
package gay.pizza.pork.bir
data class IrConditional(
val conditional: IrCodeElement,
val ifTrue: IrCodeElement,
val ifFalse: IrCodeElement
) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(conditional)
block(ifTrue)
block(ifFalse)
}
}

View File

@ -0,0 +1,12 @@
package gay.pizza.pork.bir
sealed interface IrConstant : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {}
}
data class IrIntegerConstant(val value: Int) : IrConstant
data class IrLongConstant(val value: Long) : IrConstant
data class IrDoubleConstant(val value: Double) : IrConstant
data class IrStringConstant(val value: String) : IrConstant
data class IrBooleanConstant(val value: Boolean) : IrConstant
data object IrNoneConstant : IrConstant

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrContinue(val target: IrSymbol) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
}

View File

@ -0,0 +1,12 @@
package gay.pizza.pork.bir
data class IrDefinition(
val symbol: IrSymbol,
val type: IrDefinitionType,
val code: IrCodeBlock
) : IrElement {
override fun crawl(block: (IrElement) -> Unit) {
block(symbol)
block(code)
}
}

View File

@ -0,0 +1,6 @@
package gay.pizza.pork.bir
enum class IrDefinitionType {
Variable,
Function
}

View File

@ -0,0 +1,5 @@
package gay.pizza.pork.bir
sealed interface IrElement {
fun crawl(block: (IrElement) -> Unit)
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
data class IrInfix(val op: IrInfixOp, val left: IrCodeElement, val right: IrCodeElement) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(left)
block(right)
}
}

View File

@ -0,0 +1,21 @@
package gay.pizza.pork.bir
enum class IrInfixOp {
Add,
Subtract,
Multiply,
Divide,
Equals,
NotEquals,
EuclideanModulo,
Remainder,
Lesser,
Greater,
LesserEqual,
GreaterEqual,
BooleanAnd,
BooleanOr,
BinaryAnd,
BinaryOr,
BinaryExclusiveOr
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrList(val items: List<IrCodeElement>) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
items.forEach(block)
}
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrLoad(val symbol: IrSymbol) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(symbol)
}
}

View File

@ -0,0 +1,9 @@
package gay.pizza.pork.bir
data class IrLoop(val symbol: IrSymbol, val condition: IrCodeElement, val inner: IrCodeElement) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(symbol)
block(condition)
block(inner)
}
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrPrefix(val op: IrPrefixOp, val value: IrCodeElement) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(value)
}
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
enum class IrPrefixOp {
BooleanNot,
UnaryPlus,
UnaryMinus,
BinaryNot
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
data class IrReturn(val from: IrSymbol, val value: IrCodeElement) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
block(from)
block(value)
}
}

View File

@ -0,0 +1,11 @@
package gay.pizza.pork.bir
data class IrSlab(
val location: IrSlabLocation,
val definitions: List<IrDefinition>
) : IrElement {
override fun crawl(block: (IrElement) -> Unit) {
block(location)
definitions.forEach(block)
}
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
data class IrSlabLocation(
val form: String,
val path: String
) : IrElement {
override fun crawl(block: (IrElement) -> Unit) {}
}

View File

@ -0,0 +1,7 @@
package gay.pizza.pork.bir
data class IrStore(val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement {
override fun crawl(block: (IrElement) -> Unit) {
value.crawl(block)
}
}

View File

@ -0,0 +1,5 @@
package gay.pizza.pork.bir
data class IrSymbol(val id: UInt, val tag: IrSymbolTag) : IrElement {
override fun crawl(block: (IrElement) -> Unit) {}
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
class IrSymbolAssignment {
private var index = 0u
private fun nextSymbolId(): UInt = index++
fun next(tag: IrSymbolTag): IrSymbol = IrSymbol(nextSymbolId(), tag)
}

View File

@ -0,0 +1,8 @@
package gay.pizza.pork.bir
enum class IrSymbolTag {
Function,
Variable,
Local,
Loop
}