[K/N][IR] Made caches ABI lowerings per file
This commit is contained in:
+13
@@ -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"
|
||||
)
|
||||
+2
-19
@@ -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<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(
|
||||
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
|
||||
|
||||
+22
-22
@@ -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<Unit, MutableList<IrFunction>> {
|
||||
private val cachesAbiSupport = context.cachesAbiSupport
|
||||
private val addedFunctions = mutableListOf<IrFunction>()
|
||||
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildrenVoid(this)
|
||||
override fun lower(irFile: IrFile) {
|
||||
val addedFunctions = mutableListOf<IrFunction>()
|
||||
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<IrFunction>) {
|
||||
element.acceptChildren(this, data)
|
||||
}
|
||||
|
||||
override fun visitClass(declaration: IrClass) {
|
||||
declaration.acceptChildrenVoid(this)
|
||||
override fun visitClass(declaration: IrClass, data: MutableList<IrFunction>) {
|
||||
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<IrFunction>) {
|
||||
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user