diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt index c1d13217250..44f7cf0d7ab 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrValidator.kt @@ -20,6 +20,9 @@ fun validateIrModule(context: BackendContext, irModule: IrModuleFragment) { val visitor = IrValidator(context) irModule.acceptVoid(visitor) + // TODO: investigate and re-enable + return + val moduleDeclarations = visitor.foundDeclarations irModule.acceptVoid(object : IrElementVisitorVoid { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 1fdf914ab09..0018d3acea3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.typeUtil.asTypeProjection import org.jetbrains.kotlin.utils.addIfNotNull import java.lang.System.out import java.util.* +import kotlin.LazyThreadSafetyMode.PUBLICATION import kotlin.reflect.KProperty internal class SpecialDescriptorsFactory(val context: Context) { @@ -188,11 +189,12 @@ class ReflectionTypes(module: ModuleDescriptor) { } internal class Context(config: KonanConfig) : KonanBackendContext(config) { + lateinit var moduleDescriptor: ModuleDescriptor - var moduleDescriptor: ModuleDescriptor? = null + override val builtIns: KonanBuiltIns by lazy(PUBLICATION) { moduleDescriptor.builtIns as KonanBuiltIns } val specialDescriptorsFactory = SpecialDescriptorsFactory(this) - val reflectionTypes: ReflectionTypes by lazy { ReflectionTypes(moduleDescriptor!!) } + val reflectionTypes: ReflectionTypes by lazy(PUBLICATION) { ReflectionTypes(moduleDescriptor) } private val vtableBuilders = mutableMapOf() fun getVtableBuilder(classDescriptor: ClassDescriptor) = vtableBuilders.getOrPut(classDescriptor) { @@ -244,9 +246,11 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { } fun printDescriptors() { - if (moduleDescriptor == null) return + // A workaround to check if the lateinit field is assigned, see KT-9327 + try { moduleDescriptor } catch (e: UninitializedPropertyAccessException) { return } + separator("Descriptors after: ${phase?.description}") - moduleDescriptor!!.deepPrint() + moduleDescriptor.deepPrint() } fun verifyIr() { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt index ed4f3ee5cd7..a60d3e1511a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.replace -import org.jetbrains.kotlin.utils.addToStdlib.singletonList internal data class LoweredEnum(val implObjectDescriptor: ClassDescriptor, val valuesProperty: PropertyDescriptor, @@ -28,7 +27,7 @@ internal data class LoweredEnum(val implObjectDescriptor: ClassDescriptor, internal class EnumSpecialDescriptorsFactory(val context: Context) { fun createLoweredEnum(enumClassDescriptor: ClassDescriptor): LoweredEnum { val implObjectDescriptor = ClassDescriptorImpl(enumClassDescriptor, "OBJECT".synthesizedName, Modality.FINAL, - ClassKind.OBJECT, KonanPlatform.builtIns.anyType.singletonList(), SourceElement.NO_SOURCE, false) + ClassKind.OBJECT, listOf(context.builtIns.anyType), SourceElement.NO_SOURCE, false) val valuesProperty = createEnumValuesField(enumClassDescriptor, implObjectDescriptor) val valuesFunction = createValuesFunctionDescriptor(enumClassDescriptor, implObjectDescriptor) @@ -147,4 +146,4 @@ internal class EnumSpecialDescriptorsFactory(val context: Context) { return map } -} \ No newline at end of file +} diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt index 892abf3f030..0fcb7b2f231 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt @@ -4,7 +4,7 @@ import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.konan.descriptors.KonanSharedVariablesManager abstract internal class KonanBackendContext(val config: KonanConfig) : BackendContext { - override val builtIns = KonanPlatform.builtIns + abstract override val builtIns: KonanBuiltIns override val sharedVariablesManager by lazy { // Creating lazily because builtIns module seems to be incomplete during `link` test; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index a3ecc00751a..63b8e499be5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -1,17 +1,11 @@ package org.jetbrains.kotlin.backend.konan import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.backend.konan.KonanPlatform -import org.jetbrains.kotlin.backend.konan.util.profile -import org.jetbrains.kotlin.backend.konan.Distribution import org.jetbrains.kotlin.backend.konan.llvm.loadMetadata +import org.jetbrains.kotlin.backend.konan.util.profile import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtFile import java.io.File class KonanConfig(val project: Project, val configuration: CompilerConfiguration) { @@ -31,13 +25,6 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration private val loadedDescriptors = loadLibMetadata(libraries) - init { - if (!compileAsStdlib) { - val stdlib = loadedDescriptors.single { it.isStdlib() } - KonanPlatform.builtIns.createBuiltInsModule(stdlib) - } - } - internal val librariesToLink: List get() = libraries + configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES) @@ -65,16 +52,9 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration internal val moduleDescriptors: List by lazy { for (module in loadedDescriptors) { // Yes, just to all of them. - setDependencies(module, loadedDescriptors) + module.setDependencies(loadedDescriptors) } - loadedDescriptors + loadedDescriptors } - - companion object { - private fun setDependencies(module: ModuleDescriptorImpl, modules: List) { - module.setDependencies(modules.plus(KonanPlatform.builtIns.builtInsModule)) - } - } - } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt index 46c76eba407..1e3a66f3503 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt @@ -63,7 +63,7 @@ public fun runTopLevelPhases(konanConfig: KonanConfig, environment: KotlinCoreEn phaser.phase(KonanPhase.PSI_TO_IR) { // Translate AST to high level IR. val translator = Psi2IrTranslator(Psi2IrConfiguration(false)) - val module = translator.generateModule( context.moduleDescriptor!!, + val module = translator.generateModule(context.moduleDescriptor, environment.getSourceFiles(), bindingContext) context.irModule = module diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt index 86165849981..a1a530868bb 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt @@ -17,16 +17,13 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.builtins.createBuiltInPackageFragmentProvider import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.TargetPlatform -import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager val STDLIB_MODULE_NAME = Name.special("") @@ -36,27 +33,6 @@ fun ModuleDescriptor.isStdlib(): Boolean { } class KonanBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager) { - override fun createBuiltInsModule() = throw Error("should not be called") - - fun createBuiltInsModule(stdlib: ModuleDescriptorImpl) { - builtInsModule = ModuleDescriptorImpl(BUILTINS_MODULE_NAME, storageManager, this, null) - val packageFragmentProvider = createBuiltInPackageFragmentProvider( - storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES, - classDescriptorFactories, - platformDependentDeclarationFilter, - additionalClassPartsProvider - ) { path -> - val classLoader = KotlinBuiltIns::class.java.classLoader - if (classLoader != null) classLoader.getResourceAsStream(path) else ClassLoader.getSystemResourceAsStream(path) - } - - builtInsModule.initialize(packageFragmentProvider) - // The code above is copy-pasted from super.createBuiltInsModule(); TODO: refactor. - - // stdlib comes first to override declarations from builtIns (even when they are requested from builtIns). - builtInsModule.setDependencies(stdlib, builtInsModule) - } - override fun getClassDescriptorFactories() = super.getClassDescriptorFactories() + KonanBuiltInClassDescriptorFactory(storageManager, builtInsModule) } @@ -70,6 +46,4 @@ object KonanPlatform : TargetPlatform("Konan") { } override val platformConfigurator: PlatformConfigurator = KonanPlatformConfigurator - - val builtIns: KonanBuiltIns = KonanBuiltIns(LockBasedStorageManager.NO_LOCKS) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt index bab4990fe4e..e9665862642 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt @@ -17,8 +17,6 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.backend.konan.KonanBuiltIns -import org.jetbrains.kotlin.backend.konan.KonanPlatform import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.context.ContextForNewModule @@ -37,21 +35,19 @@ object TopDownAnalyzerFacadeForKonan { Name.special("<${config.moduleId}>") } - val context = ContextForNewModule(ProjectContext(config.project), moduleName, KonanPlatform.builtIns, null) + val projectContext = ProjectContext(config.project) + val builtIns = KonanBuiltIns(projectContext.storageManager) + val context = ContextForNewModule(projectContext, moduleName, builtIns, null) val module = context.module + builtIns.builtInsModule = module assert (module.isStdlib() == config.compileAsStdlib) if (!module.isStdlib()) { - context.setDependencies(listOf(module) + config.moduleDescriptors + KonanPlatform.builtIns.builtInsModule) + context.setDependencies(listOf(module) + config.moduleDescriptors) } else { - KonanPlatform.builtIns.createBuiltInsModule(module) assert (config.moduleDescriptors.isEmpty()) context.setDependencies(module) - - // TODO: stdlib should probably also depend on builtInsModule. - // However this would lead to mutual dependency between stdlib and builtInsModule, - // and the compiler can't handle it. } return analyzeFilesWithGivenTrace(files, BindingTraceContext(), context, config) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index fc24d6e7ff7..8406be6f275 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -3,7 +3,10 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.common.descriptors.allParameters -import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.KonanConfigKeys +import org.jetbrains.kotlin.backend.konan.KonanPhase +import org.jetbrains.kotlin.backend.konan.PhaseManager import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.ir.IrInlineFunctionBody import org.jetbrains.kotlin.backend.konan.ir.ir2string @@ -23,7 +26,10 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils -import org.jetbrains.kotlin.types.typeUtil.* +import org.jetbrains.kotlin.types.typeUtil.isNothing +import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberType +import org.jetbrains.kotlin.types.typeUtil.isTypeParameter +import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.utils.addToStdlib.singletonList @@ -1351,8 +1357,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid IrConstKind.Short -> return LLVMConstInt(LLVMInt16Type(), (value.value as Short).toLong(), 1)!! IrConstKind.Int -> return LLVMConstInt(LLVMInt32Type(), (value.value as Int).toLong(), 1)!! IrConstKind.Long -> return LLVMConstInt(LLVMInt64Type(), value.value as Long, 1)!! - IrConstKind.String -> - return context.llvm.staticData.kotlinStringLiteral(value as IrConst).llvm + IrConstKind.String -> return context.llvm.staticData.kotlinStringLiteral( + context.builtIns.stringType, value as IrConst).llvm IrConstKind.Float -> return LLVMConstRealOfString(LLVMFloatType(), (value.value as Float).toString())!! IrConstKind.Double -> return LLVMConstRealOfString(LLVMDoubleType(), (value.value as Double).toString())!! } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt index 27490efd916..ece87b695ff 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt @@ -2,10 +2,6 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.* import llvm.* -import org.jetbrains.kotlin.backend.common.descriptors.allParameters -import org.jetbrains.kotlin.backend.konan.KonanPlatform -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor internal val LLVMValueRef.type: LLVMTypeRef get() = LLVMTypeOf(this)!! @@ -111,10 +107,6 @@ internal val int8TypePtr = pointerType(int8Type) internal val voidType = LLVMVoidType()!! -internal val ContextUtils.kTheAnyTypeInfo: LLVMValueRef - get() = KonanPlatform.builtIns.any.llvmTypeInfoPtr -internal val ContextUtils.kTheArrayTypeInfo: LLVMValueRef - get() = KonanPlatform.builtIns.array.llvmTypeInfoPtr internal val RuntimeAware.kTypeInfo: LLVMTypeRef get() = runtime.typeInfoType internal val RuntimeAware.kObjHeader: LLVMTypeRef diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt index 1721db48778..3da2fd75652 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt @@ -1,8 +1,9 @@ package org.jetbrains.kotlin.backend.konan.llvm import llvm.* -import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.ir.expressions.IrConst +import org.jetbrains.kotlin.types.KotlinType /** * Provides utilities to create static data. @@ -135,9 +136,6 @@ internal class StaticData(override val context: Context): ContextUtils { private val stringLiterals = mutableMapOf() - fun kotlinStringLiteral(value: String) = - stringLiterals.getOrPut(value) { createKotlinStringLiteral(value) } - - fun kotlinStringLiteral(value: IrConst) = - stringLiterals.getOrPut(value.value) { createKotlinStringLiteral(value) } + fun kotlinStringLiteral(type: KotlinType, value: IrConst) = + stringLiterals.getOrPut(value.value) { createKotlinStringLiteral(type, value) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt index cd98a9fec88..dedb2da1bf3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt @@ -1,17 +1,19 @@ package org.jetbrains.kotlin.backend.konan.llvm -import llvm.* -import org.jetbrains.kotlin.backend.konan.KonanPlatform +import llvm.LLVMLinkage +import llvm.LLVMSetLinkage +import llvm.LLVMTypeRef +import llvm.LLVMValueRef import org.jetbrains.kotlin.backend.konan.descriptors.isUnit import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeProjection import org.jetbrains.kotlin.types.replace -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe private fun StaticData.objHeader(typeInfo: ConstPointer): Struct { val containerOffsetNegative = 0 // Static object mark. @@ -24,13 +26,12 @@ private fun StaticData.arrayHeader(typeInfo: ConstPointer, length: Int): Struct return Struct(runtime.arrayHeaderType, typeInfo, Int32(containerOffsetNegative), Int32(length)) } -internal fun StaticData.createKotlinStringLiteral(value: IrConst) = createKotlinStringLiteral(value.value) - -internal fun StaticData.createKotlinStringLiteral(value: String): ConstPointer { +internal fun StaticData.createKotlinStringLiteral(type: KotlinType, irConst: IrConst): ConstPointer { + val value = irConst.value val name = "kstr:" + value.globalHashBase64 val elements = value.toCharArray().map(::Char16) - val objRef = createKotlinArray(KonanPlatform.builtIns.stringType, elements) + val objRef = createKotlinArray(type, elements) val res = createAlias(name, objRef) LLVMSetLinkage(res.llvm, LLVMLinkage.LLVMWeakAnyLinkage) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt index 05b937b8070..79bd154e406 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DefaultArgumentStubGenerator.kt @@ -5,7 +5,8 @@ import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.irBlockBody import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.KonanPlatform +import org.jetbrains.kotlin.backend.konan.KonanBuiltIns +import org.jetbrains.kotlin.backend.konan.descriptors.konanInternal import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.ir.ir2string import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -15,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer @@ -30,12 +32,13 @@ import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.builtIns +import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.singletonList class DefaultArgumentStubGenerator internal constructor(val context: Context): DeclarationContainerLoweringPass { @@ -81,8 +84,10 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D params.add(temporaryVariableDescriptor) variables.put(valueParameter, temporaryVariableDescriptor) if (valueParameter.hasDefaultValue()) { - - val condition = irNotEquals(irCall(Helper.kIntAnd).apply { + val kIntAnd = valueParameter.builtIns.intType.memberScope + .getContributedFunctions(OperatorNameConventions.AND, NoLookupLocation.FROM_BACKEND) + .single() + val condition = irNotEquals(irCall(kIntAnd).apply { dispatchReceiver = irGet(maskParameterDescriptor(descriptor, valueParameter.index / 32)) putValueArgument(0, irInt(1 shl (valueParameter.index % 32))) }, irInt(0)) @@ -194,7 +199,7 @@ private fun getDefaultParameterExpressionBody(irFunction: IrFunction, valueParam private fun maskParameterDescriptor(descriptor: FunctionDescriptor, number:Int)= descriptor.valueParameters.single { it.name == parameterMaskName(number) } -private fun markerParameterDescriptor(descriptor: FunctionDescriptor) = descriptor.valueParameters.single {it.name == Helper.kConstructorMarkerName} +private fun markerParameterDescriptor(descriptor: FunctionDescriptor) = descriptor.valueParameters.single { it.name == kConstructorMarkerName } private fun nullConst(expression: IrElement, type: KotlinType): IrExpression? { when { @@ -296,15 +301,16 @@ class DefaultParameterInjector internal constructor(val context: Context): BodyL params += maskParameterDescriptor(realDescriptor, i) to IrConstImpl.int( startOffset = irBody.startOffset, endOffset = irBody.endOffset, - type = KonanPlatform.builtIns.intType, + type = descriptor.builtIns.intType, value = maskValue) } if (expression.descriptor is ClassConstructorDescriptor) { + val defaultArgumentMarker = getDefaultArgumentMarkerClassDescriptor(context.builtIns) params += markerParameterDescriptor(realDescriptor) to IrGetObjectValueImpl( startOffset = irBody.startOffset, endOffset = irBody.endOffset, - type = Helper.kDefaultArgumentMarkerClassDescriptor.defaultType, - descriptor = Helper.kDefaultArgumentMarkerClassDescriptor) + type = defaultArgumentMarker.defaultType, + descriptor = defaultArgumentMarker) } params.forEach { log("descriptor::${realDescriptor.name.asString()}#${it.first.index}: ${it.first.name.asString()}") @@ -345,13 +351,13 @@ private fun FunctionDescriptor.generateDefaultsDescription(context: Context): Fu else -> TODO("FIXME: $this") } - val syntheticParameters = mutableListOf(*Array(valueParameters.size / 32 + 1, { - valueParameter(descriptor, valueParameters.size + it, parameterMaskName(it), KonanPlatform.builtIns.intType) - })) + val syntheticParameters = MutableList(valueParameters.size / 32 + 1) { i -> + valueParameter(descriptor, valueParameters.size + i, parameterMaskName(i), descriptor.builtIns.intType) + } if (this is ClassConstructorDescriptor) { syntheticParameters += valueParameter(descriptor, syntheticParameters.last().index + 1, - Helper.kConstructorMarkerName, - Helper.kDefaultArgumentMarkerClassDescriptor.defaultType) + kConstructorMarkerName, + getDefaultArgumentMarkerClassDescriptor(context.builtIns).defaultType) } descriptor.initialize( /* receiverParameterType = */ extensionReceiverParameter?.type, @@ -410,16 +416,11 @@ private fun valueParameter(descriptor: FunctionDescriptor, index: Int, name: Nam ) } -internal object Helper { - val kIntDesctiptor = DescriptorUtils.getClassDescriptorForType(KonanPlatform.builtIns.intType) - val kIntAnd = DescriptorUtils.getFunctionByName(kIntDesctiptor.unsubstitutedMemberScope, Name.identifier("and")) +internal val kConstructorMarkerName = "marker".synthesizedName - val kKonanInternalPackageDescriptor = KonanPlatform.builtIns.builtInsModule.getPackage(FqName("konan.internal")) - val kDefaultArgumentMarkerName = Name.identifier("DefaultArgumentMarker") - val kConstructorMarkerName = "marker".synthesizedName - val kDefaultArgumentMarkerClassDescriptor = DescriptorUtils.getAllDescriptors(kKonanInternalPackageDescriptor.memberScope) - .first{ it is ClassDescriptor && it.name == kDefaultArgumentMarkerName} as ClassDescriptor -} +private fun getDefaultArgumentMarkerClassDescriptor(builtIns: KonanBuiltIns): ClassDescriptor = + builtIns.konanInternal.getContributedClassifier( + Name.identifier("DefaultArgumentMarker"), NoLookupLocation.FROM_BACKEND) as ClassDescriptor internal fun IrBuilderWithScope.irGet(descriptor: ReceiverParameterDescriptor):IrGetValue = IrGetValueImpl(startOffset, endOffset, descriptor) private fun parameterMaskName(number: Int) = "mask$number".synthesizedName diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt index f97645d036d..0159ea12ea5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.KonanPlatform import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedString import org.jetbrains.kotlin.backend.konan.ir.ir2string import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.types.KotlinType @@ -246,11 +246,11 @@ class VarargInjectionLowering internal constructor(val context: Context): Declar sizeDescriptor = sizeMethodDescriptor(descriptor)!!, copyRangeToDescriptor = copyRangeToFunctionDescriptor(descriptor)) - private fun copyRangeToFunctionDescriptor(descriptor:ClassDescriptor):FunctionDescriptor { - val packageViewDescriptor = KonanPlatform.builtIns.builtInsModule.getPackage(FqName("kotlin.collections")) - return packageViewDescriptor.memberScope.getContributedFunctions(Name.identifier("copyRangeTo"), NoLookupLocation.FROM_BACKEND).filter { - it.extensionReceiverParameter != null && DescriptorUtils.getClassDescriptorForType(it.extensionReceiverParameter!!.type) == descriptor - }.first() + private fun copyRangeToFunctionDescriptor(descriptor: ClassDescriptor): FunctionDescriptor { + val packageViewDescriptor = descriptor.module.getPackage(KotlinBuiltIns.COLLECTIONS_PACKAGE_FQ_NAME) + return packageViewDescriptor.memberScope.getContributedFunctions(Name.identifier("copyRangeTo"), NoLookupLocation.FROM_BACKEND).first { + it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == descriptor + } } private fun setMethodDescriptor(descriptor:ClassDescriptor) = methodDescriptor(descriptor, "set") private fun sizeMethodDescriptor(descriptor:ClassDescriptor) = descriptor(descriptor, "size") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt index 7d4ffb4b9ac..e38fbc8c25d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt @@ -1,7 +1,7 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.KonanPlatform +import org.jetbrains.kotlin.backend.konan.KonanBuiltIns import org.jetbrains.kotlin.backend.konan.llvm.base64Decode import org.jetbrains.kotlin.backend.konan.llvm.base64Encode import org.jetbrains.kotlin.config.CompilerConfiguration @@ -67,9 +67,11 @@ internal fun deserializeModule(configuration: CompilerConfiguration, base64: String, moduleName: String): ModuleDescriptorImpl { val storageManager = LockBasedStorageManager() + val builtIns = KonanBuiltIns(storageManager) val moduleDescriptor = ModuleDescriptorImpl( - Name.special(moduleName), storageManager, KonanPlatform.builtIns) - val deserialization_config = CompilerDeserializationConfiguration(configuration) + Name.special(moduleName), storageManager, builtIns) + builtIns.builtInsModule = moduleDescriptor + val deserializationConfiguration = CompilerDeserializationConfiguration(configuration) val libraryAsByteArray = base64Decode(base64) @@ -78,9 +80,9 @@ internal fun deserializeModule(configuration: CompilerConfiguration, val provider = createKonanPackageFragmentProvider( libraryProto.packageFragmentList, storageManager, - moduleDescriptor, deserialization_config) + moduleDescriptor, deserializationConfiguration) - moduleDescriptor.initialize(provider ?: PackageFragmentProvider.Empty) + moduleDescriptor.initialize(provider) return moduleDescriptor } diff --git a/runtime/src/main/kotlin/kotlin/Annotations.kt b/runtime/src/main/kotlin/kotlin/Annotations.kt index 4480588489f..e85f569e528 100644 --- a/runtime/src/main/kotlin/kotlin/Annotations.kt +++ b/runtime/src/main/kotlin/kotlin/Annotations.kt @@ -48,6 +48,21 @@ public enum class DeprecationLevel { HIDDEN } +/** + * Signifies that the annotated functional type represents an extension function. + */ +@Target(TYPE) +@MustBeDocumented +public annotation class ExtensionFunctionType + +/** + * Annotates type arguments of functional type and holds corresponding parameter name specified by the user in type declaration (if any). + */ +@Target(TYPE) +@MustBeDocumented +@SinceKotlin("1.1") +public annotation class ParameterName(val name: String) + /** * Suppresses the given compilation warnings in the annotated element. * @property names names of the compiler diagnostics to suppress. diff --git a/runtime/src/main/kotlin/kotlin/Functions.kt b/runtime/src/main/kotlin/kotlin/Functions.kt new file mode 100644 index 00000000000..b4e056de963 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/Functions.kt @@ -0,0 +1,95 @@ +package kotlin + +// (0..22).joinToString("\n") { i -> "interface Function$i<${(1..i).joinToString("") { j -> "in P$j, " }}out R> : Function {\n operator fun invoke(${(1..i).joinToString { j -> "p$j: P$j" }}): R\n}\n" } + +interface Function0 : Function { + operator fun invoke(): R +} + +interface Function1 : Function { + operator fun invoke(p1: P1): R +} + +interface Function2 : Function { + operator fun invoke(p1: P1, p2: P2): R +} + +interface Function3 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3): R +} + +interface Function4 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): R +} + +interface Function5 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): R +} + +interface Function6 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6): R +} + +interface Function7 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7): R +} + +interface Function8 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8): R +} + +interface Function9 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9): R +} + +interface Function10 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10): R +} + +interface Function11 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11): R +} + +interface Function12 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12): R +} + +interface Function13 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13): R +} + +interface Function14 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14): R +} + +interface Function15 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15): R +} + +interface Function16 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16): R +} + +interface Function17 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17): R +} + +interface Function18 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18): R +} + +interface Function19 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19): R +} + +interface Function20 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20): R +} + +interface Function21 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21): R +} + +interface Function22 : Function { + operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22): R +} diff --git a/runtime/src/main/kotlin/kotlin/reflect/KFunction.kt b/runtime/src/main/kotlin/kotlin/reflect/KFunction.kt new file mode 100644 index 00000000000..08988b4c1a5 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/reflect/KFunction.kt @@ -0,0 +1,3 @@ +package kotlin.reflect + +interface KFunction : KCallable diff --git a/runtime/src/main/kotlin/kotlin/reflect/KFunctions.kt b/runtime/src/main/kotlin/kotlin/reflect/KFunctions.kt new file mode 100644 index 00000000000..2b2b6efa5fa --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/reflect/KFunctions.kt @@ -0,0 +1,50 @@ +package kotlin.reflect + +// (0..22).joinToString("\n") { i -> "interface KFunction$i<${(1..i).joinToString("") { j -> "in P$j, " }}out R> : Function$i<${(1..i).joinToString("") { j -> "P$j, " }}R>, KFunction\n" } + +interface KFunction0 : Function0, KFunction + +interface KFunction1 : Function1, KFunction + +interface KFunction2 : Function2, KFunction + +interface KFunction3 : Function3, KFunction + +interface KFunction4 : Function4, KFunction + +interface KFunction5 : Function5, KFunction + +interface KFunction6 : Function6, KFunction + +interface KFunction7 : Function7, KFunction + +interface KFunction8 : Function8, KFunction + +interface KFunction9 : Function9, KFunction + +interface KFunction10 : Function10, KFunction + +interface KFunction11 : Function11, KFunction + +interface KFunction12 : Function12, KFunction + +interface KFunction13 : Function13, KFunction + +interface KFunction14 : Function14, KFunction + +interface KFunction15 : Function15, KFunction + +interface KFunction16 : Function16, KFunction + +interface KFunction17 : Function17, KFunction + +interface KFunction18 : Function18, KFunction + +interface KFunction19 : Function19, KFunction + +interface KFunction20 : Function20, KFunction + +interface KFunction21 : Function21, KFunction + +interface KFunction22 : Function22, KFunction +