From d15af70a3ea364938d2289fe5a848ecda08502bc Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Sat, 5 Dec 2020 18:18:39 +0300 Subject: [PATCH] [Wasm] Refactoring: replace "struct types" with "GC types" In preparation for adding array types --- .../kotlin/backend/wasm/ir2wasm/BodyGenerator.kt | 8 ++++---- .../backend/wasm/ir2wasm/DeclarationGenerator.kt | 2 +- .../kotlin/backend/wasm/ir2wasm/TypeTransformer.kt | 3 +-- .../backend/wasm/ir2wasm/WasmBaseCodegenContext.kt | 2 +- .../wasm/ir2wasm/WasmCompiledModuleFragment.kt | 8 ++++---- .../backend/wasm/ir2wasm/WasmModuleCodegenContext.kt | 2 +- .../wasm/ir2wasm/WasmModuleCodegenContextImpl.kt | 8 ++++---- .../src/org/jetbrains/kotlin/wasm/ir/Declarations.kt | 2 +- .../src/org/jetbrains/kotlin/wasm/ir/Operators.kt | 4 ++-- .../src/org/jetbrains/kotlin/wasm/ir/Utils.kt | 2 +- .../kotlin/wasm/ir/WasmExpressionBuilder.kt | 12 ++++++------ .../kotlin/wasm/ir/convertors/WasmBinaryToIR.kt | 6 +++--- .../kotlin/wasm/ir/convertors/WasmIrToBinary.kt | 11 ++++++++--- .../kotlin/wasm/ir/convertors/WasmIrToText.kt | 11 +++++++++-- 14 files changed, 46 insertions(+), 35 deletions(-) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index 8e4e8701f5a..5488a75789d 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -78,7 +78,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV private fun generateInstanceFieldAccess(field: IrField) { body.buildStructGet( - context.referenceStructType(field.parentAsClass.symbol), + context.referenceGcType(field.parentAsClass.symbol), context.getStructFieldRef(field) ) } @@ -91,7 +91,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV generateExpression(receiver) generateExpression(expression.value) body.buildStructSet( - struct = context.referenceStructType(field.parentAsClass.symbol), + struct = context.referenceGcType(field.parentAsClass.symbol), fieldId = context.getStructFieldRef(field), ) } else { @@ -122,7 +122,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV return } - val wasmStruct: WasmSymbol = context.referenceStructType(klass.symbol) + val wasmStruct: WasmSymbol = context.referenceGcType(klass.symbol) val wasmClassId = context.referenceClassId(klass.symbol) val irFields: List = klass.allFields(backendContext.irBuiltIns) @@ -157,7 +157,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV if (call.symbol == wasmSymbols.boxIntrinsic) { val toType = call.getTypeArgument(0)!! val klass = toType.erasedUpperBound!! - val structTypeName = context.referenceStructType(klass.symbol) + val structTypeName = context.referenceGcType(klass.symbol) val klassId = context.referenceClassId(klass.symbol) body.buildConstI32Symbol(klassId) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt index 0535998afd0..55ed3f7f8df 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt @@ -183,7 +183,7 @@ class DeclarationGenerator(val context: WasmModuleCodegenContext) : IrElementVis } ) - context.defineStructType(symbol, structType) + context.defineGcType(symbol, structType) var depth = 2 val metadata = context.getClassMetadata(symbol) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt index 584a710f37b..98596092c7d 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/TypeTransformer.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.util.getInlineClassUnderlyingType @@ -47,7 +46,7 @@ class WasmTypeTransformer( } fun IrType.toStructType(): WasmType = - WasmRefNullType(WasmHeapType.Type(context.referenceStructType(erasedUpperBound?.symbol ?: builtIns.anyClass))) + WasmRefNullType(WasmHeapType.Type(context.referenceGcType(erasedUpperBound?.symbol ?: builtIns.anyClass))) fun IrType.toBoxedInlineClassType(): WasmType = toStructType() diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt index 13ea4f95b2e..341cc0dd9f8 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmBaseCodegenContext.kt @@ -21,7 +21,7 @@ interface WasmBaseCodegenContext { fun referenceFunction(irFunction: IrFunctionSymbol): WasmSymbol fun referenceGlobal(irField: IrFieldSymbol): WasmSymbol - fun referenceStructType(irClass: IrClassSymbol): WasmSymbol + fun referenceGcType(irClass: IrClassSymbol): WasmSymbol fun referenceFunctionType(irFunction: IrFunctionSymbol): WasmSymbol fun referenceClassId(irClass: IrClassSymbol): WasmSymbol diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt index bb8e8842606..e5f40324807 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt @@ -20,8 +20,8 @@ class WasmCompiledModuleFragment { ReferencableAndDefinable() val functionTypes = ReferencableAndDefinable() - val structTypes = - ReferencableAndDefinable() + val gcTypes = + ReferencableAndDefinable() val classIds = ReferencableElements() val interfaceId = @@ -88,7 +88,7 @@ class WasmCompiledModuleFragment { bind(functions.unbound, functions.defined) bind(globals.unbound, globals.defined) bind(functionTypes.unbound, functionTypes.defined) - bind(structTypes.unbound, structTypes.defined) + bind(gcTypes.unbound, gcTypes.defined) bind(runtimeTypes.unbound, runtimeTypes.defined) val klassIds = mutableMapOf() @@ -162,7 +162,7 @@ class WasmCompiledModuleFragment { val module = WasmModule( functionTypes = functionTypes.elements, - structs = structTypes.elements, + gcTypes = gcTypes.elements, importsInOrder = importedFunctions, importedFunctions = importedFunctions, definedFunctions = functions.elements.filterIsInstance(), diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContext.kt index b0d380faa42..f8e2b7f1d83 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContext.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol interface WasmModuleCodegenContext : WasmBaseCodegenContext { fun defineFunction(irFunction: IrFunctionSymbol, wasmFunction: WasmFunction) fun defineGlobal(irField: IrFieldSymbol, wasmGlobal: WasmGlobal) - fun defineStructType(irClass: IrClassSymbol, wasmStruct: WasmStructDeclaration) + fun defineGcType(irClass: IrClassSymbol, wasmType: WasmTypeDeclaration) fun defineRTT(irClass: IrClassSymbol, wasmGlobal: WasmGlobal) fun defineFunctionType(irFunction: IrFunctionSymbol, wasmFunctionType: WasmFunctionType) fun addJsFun(importName: String, jsCode: String) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt index 7759bd5834f..c6796576178 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleCodegenContextImpl.kt @@ -92,8 +92,8 @@ class WasmModuleCodegenContextImpl( wasmFragment.globals.define(irField, wasmGlobal) } - override fun defineStructType(irClass: IrClassSymbol, wasmStruct: WasmStructDeclaration) { - wasmFragment.structTypes.define(irClass, wasmStruct) + override fun defineGcType(irClass: IrClassSymbol, wasmStruct: WasmTypeDeclaration) { + wasmFragment.gcTypes.define(irClass, wasmStruct) } override fun defineRTT(irClass: IrClassSymbol, wasmGlobal: WasmGlobal) { @@ -122,12 +122,12 @@ class WasmModuleCodegenContextImpl( override fun referenceGlobal(irField: IrFieldSymbol): WasmSymbol = wasmFragment.globals.reference(irField) - override fun referenceStructType(irClass: IrClassSymbol): WasmSymbol { + override fun referenceGcType(irClass: IrClassSymbol): WasmSymbol { val type = irClass.defaultType require(!type.isNothing()) { "Can't reference Nothing type" } - return wasmFragment.structTypes.reference(irClass) + return wasmFragment.gcTypes.reference(irClass) } override fun referenceClassRTT(irClass: IrClassSymbol): WasmSymbol = diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Declarations.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Declarations.kt index cbc7e971293..fa076105238 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Declarations.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Declarations.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.wasm.ir class WasmModule( val functionTypes: List = emptyList(), - val structs: List = emptyList(), + val gcTypes: List = emptyList(), val importsInOrder: List = emptyList(), val importedFunctions: List = emptyList(), diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt index bc8478ea310..bfc57698742 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt @@ -79,8 +79,8 @@ sealed class WasmImmediate { class LabelIdxVector(val value: List) : WasmImmediate() class ElemIdx(val value: WasmElement) : WasmImmediate() - class StructType(val value: WasmSymbol) : WasmImmediate() { - constructor(value: WasmStructDeclaration) : this(WasmSymbol(value)) + class GcType(val value: WasmSymbol) : WasmImmediate() { + constructor(value: WasmTypeDeclaration) : this(WasmSymbol(value)) } class StructFieldIdx(val value: WasmSymbol) : WasmImmediate() diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Utils.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Utils.kt index b4656e9c967..911e8524a45 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Utils.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Utils.kt @@ -16,7 +16,7 @@ fun WasmModule.calculateIds() { } functionTypes.calculateIds() - structs.calculateIds(startIndex = functionTypes.size) + gcTypes.calculateIds(startIndex = functionTypes.size) importedFunctions.calculateIds() importedMemories.calculateIds() importedTables.calculateIds() diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt index 15d3f1e5d41..5244bfaa151 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt @@ -106,22 +106,22 @@ abstract class WasmExpressionBuilder { buildInstr(WasmOp.GLOBAL_SET, WasmImmediate.GlobalIdx(global)) } - fun buildStructGet(struct: WasmSymbol, fieldId: WasmSymbol) { + fun buildStructGet(struct: WasmSymbol, fieldId: WasmSymbol) { buildInstr( WasmOp.STRUCT_GET, - WasmImmediate.StructType(struct), + WasmImmediate.GcType(struct), WasmImmediate.StructFieldIdx(fieldId) ) } - fun buildStructNew(struct: WasmSymbol) { - buildInstr(WasmOp.STRUCT_NEW_WITH_RTT, WasmImmediate.StructType(struct)) + fun buildStructNew(struct: WasmSymbol) { + buildInstr(WasmOp.STRUCT_NEW_WITH_RTT, WasmImmediate.GcType(struct)) } - fun buildStructSet(struct: WasmSymbol, fieldId: WasmSymbol) { + fun buildStructSet(struct: WasmSymbol, fieldId: WasmSymbol) { buildInstr( WasmOp.STRUCT_SET, - WasmImmediate.StructType(struct), + WasmImmediate.GcType(struct), WasmImmediate.StructFieldIdx(fieldId) ) } diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt index 7490004f8b2..298f38674ee 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt @@ -15,7 +15,7 @@ class WasmBinaryToIR(val b: MyByteReader) { val validVersion = 1u val functionTypes: MutableList = mutableListOf() - val structs: MutableList = mutableListOf() + val gcTypes: MutableList = mutableListOf() val importsInOrder: MutableList = mutableListOf() val importedFunctions: MutableList = mutableListOf() @@ -80,7 +80,7 @@ class WasmBinaryToIR(val b: MyByteReader) { is WasmFunctionType -> functionTypes += type is WasmStructDeclaration -> - structs += type + gcTypes += type } } } @@ -313,7 +313,7 @@ class WasmBinaryToIR(val b: MyByteReader) { return WasmModule( functionTypes = functionTypes, - structs = structs, + gcTypes = gcTypes, importsInOrder = importsInOrder, importedFunctions = importedFunctions, importedMemories = importedMemories, diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt index 1c289091d66..7aff5c8e626 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt @@ -21,9 +21,14 @@ class WasmIrToBinary(outputStream: OutputStream, val module: WasmModule) { with(module) { // type section appendSection(1u) { - appendVectorSize(functionTypes.size + structs.size) + appendVectorSize(functionTypes.size + gcTypes.size) functionTypes.forEach { appendFunctionTypeDeclaration(it) } - structs.forEach { appendStructTypeDeclaration(it) } + gcTypes.forEach { + when (it) { + is WasmStructDeclaration -> appendStructTypeDeclaration(it) + else -> TODO("Support arrays") + } + } } // import section @@ -148,7 +153,7 @@ class WasmIrToBinary(outputStream: OutputStream, val module: WasmModule) { appendType(type) } } - is WasmImmediate.StructType -> appendModuleFieldReference(x.value.owner) + is WasmImmediate.GcType -> appendModuleFieldReference(x.value.owner) is WasmImmediate.StructFieldIdx -> b.writeVarUInt32(x.value.owner) is WasmImmediate.HeapType -> appendHeapType(x.value) } diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToText.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToText.kt index d8ea08533d4..a023490d499 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToText.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToText.kt @@ -107,7 +107,7 @@ class WasmIrToText : SExpressionBuilder() { is WasmImmediate.ValTypeVector -> sameLineList("result") { x.value.forEach { appendType(it) } } - is WasmImmediate.StructType -> appendModuleFieldReference(x.value.owner) + is WasmImmediate.GcType -> appendModuleFieldReference(x.value.owner) is WasmImmediate.StructFieldIdx -> appendElement(x.value.owner.toString()) is WasmImmediate.HeapType -> { appendHeapType(x.value) @@ -197,7 +197,14 @@ class WasmIrToText : SExpressionBuilder() { with(module) { newLineList("module") { functionTypes.forEach { appendFunctionTypeDeclaration(it) } - structs.forEach { appendStructTypeDeclaration(it) } + gcTypes.forEach { + when (it) { + is WasmStructDeclaration -> + appendStructTypeDeclaration(it) + else -> + TODO("Support arrays") + } + } importsInOrder.forEach { when (it) { is WasmFunction.Imported -> appendImportedFunction(it)