[K/N][IR] Made caches ABI lowerings per file

This commit is contained in:
Igor Chevdar
2022-08-16 16:19:54 +03:00
committed by Space
parent 85379159be
commit 3462d4e5e8
3 changed files with 37 additions and 41 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
private val validateAll = false private val validateAll = false
@@ -459,3 +460,15 @@ internal val computeStringTrimPhase = makeKonanFileLoweringPhase(
name = "StringTrimLowering", name = "StringTrimLowering",
description = "Compute trimIndent and trimMargin operations on constant strings" description = "Compute trimIndent and trimMargin operations on constant strings"
) )
internal val exportInternalAbiPhase = makeKonanFileLoweringPhase(
::ExportCachesAbiVisitor,
name = "ExportInternalAbi",
description = "Add accessors to private entities"
)
internal val useInternalAbiPhase = makeKonanFileLoweringPhase(
::ImportCachesAbiTransformer,
name = "UseInternalAbi",
description = "Use internal ABI functions to access private entities"
)
@@ -3,13 +3,11 @@ package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.backend.common.checkDeclarationParents import org.jetbrains.kotlin.backend.common.checkDeclarationParents
import org.jetbrains.kotlin.backend.common.IrValidator import org.jetbrains.kotlin.backend.common.IrValidator
import org.jetbrains.kotlin.backend.common.IrValidatorConfig import org.jetbrains.kotlin.backend.common.IrValidatorConfig
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.lower.*
import org.jetbrains.kotlin.backend.konan.lower.CacheInfoBuilder import org.jetbrains.kotlin.backend.konan.lower.CacheInfoBuilder
import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
import org.jetbrains.kotlin.backend.konan.lower.SamSuperTypesChecker import org.jetbrains.kotlin.backend.konan.lower.SamSuperTypesChecker
@@ -20,7 +18,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.*
import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -283,6 +280,8 @@ internal val allLoweringsPhase = NamedCompilerPhase(
// constantInliningPhase, // constantInliningPhase,
fileInitializersPhase, fileInitializersPhase,
bridgesPhase, bridgesPhase,
exportInternalAbiPhase,
useInternalAbiPhase,
autoboxPhase, autoboxPhase,
) )
), ),
@@ -370,20 +369,6 @@ internal val entryPointPhase = makeCustomPhase<Context, IrModuleFragment>(
} }
) )
internal val exportInternalAbiPhase = makeKonanModuleOpPhase(
name = "exportInternalAbi",
description = "Add accessors to private entities",
prerequisite = emptySet(),
op = { context, module -> module.acceptChildrenVoid(ExportCachesAbiVisitor(context)) }
)
internal val useInternalAbiPhase = makeKonanModuleOpPhase(
name = "useInternalAbi",
description = "Use internal ABI functions to access private entities",
prerequisite = emptySet(),
op = { context, module -> module.transformChildrenVoid(ImportCachesAbiTransformer(context)) }
)
internal val bitcodePhase = NamedCompilerPhase( internal val bitcodePhase = NamedCompilerPhase(
name = "Bitcode", name = "Bitcode",
description = "LLVM Bitcode generation", description = "LLVM Bitcode generation",
@@ -431,8 +416,6 @@ private val backendCodegen = namedUnitPhase(
dependenciesLowerPhase then // Then lower all libraries in topological order. dependenciesLowerPhase then // Then lower all libraries in topological order.
// With that we guarantee that inline functions are unlowered while being inlined. // With that we guarantee that inline functions are unlowered while being inlined.
dumpTestsPhase then dumpTestsPhase then
exportInternalAbiPhase then
useInternalAbiPhase then
bitcodePhase then bitcodePhase then
verifyBitcodePhase then verifyBitcodePhase then
printBitcodePhase then printBitcodePhase then
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.backend.konan.lower package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.backend.common.getOrPut
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
@@ -24,10 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.IrGetField
import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue
import org.jetbrains.kotlin.ir.types.typeWith import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
/** /**
@@ -127,23 +125,21 @@ internal class CachesAbiSupport(mapping: NativeMapping, symbols: KonanSymbols, p
} }
} }
internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVoid { internal class ExportCachesAbiVisitor(val context: Context) : FileLoweringPass, IrElementVisitor<Unit, MutableList<IrFunction>> {
private val cachesAbiSupport = context.cachesAbiSupport private val cachesAbiSupport = context.cachesAbiSupport
private val addedFunctions = mutableListOf<IrFunction>()
override fun visitElement(element: IrElement) { override fun lower(irFile: IrFile) {
element.acceptChildrenVoid(this) val addedFunctions = mutableListOf<IrFunction>()
irFile.acceptChildren(this, addedFunctions)
irFile.addChildren(addedFunctions)
} }
override fun visitFile(declaration: IrFile) { override fun visitElement(element: IrElement, data: MutableList<IrFunction>) {
declaration.acceptChildrenVoid(this) element.acceptChildren(this, data)
declaration.addChildren(addedFunctions)
addedFunctions.clear()
} }
override fun visitClass(declaration: IrClass) { override fun visitClass(declaration: IrClass, data: MutableList<IrFunction>) {
declaration.acceptChildrenVoid(this) declaration.acceptChildren(this, data)
if (declaration.isLocal) return if (declaration.isLocal) return
@@ -154,7 +150,7 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo
+irReturn(irGetObjectValue(declaration.defaultType, declaration.symbol)) +irReturn(irGetObjectValue(declaration.defaultType, declaration.symbol))
} }
} }
addedFunctions.add(function) data.add(function)
} }
if (declaration.isInner) { if (declaration.isInner) {
@@ -167,7 +163,7 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo
) )
} }
} }
addedFunctions.add(function) data.add(function)
} }
if (declaration.isEnumClass) { if (declaration.isEnumClass) {
@@ -177,12 +173,12 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo
+irReturn(with(this@ExportCachesAbiVisitor.context.enumsSupport) { irGetValuesField(declaration) }) +irReturn(with(this@ExportCachesAbiVisitor.context.enumsSupport) { irGetValuesField(declaration) })
} }
} }
addedFunctions.add(function) data.add(function)
} }
} }
override fun visitProperty(declaration: IrProperty) { override fun visitProperty(declaration: IrProperty, data: MutableList<IrFunction>) {
declaration.acceptChildrenVoid(this) declaration.acceptChildren(this, data)
if (!declaration.isLateinit || declaration.isFakeOverride if (!declaration.isLateinit || declaration.isFakeOverride
|| DescriptorVisibilities.isPrivate(declaration.visibility) || declaration.isLocal) || DescriptorVisibilities.isPrivate(declaration.visibility) || declaration.isLocal)
@@ -196,14 +192,18 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo
+irReturn(irGetField(ownerClass?.let { irGet(function.valueParameters[0]) }, backingField)) +irReturn(irGetField(ownerClass?.let { irGet(function.valueParameters[0]) }, backingField))
} }
} }
addedFunctions.add(function) data.add(function)
} }
} }
internal class ImportCachesAbiTransformer(val context: Context) : IrElementTransformerVoid() { internal class ImportCachesAbiTransformer(val context: Context) : FileLoweringPass, IrElementTransformerVoid() {
private val cachesAbiSupport = context.cachesAbiSupport private val cachesAbiSupport = context.cachesAbiSupport
private val enumsSupport = context.enumsSupport private val enumsSupport = context.enumsSupport
override fun lower(irFile: IrFile) {
irFile.transformChildrenVoid(this)
}
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression { override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
expression.transformChildrenVoid(this) expression.transformChildrenVoid(this)