From 962d079acce1c07ca151ea470532d549d39a0da6 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Wed, 29 Nov 2023 15:03:22 -0800 Subject: [PATCH] compiler: declare symbols before store so that symbol graph works --- bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt | 10 ++++++++++ bir/src/main/kotlin/gay/pizza/pork/bir/IrVisitor.kt | 2 ++ .../kotlin/gay/pizza/pork/compiler/IrCodeEmitter.kt | 4 ++-- .../kotlin/gay/pizza/pork/compiler/IrStubOpEmitter.kt | 6 ++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt diff --git a/bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt b/bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt new file mode 100644 index 0000000..7331de2 --- /dev/null +++ b/bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt @@ -0,0 +1,10 @@ +package gay.pizza.pork.bir + +import kotlinx.serialization.Serializable + +@Serializable +data class IrDeclare(override val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolOwner { + override fun crawl(block: (IrElement) -> Unit) { + value.crawl(block) + } +} diff --git a/bir/src/main/kotlin/gay/pizza/pork/bir/IrVisitor.kt b/bir/src/main/kotlin/gay/pizza/pork/bir/IrVisitor.kt index 076e8c2..cc630eb 100644 --- a/bir/src/main/kotlin/gay/pizza/pork/bir/IrVisitor.kt +++ b/bir/src/main/kotlin/gay/pizza/pork/bir/IrVisitor.kt @@ -29,6 +29,7 @@ interface IrVisitor { fun visitIrFunctionArgument(ir: IrFunctionArgument): T fun visitIrIndex(ir: IrIndex): T fun visitIrListSize(ir: IrListSize): T + fun visitIrDeclare(ir: IrDeclare): T fun visit(ir: IrElement): T = when (ir) { is IrBreak -> visitIrBeak(ir) @@ -59,5 +60,6 @@ interface IrVisitor { is IrFunctionArgument -> visitIrFunctionArgument(ir) is IrIndex -> visitIrIndex(ir) is IrListSize -> visitIrListSize(ir) + is IrDeclare -> visitIrDeclare(ir) } } diff --git a/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrCodeEmitter.kt b/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrCodeEmitter.kt index 9492eba..579ad59 100644 --- a/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrCodeEmitter.kt +++ b/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrCodeEmitter.kt @@ -241,7 +241,7 @@ class IrCodeEmitter( override fun visitLetAssignment(node: LetAssignment): IrCodeElement { val symbol = createLocalVariable(node.symbol) - return IrStore(symbol, node.value.visit(this)) + return IrDeclare(symbol, node.value.visit(this)) } override fun visitListLiteral(node: ListLiteral): IrCodeElement = @@ -296,7 +296,7 @@ class IrCodeEmitter( override fun visitVarAssignment(node: VarAssignment): IrCodeElement { val local = createLocalVariable(node.symbol) - return IrStore(local, node.value.visit(this)) + return IrDeclare(local, node.value.visit(this)) } override fun visitWhile(node: While): IrCodeElement = loop { symbol -> diff --git a/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrStubOpEmitter.kt b/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrStubOpEmitter.kt index 94facde..ab11a2f 100644 --- a/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrStubOpEmitter.kt +++ b/compiler/src/main/kotlin/gay/pizza/pork/compiler/IrStubOpEmitter.kt @@ -188,6 +188,12 @@ class IrStubOpEmitter(val irDefinition: IrDefinition, val code: CodeBuilder) : I code.emit(Opcode.Return) } + override fun visitIrDeclare(ir: IrDeclare) { + visit(ir.value) + val variable = code.localState.createOrFindLocal(ir.symbol) + store(variable) + } + override fun visitIrStore(ir: IrStore) { visit(ir.value) val variable = code.localState.createOrFindLocal(ir.target)