mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 21:21:33 +00:00
bir: mutable values and inspection
This commit is contained in:
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrBreak(val target: IrSymbol) : IrCodeElement {
|
data class IrBreak(var target: IrSymbol) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(target)
|
block(target)
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrCall(
|
data class IrCall(
|
||||||
override val target: IrSymbol,
|
override var target: IrSymbol,
|
||||||
val arguments: List<IrCodeElement>,
|
var arguments: List<IrCodeElement>,
|
||||||
val variableArguments: List<IrCodeElement>?
|
var variableArguments: List<IrCodeElement>?
|
||||||
) : IrCodeElement, IrSymbolUser {
|
) : IrCodeElement(), IrSymbolUser {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(target)
|
block(target)
|
||||||
arguments.forEach(block)
|
arguments.forEach(block)
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrCodeBlock(val items: List<IrCodeElement>) : IrCodeElement {
|
data class IrCodeBlock(var items: List<IrCodeElement>) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
items.forEach(block)
|
items.forEach(block)
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,4 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed interface IrCodeElement : IrElement
|
sealed class IrCodeElement : IrElement()
|
||||||
|
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrConditional(
|
data class IrConditional(
|
||||||
val conditional: IrCodeElement,
|
var conditional: IrCodeElement,
|
||||||
val ifTrue: IrCodeElement,
|
var ifTrue: IrCodeElement,
|
||||||
val ifFalse: IrCodeElement
|
var ifFalse: IrCodeElement
|
||||||
) : IrCodeElement {
|
) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(conditional)
|
block(conditional)
|
||||||
block(ifTrue)
|
block(ifTrue)
|
||||||
|
@ -3,24 +3,24 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed interface IrConstant : IrCodeElement {
|
sealed class IrConstant : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {}
|
override fun crawl(block: (IrElement) -> Unit) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrIntegerConstant(val value: Int) : IrConstant
|
data class IrIntegerConstant(var value: Int) : IrConstant()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrLongConstant(val value: Long) : IrConstant
|
data class IrLongConstant(var value: Long) : IrConstant()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrDoubleConstant(val value: Double) : IrConstant
|
data class IrDoubleConstant(var value: Double) : IrConstant()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrStringConstant(val value: String) : IrConstant
|
data class IrStringConstant(var value: String) : IrConstant()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrBooleanConstant(val value: Boolean) : IrConstant
|
data class IrBooleanConstant(var value: Boolean) : IrConstant()
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data object IrNoneConstant : IrConstant
|
data object IrNoneConstant : IrConstant()
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrContinue(override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
|
data class IrContinue(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(target)
|
block(target)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrDeclare(override val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolOwner {
|
data class IrDeclare(override var symbol: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolOwner {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
value.crawl(block)
|
value.crawl(block)
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,11 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrDefinition(
|
data class IrDefinition(
|
||||||
override val symbol: IrSymbol,
|
override var symbol: IrSymbol,
|
||||||
val type: IrDefinitionType,
|
var type: IrDefinitionType,
|
||||||
val arguments: List<IrFunctionArgument>,
|
var arguments: List<IrFunctionArgument>,
|
||||||
val code: IrCodeBlock
|
var code: IrCodeBlock
|
||||||
) : IrElement, IrSymbolOwner {
|
) : IrElement(), IrSymbolOwner {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(symbol)
|
block(symbol)
|
||||||
arguments.forEach(block)
|
arguments.forEach(block)
|
||||||
|
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed interface IrElement {
|
sealed class IrElement {
|
||||||
fun crawl(block: (IrElement) -> Unit)
|
abstract fun crawl(block: (IrElement) -> Unit)
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrFunctionArgument(override val symbol: IrSymbol) : IrSymbolOwner {
|
data class IrFunctionArgument(override var symbol: IrSymbol) : IrElement(), IrSymbolOwner {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {}
|
override fun crawl(block: (IrElement) -> Unit) {}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrIndex(val data: IrCodeElement, val index: IrCodeElement) : IrCodeElement {
|
data class IrIndex(var data: IrCodeElement, var index: IrCodeElement) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(data)
|
block(data)
|
||||||
block(index)
|
block(index)
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrInfix(val op: IrInfixOp, val left: IrCodeElement, val right: IrCodeElement) : IrCodeElement {
|
data class IrInfix(var op: IrInfixOp, var left: IrCodeElement, var right: IrCodeElement) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(left)
|
block(left)
|
||||||
block(right)
|
block(right)
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrList(val items: List<IrCodeElement>) : IrCodeElement {
|
data class IrList(var items: List<IrCodeElement>) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
items.forEach(block)
|
items.forEach(block)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrListSize(val list: IrCodeElement) : IrCodeElement {
|
data class IrListSize(var list: IrCodeElement) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(list)
|
block(list)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrLoad(override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
|
data class IrLoad(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(target)
|
block(target)
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrLoop(
|
data class IrLoop(
|
||||||
override val symbol: IrSymbol,
|
override var symbol: IrSymbol,
|
||||||
val condition: IrCodeElement,
|
var condition: IrCodeElement,
|
||||||
val inner: IrCodeElement
|
var inner: IrCodeElement
|
||||||
) : IrCodeElement, IrSymbolOwner {
|
) : IrCodeElement(), IrSymbolOwner {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(symbol)
|
block(symbol)
|
||||||
block(condition)
|
block(condition)
|
||||||
|
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrNativeDefinition(val form: String, val definitions: List<String>) : IrCodeElement {
|
data class IrNativeDefinition(var form: String, var definitions: List<String>) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {}
|
override fun crawl(block: (IrElement) -> Unit) {}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrPrefix(val op: IrPrefixOp, val value: IrCodeElement) : IrCodeElement {
|
data class IrPrefix(var op: IrPrefixOp, var value: IrCodeElement) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(value)
|
block(value)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrReturn(val from: IrSymbol, val value: IrCodeElement) : IrCodeElement {
|
data class IrReturn(var from: IrSymbol, var value: IrCodeElement) : IrCodeElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(from)
|
block(from)
|
||||||
block(value)
|
block(value)
|
||||||
|
@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrSlab(
|
data class IrSlab(
|
||||||
val location: IrSlabLocation,
|
override var symbol: IrSymbol,
|
||||||
val definitions: List<IrDefinition>
|
var location: IrSlabLocation,
|
||||||
) : IrElement {
|
var definitions: List<IrDefinition>
|
||||||
|
) : IrElement(), IrSymbolOwner {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(location)
|
block(location)
|
||||||
definitions.forEach(block)
|
definitions.forEach(block)
|
||||||
|
@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrSlabLocation(
|
data class IrSlabLocation(
|
||||||
val form: String,
|
var form: String,
|
||||||
val path: String
|
var path: String
|
||||||
) : IrElement {
|
) : IrElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {}
|
override fun crawl(block: (IrElement) -> Unit) {}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrStore(override val target: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolUser {
|
data class IrStore(override var target: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolUser {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
value.crawl(block)
|
value.crawl(block)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrSuffix(val op: IrSuffixOp, override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
|
data class IrSuffix(var op: IrSuffixOp, override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
block(target)
|
block(target)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement {
|
data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {}
|
override fun crawl(block: (IrElement) -> Unit) {}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package gay.pizza.pork.bir
|
package gay.pizza.pork.bir
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable(with = IrSymbolGraphSerializer::class)
|
||||||
class IrSymbolGraph {
|
class IrSymbolGraph {
|
||||||
private val edges = mutableSetOf<Pair<IrSymbolUser, IrSymbolOwner>>()
|
private val edges = mutableSetOf<IrSymbolGraphEdge>()
|
||||||
|
|
||||||
private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
|
private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
|
||||||
if (root is IrSymbolOwner) {
|
if (root is IrSymbolOwner) {
|
||||||
@ -17,7 +20,7 @@ class IrSymbolGraph {
|
|||||||
if (root is IrSymbolUser) {
|
if (root is IrSymbolUser) {
|
||||||
val what = known[root.target]
|
val what = known[root.target]
|
||||||
if (what != null) {
|
if (what != null) {
|
||||||
edges.add(root to what)
|
edges.add(IrSymbolGraphEdge(root, what))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,12 +29,16 @@ class IrSymbolGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun crawl(root: IrElement) {
|
fun buildFromRoot(root: IrElement) {
|
||||||
val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
|
val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
|
||||||
crawlForKnown(known, root)
|
crawlForKnown(known, root)
|
||||||
crawlForAssociations(known, root)
|
crawlForAssociations(known, root)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun buildFromEdges(edges: Collection<IrSymbolGraphEdge>) {
|
||||||
|
this.edges.addAll(edges)
|
||||||
|
}
|
||||||
|
|
||||||
fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
|
fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
|
||||||
for ((from, to) in edges) {
|
for ((from, to) in edges) {
|
||||||
block(from, to)
|
block(from, to)
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package gay.pizza.pork.bir
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class IrSymbolGraphEdge(val user: IrSymbolUser, val owner: IrSymbolOwner)
|
@ -0,0 +1,26 @@
|
|||||||
|
package gay.pizza.pork.bir
|
||||||
|
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.builtins.ListSerializer
|
||||||
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
|
class IrSymbolGraphSerializer : KSerializer<IrSymbolGraph> {
|
||||||
|
private val serializer = ListSerializer(IrSymbolGraphEdge.serializer())
|
||||||
|
override val descriptor: SerialDescriptor = serializer.descriptor
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder): IrSymbolGraph {
|
||||||
|
val graph = IrSymbolGraph()
|
||||||
|
graph.buildFromEdges(serializer.deserialize(decoder))
|
||||||
|
return graph
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(encoder: Encoder, value: IrSymbolGraph) {
|
||||||
|
val edges = mutableListOf<IrSymbolGraphEdge>()
|
||||||
|
value.forEachEdge { user, owner ->
|
||||||
|
edges.add(IrSymbolGraphEdge(user, owner))
|
||||||
|
}
|
||||||
|
serializer.serialize(encoder, edges)
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed interface IrSymbolOwner : IrElement {
|
sealed interface IrSymbolOwner {
|
||||||
val symbol: IrSymbol
|
var symbol: IrSymbol
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
enum class IrSymbolTag {
|
enum class IrSymbolTag {
|
||||||
|
Slab,
|
||||||
Function,
|
Function,
|
||||||
Variable,
|
Variable,
|
||||||
Local,
|
Local,
|
||||||
|
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed interface IrSymbolUser : IrElement {
|
sealed interface IrSymbolUser {
|
||||||
val target: IrSymbol
|
var target: IrSymbol
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IrWorld(val slabs: List<IrSlab>) : IrElement {
|
data class IrWorld(var slabs: List<IrSlab>) : IrElement() {
|
||||||
override fun crawl(block: (IrElement) -> Unit) {
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
slabs.forEach(block)
|
slabs.forEach(block)
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import gay.pizza.pork.bir.*
|
|||||||
import gay.pizza.pork.frontend.scope.ScopeSymbol
|
import gay.pizza.pork.frontend.scope.ScopeSymbol
|
||||||
import gay.pizza.pork.frontend.scope.SlabScope
|
import gay.pizza.pork.frontend.scope.SlabScope
|
||||||
|
|
||||||
class IrCodeEmitter(
|
class AstIrEmitter(
|
||||||
val self: IrSymbol,
|
val self: IrSymbol,
|
||||||
val irSymbolWorld: IrSymbolWorld<Any>,
|
val irSymbolWorld: IrSymbolWorld<Any>,
|
||||||
val irSymbolAssignment: IrSymbolAssignment,
|
val irSymbolAssignment: IrSymbolAssignment,
|
@ -4,6 +4,7 @@ import gay.pizza.pork.ast.gen.Symbol
|
|||||||
import gay.pizza.pork.bir.IrDefinition
|
import gay.pizza.pork.bir.IrDefinition
|
||||||
import gay.pizza.pork.bir.IrSlab
|
import gay.pizza.pork.bir.IrSlab
|
||||||
import gay.pizza.pork.bir.IrSlabLocation
|
import gay.pizza.pork.bir.IrSlabLocation
|
||||||
|
import gay.pizza.pork.bir.IrSymbolTag
|
||||||
import gay.pizza.pork.frontend.Slab
|
import gay.pizza.pork.frontend.Slab
|
||||||
|
|
||||||
class CompilableSlab(val compiler: Compiler, val slab: Slab) {
|
class CompilableSlab(val compiler: Compiler, val slab: Slab) {
|
||||||
@ -20,11 +21,12 @@ class CompilableSlab(val compiler: Compiler, val slab: Slab) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun compileIrSlab(): IrSlab {
|
private fun compileIrSlab(): IrSlab {
|
||||||
|
val slabSymbol = compiler.irSymbolAssignment.next(IrSymbolTag.Slab, slab.location.commonLocationIdentity)
|
||||||
val definitions = mutableListOf<IrDefinition>()
|
val definitions = mutableListOf<IrDefinition>()
|
||||||
for (compilableSymbol in compilableSymbols) {
|
for (compilableSymbol in compilableSymbols) {
|
||||||
definitions.add(compilableSymbol.compiledIrDefinition)
|
definitions.add(compilableSymbol.compiledIrDefinition)
|
||||||
}
|
}
|
||||||
val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath)
|
val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath)
|
||||||
return IrSlab(irSlabLocation, definitions)
|
return IrSlab(slabSymbol, irSlabLocation, definitions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ class CompilableSymbol(val compilableSlab: CompilableSlab, val scopeSymbol: Scop
|
|||||||
private fun compileIrDefinition(): IrDefinition {
|
private fun compileIrDefinition(): IrDefinition {
|
||||||
val compiler = compilableSlab.compiler
|
val compiler = compilableSlab.compiler
|
||||||
val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id)
|
val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id)
|
||||||
val irCodeEmitter = IrCodeEmitter(
|
val irCodeEmitter = AstIrEmitter(
|
||||||
self = functionSymbol,
|
self = functionSymbol,
|
||||||
irSymbolWorld = compiler.irSymbolWorld,
|
irSymbolWorld = compiler.irSymbolWorld,
|
||||||
irSymbolAssignment = compiler.irSymbolAssignment,
|
irSymbolAssignment = compiler.irSymbolAssignment,
|
||||||
|
@ -4,16 +4,26 @@ import com.charleskorn.kaml.PolymorphismStyle
|
|||||||
import com.charleskorn.kaml.Yaml
|
import com.charleskorn.kaml.Yaml
|
||||||
import com.github.ajalt.clikt.core.CliktCommand
|
import com.github.ajalt.clikt.core.CliktCommand
|
||||||
import com.github.ajalt.clikt.parameters.arguments.argument
|
import com.github.ajalt.clikt.parameters.arguments.argument
|
||||||
|
import com.github.ajalt.clikt.parameters.options.flag
|
||||||
|
import com.github.ajalt.clikt.parameters.options.option
|
||||||
import gay.pizza.dough.fs.PlatformFsProvider
|
import gay.pizza.dough.fs.PlatformFsProvider
|
||||||
import gay.pizza.pork.ast.gen.Symbol
|
import gay.pizza.pork.ast.gen.Symbol
|
||||||
|
import gay.pizza.pork.bir.IrSymbolGraph
|
||||||
import gay.pizza.pork.bir.IrWorld
|
import gay.pizza.pork.bir.IrWorld
|
||||||
import gay.pizza.pork.bytecode.CompiledWorld
|
import gay.pizza.pork.bytecode.CompiledWorld
|
||||||
import gay.pizza.pork.compiler.Compiler
|
import gay.pizza.pork.compiler.Compiler
|
||||||
import gay.pizza.pork.minimal.FileTool
|
import gay.pizza.pork.minimal.FileTool
|
||||||
|
|
||||||
class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "compile") {
|
class CompileCommand : CliktCommand(help = "Compile Pork", name = "compile") {
|
||||||
|
val showIrCode by option("--show-ir-code").flag(default = false)
|
||||||
|
val showIrSymbolGraph by option("--show-ir-symbol-graph").flag(default = false)
|
||||||
|
|
||||||
val path by argument("file")
|
val path by argument("file")
|
||||||
|
|
||||||
|
private val yaml = Yaml(configuration = Yaml.default.configuration.copy(
|
||||||
|
polymorphismStyle = PolymorphismStyle.Property
|
||||||
|
))
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
val tool = FileTool(PlatformFsProvider.resolve(path))
|
val tool = FileTool(PlatformFsProvider.resolve(path))
|
||||||
val world = tool.buildWorld()
|
val world = tool.buildWorld()
|
||||||
@ -22,16 +32,22 @@ class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "c
|
|||||||
val compiledSlab = compiler.compilableSlabs.of(slab)
|
val compiledSlab = compiler.compilableSlabs.of(slab)
|
||||||
val compiledMain = compiledSlab.resolve(Symbol("main"))
|
val compiledMain = compiledSlab.resolve(Symbol("main"))
|
||||||
?: throw RuntimeException("'main' function not found.")
|
?: throw RuntimeException("'main' function not found.")
|
||||||
val compiledWorld = compiler.compile(compiledMain)
|
|
||||||
val irWorld = compiler.compileIrWorld()
|
val irWorld = compiler.compileIrWorld()
|
||||||
printCompiledIr(irWorld)
|
val compiledWorld = compiler.compile(compiledMain)
|
||||||
|
if (showIrCode) {
|
||||||
|
printCompiledIr(irWorld)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showIrSymbolGraph) {
|
||||||
|
val irSymbolGraph = IrSymbolGraph()
|
||||||
|
irSymbolGraph.buildFromRoot(irWorld)
|
||||||
|
println(yaml.encodeToString(IrSymbolGraph.serializer(), irSymbolGraph))
|
||||||
|
}
|
||||||
|
|
||||||
printCompiledWorld(compiledWorld)
|
printCompiledWorld(compiledWorld)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun printCompiledIr(irWorld: IrWorld) {
|
private fun printCompiledIr(irWorld: IrWorld) {
|
||||||
val yaml = Yaml(configuration = Yaml.default.configuration.copy(
|
|
||||||
polymorphismStyle = PolymorphismStyle.Property
|
|
||||||
))
|
|
||||||
println(yaml.encodeToString(IrWorld.serializer(), irWorld))
|
println(yaml.encodeToString(IrWorld.serializer(), irWorld))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user