Skip to content

Commit 17ef26b

Browse files
alexander-gorshenevminamoto79
authored andcommitted
K/N counterparts for:
Construct fake overrides after IR deserialization Signature based fake override validation (cherry picked from commit c2b1b976d79d7bbe9e80b8f7f2f382420c2d3805)
1 parent 212393e commit 17ef26b

File tree

6 files changed

+30
-43
lines changed

6 files changed

+30
-43
lines changed

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.backend.konan
33
import org.jetbrains.kotlin.backend.common.*
44
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
55
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
6+
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideChecker
67
import org.jetbrains.kotlin.backend.common.phaser.*
78
import org.jetbrains.kotlin.backend.common.serialization.mangle.ManglerChecker
89
import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.Ir2DescriptorManglerAdapter
@@ -19,18 +20,17 @@ import org.jetbrains.kotlin.backend.konan.serialization.*
1920
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
2021
import org.jetbrains.kotlin.config.CommonConfigurationKeys
2122
import org.jetbrains.kotlin.config.languageVersionSettings
22-
import org.jetbrains.kotlin.descriptors.*
23+
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
24+
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
2325
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
2426
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
2527
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
26-
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
2728
import org.jetbrains.kotlin.ir.declarations.IrFile
2829
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
2930
import org.jetbrains.kotlin.ir.symbols.IrSymbol
3031
import org.jetbrains.kotlin.ir.util.*
3132
import org.jetbrains.kotlin.ir.visitors.acceptVoid
3233
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
33-
import org.jetbrains.kotlin.name.FqName
3434
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
3535
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
3636
import org.jetbrains.kotlin.utils.DFS
@@ -168,7 +168,8 @@ internal val psiToIrPhase = konanUnitPhase(
168168

169169
val irProviderForCEnumsAndCStructs =
170170
IrProviderForCEnumAndCStructStubs(generatorContext, interopBuiltIns, symbols)
171-
val deserializer = KonanIrLinker(
171+
val linker =
172+
KonanIrLinker(
172173
moduleDescriptor,
173174
functionIrClassFactory,
174175
this as LoggingContext,
@@ -188,7 +189,7 @@ internal val psiToIrPhase = konanUnitPhase(
188189
generatorContext.symbolTable,
189190
generatorContext.typeTranslator,
190191
generatorContext.irBuiltIns,
191-
linker = deserializer
192+
linker = linker
192193
)
193194
pluginExtensions.forEach { extension ->
194195
extension.generate(module, pluginContext)
@@ -212,7 +213,7 @@ internal val psiToIrPhase = konanUnitPhase(
212213
val kotlinLibrary = dependency.getCapability(KlibModuleOrigin.CAPABILITY)?.let {
213214
(it as? DeserializedKlibModuleOrigin)?.library
214215
}
215-
deserializer.deserializeIrModuleHeader(dependency, kotlinLibrary)
216+
linker.deserializeIrModuleHeader(dependency, kotlinLibrary)
216217
}
217218
if (dependencies.size == dependenciesCount) break
218219
dependenciesCount = dependencies.size
@@ -224,7 +225,7 @@ internal val psiToIrPhase = konanUnitPhase(
224225
.filter(ModuleDescriptor::isFromInteropLibrary)
225226
.forEach(irProviderForCEnumsAndCStructs::referenceAllEnumsAndStructsFrom)
226227

227-
val irProviders = listOf(deserializer)
228+
val irProviders = listOf(linker)
228229
stubGenerator.setIrProviders(irProviders)
229230

230231
expectDescriptorToSymbol = mutableMapOf<DeclarationDescriptor, IrSymbol>()
@@ -239,7 +240,7 @@ internal val psiToIrPhase = konanUnitPhase(
239240
if (expectActualLinker) expectDescriptorToSymbol else null
240241
)
241242

242-
deserializer.postProcess()
243+
linker.postProcess()
243244

244245
if (this.stdlibModule in modulesWithoutDCE) {
245246
functionIrClassFactory.buildAllClasses()
@@ -249,13 +250,15 @@ internal val psiToIrPhase = konanUnitPhase(
249250
stubGenerator.unboundSymbolGeneration = true
250251

251252
module.acceptVoid(ManglerChecker(KonanManglerIr, Ir2DescriptorManglerAdapter(KonanManglerDesc)))
253+
val fakeOverrideChecker = FakeOverrideChecker(KonanManglerIr, KonanManglerDesc)
254+
linker.modules.values.forEach{ fakeOverrideChecker.check(it) }
252255

253256
irModule = module
254-
irModules = deserializer.modules.filterValues { llvmModuleSpecification.containsModule(it) }
257+
irModules = linker.modules.filterValues { llvmModuleSpecification.containsModule(it) }
255258
ir.symbols = symbols
256259

257260
functionIrClassFactory.module =
258-
(listOf(irModule!!) + deserializer.modules.values)
261+
(listOf(irModule!!) + linker.modules.values)
259262
.single { it.descriptor.isNativeStdlib() }
260263
},
261264
name = "Psi2Ir",

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForInteropStubs.kt

Lines changed: 0 additions & 31 deletions
This file was deleted.

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import org.jetbrains.kotlin.descriptors.konan.CompiledKlibModuleOrigin
1515
import org.jetbrains.kotlin.descriptors.konan.CurrentKlibModuleOrigin
1616
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
1717
import org.jetbrains.kotlin.ir.declarations.*
18+
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
1819
import org.jetbrains.kotlin.ir.util.file
1920
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
2021
import org.jetbrains.kotlin.ir.util.isReal
22+
import org.jetbrains.kotlin.ir.util.render
2123
import org.jetbrains.kotlin.konan.library.KonanLibrary
2224
import org.jetbrains.kotlin.konan.target.KonanTarget
2325
import org.jetbrains.kotlin.library.KotlinLibrary
@@ -164,7 +166,6 @@ internal interface ContextUtils : RuntimeAware {
164166
val IrFunction.llvmFunctionOrNull: LLVMValueRef?
165167
get() {
166168
assert(this.isReal)
167-
168169
return if (isExternal(this)) {
169170
runtime.addedLLVMExternalFunctions.getOrPut(this) { context.llvm.externalFunction(this.symbolName, getLlvmFunctionType(this),
170171
origin = this.llvmSymbolOrigin) }

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,9 @@ internal object DataFlowIR {
527527
type.superTypes += irClass.superTypes.map { mapClassReferenceType(it.getClass()!!) }
528528
if (!isAbstract) {
529529
val layoutBuilder = context.getLayoutBuilder(irClass)
530-
type.vtable += layoutBuilder.vtableEntries.map { mapFunction(it.getImplementation(context)!!) }
530+
type.vtable += layoutBuilder.vtableEntries.map {
531+
mapFunction(it.getImplementation(context)!!)
532+
}
531533
layoutBuilder.methodTableEntries.forEach {
532534
type.itable[it.overriddenFunction.functionName.localHash.value] = mapFunction(it.getImplementation(context)!!)
533535
}

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ class KonanIrFileSerializer(
2323

2424
override fun backendSpecificExplicitRoot(declaration: IrClass) =
2525
declaration.annotations.hasAnnotation(RuntimeNames.exportTypeInfoAnnotation)
26+
27+
override fun backendSpecificSerializeAllMembers(irClass: IrClass) = !KonanFakeOverrideClassFilter.constructFakeOverrides(irClass)
2628
}

backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
1717
package org.jetbrains.kotlin.backend.konan.serialization
1818

1919
import org.jetbrains.kotlin.backend.common.LoggingContext
20+
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilderImpl
21+
import org.jetbrains.kotlin.backend.common.overrides.PlatformFakeOverrideClassFilter
2022
import org.jetbrains.kotlin.backend.common.serialization.*
2123
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
24+
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
2225
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
2326
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
2427
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
28+
import org.jetbrains.kotlin.backend.konan.isObjCClass
2529
import org.jetbrains.kotlin.descriptors.*
2630
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
2731
import org.jetbrains.kotlin.descriptors.konan.kotlinLibrary
@@ -41,6 +45,10 @@ import org.jetbrains.kotlin.name.FqName
4145
import org.jetbrains.kotlin.name.Name
4246
import org.jetbrains.kotlin.resolve.descriptorUtil.module
4347

48+
object KonanFakeOverrideClassFilter : PlatformFakeOverrideClassFilter {
49+
override fun constructFakeOverrides(clazz: IrClass): Boolean = !clazz.isObjCClass()
50+
}
51+
4452
internal class KonanIrLinker(
4553
private val currentModule: ModuleDescriptor,
4654
override val functionalInteraceFactory: IrAbstractFunctionFactory,
@@ -64,6 +72,8 @@ internal class KonanIrLinker(
6472

6573
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean = moduleDescriptor.isNativeStdlib()
6674

75+
override val fakeOverrideBuilderImpl = FakeOverrideBuilderImpl(symbolTable, IdSignatureSerializer(KonanManglerIr), builtIns, KonanFakeOverrideClassFilter)
76+
6777
private val forwardDeclarationDeserializer = forwardModuleDescriptor?.let { KonanForwardDeclarationModuleDeserialier(it) }
6878

6979
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: IrLibrary?, strategy: DeserializationStrategy): IrModuleDeserializer {

0 commit comments

Comments
 (0)