From 3462d4e5e8576a32f8826fbf724cfea8923910c0 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 16 Aug 2022 16:19:54 +0300 Subject: [PATCH] [K/N][IR] Made caches ABI lowerings per file --- .../backend/konan/KonanLoweringPhases.kt | 13 ++++++ .../kotlin/backend/konan/ToplevelPhases.kt | 21 +-------- .../backend/konan/lower/CachesAbiLowering.kt | 44 +++++++++---------- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt index 81421e0231b..125b4c8eb3c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid private val validateAll = false @@ -458,4 +459,16 @@ internal val computeStringTrimPhase = makeKonanFileLoweringPhase( ::StringTrimLowering, name = "StringTrimLowering", 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" ) \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index b6169940569..f5922799d6e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -3,13 +3,11 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.common.checkDeclarationParents import org.jetbrains.kotlin.backend.common.IrValidator 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.serialization.CompatibilityMode import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary 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.ExpectToActualDefaultValueCopier 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.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.name.FqName @@ -283,6 +280,8 @@ internal val allLoweringsPhase = NamedCompilerPhase( // constantInliningPhase, fileInitializersPhase, bridgesPhase, + exportInternalAbiPhase, + useInternalAbiPhase, autoboxPhase, ) ), @@ -370,20 +369,6 @@ internal val entryPointPhase = makeCustomPhase( } ) -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( name = "Bitcode", description = "LLVM Bitcode generation", @@ -431,8 +416,6 @@ private val backendCodegen = namedUnitPhase( dependenciesLowerPhase then // Then lower all libraries in topological order. // With that we guarantee that inline functions are unlowered while being inlined. dumpTestsPhase then - exportInternalAbiPhase then - useInternalAbiPhase then bitcodePhase then verifyBitcodePhase then printBitcodePhase then diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CachesAbiLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CachesAbiLowering.kt index 7b83061af92..d416b801251 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CachesAbiLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CachesAbiLowering.kt @@ -5,6 +5,7 @@ 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.lower.createIrBuilder 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.types.typeWith import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid -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.ir.visitors.* 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> { private val cachesAbiSupport = context.cachesAbiSupport - private val addedFunctions = mutableListOf() - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) + override fun lower(irFile: IrFile) { + val addedFunctions = mutableListOf() + irFile.acceptChildren(this, addedFunctions) + irFile.addChildren(addedFunctions) } - override fun visitFile(declaration: IrFile) { - declaration.acceptChildrenVoid(this) - - declaration.addChildren(addedFunctions) - addedFunctions.clear() + override fun visitElement(element: IrElement, data: MutableList) { + element.acceptChildren(this, data) } - override fun visitClass(declaration: IrClass) { - declaration.acceptChildrenVoid(this) + override fun visitClass(declaration: IrClass, data: MutableList) { + declaration.acceptChildren(this, data) if (declaration.isLocal) return @@ -154,7 +150,7 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo +irReturn(irGetObjectValue(declaration.defaultType, declaration.symbol)) } } - addedFunctions.add(function) + data.add(function) } if (declaration.isInner) { @@ -167,7 +163,7 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo ) } } - addedFunctions.add(function) + data.add(function) } if (declaration.isEnumClass) { @@ -177,12 +173,12 @@ internal class ExportCachesAbiVisitor(val context: Context) : IrElementVisitorVo +irReturn(with(this@ExportCachesAbiVisitor.context.enumsSupport) { irGetValuesField(declaration) }) } } - addedFunctions.add(function) + data.add(function) } } - override fun visitProperty(declaration: IrProperty) { - declaration.acceptChildrenVoid(this) + override fun visitProperty(declaration: IrProperty, data: MutableList) { + declaration.acceptChildren(this, data) if (!declaration.isLateinit || declaration.isFakeOverride || 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)) } } - 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 enumsSupport = context.enumsSupport + override fun lower(irFile: IrFile) { + irFile.transformChildrenVoid(this) + } + override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression { expression.transformChildrenVoid(this)