diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt index 8e284e8d6f3..4db3d9dd76f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt @@ -67,6 +67,12 @@ internal val removeExpectDeclarationsPhase = makeKonanModuleLoweringPhase( description = "Expect declarations removing" ) +internal val stripTypeAliasDeclarationsPhase = makeKonanModuleLoweringPhase( + { StripTypeAliasDeclarationsLowering() }, + name = "StripTypeAliasDeclarations", + description = "Strip typealias declarations" +) + internal val lowerBeforeInlinePhase = makeKonanModuleLoweringPhase( ::PreInlineLowering, name = "LowerBeforeInline", diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index b5d1d415a83..bc10e9e2b30 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -244,6 +244,7 @@ internal val allLoweringsPhase = namedIrModulePhase( name = "IrLowering", description = "IR Lowering", lower = removeExpectDeclarationsPhase then + stripTypeAliasDeclarationsPhase then lowerBeforeInlinePhase then arrayConstructorPhase then inlinePhase then diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt index 0da5430f491..c8b56c60c5c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt @@ -29,7 +29,6 @@ import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.isNothing -import org.jetbrains.kotlin.ir.types.toKotlinType import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.defaultOrNullableType import org.jetbrains.kotlin.ir.util.isNullConst @@ -50,13 +49,20 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid(this) - val descriptor = expression.descriptor - if (descriptor is IrBuiltinOperatorDescriptor) { - return transformBuiltinOperator(expression) + return when (expression.symbol) { + irBuiltins.eqeqSymbol, in ieee754EqualsSymbols() -> lowerEqeq(expression) + + irBuiltins.eqeqeqSymbol -> lowerEqeqeq(expression) + + irBuiltins.checkNotNullSymbol -> lowerCheckNotNull(expression) + + irBuiltins.noWhenBranchMatchedExceptionSymbol -> IrCallImpl(expression.startOffset, expression.endOffset, + context.ir.symbols.ThrowNoWhenBranchMatchedException.owner.returnType, + context.ir.symbols.ThrowNoWhenBranchMatchedException) + + else -> expression } - - return expression } override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression { @@ -70,22 +76,6 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, private fun ieee754EqualsSymbols(): List = irBuiltins.ieee754equalsFunByOperandType.values.toList() - private fun transformBuiltinOperator(expression: IrCall): IrExpression = when (expression.symbol) { - irBuiltins.eqeqSymbol, in ieee754EqualsSymbols() -> lowerEqeq(expression) - - irBuiltins.eqeqeqSymbol -> lowerEqeqeq(expression) - - irBuiltins.throwNpeSymbol -> IrCallImpl(expression.startOffset, expression.endOffset, - context.ir.symbols.ThrowNullPointerException.owner.returnType, - context.ir.symbols.ThrowNullPointerException) - - irBuiltins.noWhenBranchMatchedExceptionSymbol -> IrCallImpl(expression.startOffset, expression.endOffset, - context.ir.symbols.ThrowNoWhenBranchMatchedException.owner.returnType, - context.ir.symbols.ThrowNoWhenBranchMatchedException) - - else -> expression - } - private fun lowerEqeqeq(expression: IrCall): IrExpression { val lhs = expression.getValueArgument(0)!! val rhs = expression.getValueArgument(1)!! @@ -184,17 +174,22 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, private fun IrBuilderWithScope.irEqeqNull(expression: IrExpression): IrExpression { val type = expression.type.makeNullable() - val primitiveBinaryTypeOrNull = type.computePrimitiveBinaryTypeOrNull() - return when (primitiveBinaryTypeOrNull) { + return when (val primitiveBinaryTypeOrNull = type.computePrimitiveBinaryTypeOrNull()) { null -> irEqeqeq(reinterpret(expression, type, irBuiltins.anyNType), irNull()) PrimitiveBinaryType.POINTER -> irCall(symbols.areEqualByValue[PrimitiveBinaryType.POINTER]!!.owner).apply { putValueArgument(0, reinterpret(expression, type, symbols.nativePtrType)) putValueArgument(1, reinterpret(irNull(), type, symbols.nativePtrType)) } - else -> error("Nullable type ${type.toKotlinType()} is $primitiveBinaryTypeOrNull") + else -> error("Nullable type ${type.render()} is $primitiveBinaryTypeOrNull") } } + private fun lowerCheckNotNull(expression: IrCall) = builder.at(expression).irBlock { + val temp = irTemporary(expression.getValueArgument(0)!!) + +irIfThen(context.irBuiltIns.unitType, irEqeqNull(irGet(temp)), irCall(symbols.ThrowNullPointerException)) + +irGet(temp) + } + private fun IrBuilderWithScope.irLogicalAnd(lhs: IrExpression, rhs: IrExpression) = context.andand(lhs, rhs) private fun IrBuilderWithScope.irIsNull(exp: IrExpression) = irEqeqeq(exp, irNull()) private fun IrBuilderWithScope.irIsNotNull(exp: IrExpression) = irNot(irEqeqeq(exp, irNull())) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt index 68189e4b5d7..286a9018561 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt @@ -16,12 +16,9 @@ import org.jetbrains.kotlin.ir.util.irCall internal class KonanDefaultParameterInjector(private val konanContext: KonanBackendContext) : DefaultParameterInjector(konanContext, skipInline = false) { - override fun nullConst(expression: IrElement, type: IrType): IrExpression { + override fun nullConst(startOffset: Int, endOffset: Int, type: IrType): IrExpression { val symbols = konanContext.ir.symbols - val startOffset = expression.startOffset - val endOffset = expression.endOffset - val nullConstOfEquivalentType = when (type.computePrimitiveBinaryTypeOrNull()) { null -> IrConstImpl.constNull(startOffset, endOffset, context.irBuiltIns.nothingNType) PrimitiveBinaryType.BOOLEAN -> IrConstImpl.boolean(startOffset, endOffset, type, false) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt index 61c20db1a01..9eecc1c0889 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt @@ -65,10 +65,11 @@ internal class KonanSerializerExtension(val context: Context, override val metad override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer) { proto.setExtension(KonanProtoBuf.functionFile, sourceFileMap.assign(descriptor.source.containingFile)) uniqId(descriptor) ?. let { proto.setExtension(KonanProtoBuf.functionUniqId, it) } - super.serializeFunction(descriptor, proto, childSerializer) + super.serializeFunction(descriptor, proto, versionRequirementTable, childSerializer) } override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, @@ -79,6 +80,11 @@ internal class KonanSerializerExtension(val context: Context, override val metad super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer) } + override fun serializeTypeAlias(typeAlias: TypeAliasDescriptor, proto: ProtoBuf.TypeAlias.Builder) { + uniqId(typeAlias)?.let { proto.setExtension(KonanProtoBuf.typeAliasUniqId, it) } + super.serializeTypeAlias(typeAlias, proto) + } + override fun releaseCoroutines(): Boolean = context.config.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/UniqId.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/UniqId.kt index 745b34347da..3be7cf56d91 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/UniqId.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/UniqId.kt @@ -19,6 +19,7 @@ object KonanDescriptorUniqIdAware: DescriptorUniqIdAware { is DeserializedPropertyDescriptor -> this.proto.tryGetExtension(KonanProtoBuf.propertyUniqId) is DeserializedClassConstructorDescriptor -> this.proto.tryGetExtension(KonanProtoBuf.constructorUniqId) is DeserializedTypeParameterDescriptor -> this.proto.tryGetExtension(KonanProtoBuf.typeParamUniqId) + is DeserializedTypeAliasDescriptor -> this.proto.tryGetExtension(KonanProtoBuf.typeAliasUniqId) else -> null }?.index } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt index 1f4a8cf2e00..6aa3e1ed6ec 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt @@ -11,8 +11,6 @@ import org.jetbrains.kotlin.backend.common.descriptors.WrappedVariableDescriptor import org.jetbrains.kotlin.backend.common.descriptors.substitute import org.jetbrains.kotlin.backend.konan.KonanBackendContext import org.jetbrains.kotlin.backend.konan.KonanCompilationException -import org.jetbrains.kotlin.backend.konan.KonanFqNames -import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation import org.jetbrains.kotlin.backend.konan.ir.containsNull @@ -154,14 +152,8 @@ fun IrBuilderWithScope.irForceNotNull(expression: IrExpression): IrExpression { return expression } - return irBlock { - val temporary = irTemporaryVar(expression) - +irIfNull( - expression.type, - subject = irGet(temporary), - thenPart = irThrowNpe(IrStatementOrigin.EXCLEXCL), - elsePart = irGet(temporary) - ) + return irCall(context.irBuiltIns.checkNotNullSymbol).apply { + putValueArgument(0, expression) } } diff --git a/extracted/konan.metadata/src/KonanProtoBuf.proto b/extracted/konan.metadata/src/KonanProtoBuf.proto index 6f1fdba17df..480be3501ec 100644 --- a/extracted/konan.metadata/src/KonanProtoBuf.proto +++ b/extracted/konan.metadata/src/KonanProtoBuf.proto @@ -60,6 +60,11 @@ extend ValueParameter { optional DescriptorUniqId value_param_uniq_id = 171; } +extend TypeAlias { + // TODO repeated org.jetbrains.kotlin.metadata.Annotation type_alias_annotation = 130; + optional DescriptorUniqId type_alias_uniq_id = 131; +} + extend Type { repeated Annotation type_annotation = 170; } diff --git a/gradle.properties b/gradle.properties index 441b7ca891a..6ef11c4015f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,8 +18,8 @@ buildKotlinVersion=1.3.50-dev-787 buildKotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_Compiler),number:1.3.50-dev-787,branch:default:any,pinned:true/artifacts/content/maven remoteRoot=konan_tests -kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_Compiler),number:1.3.60-dev-346,branch:default:any,pinned:true/artifacts/content/maven -kotlinVersion=1.3.60-dev-346 +kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_Compiler),number:1.3.60-dev-1120,branch:default:any,pinned:true/artifacts/content/maven +kotlinVersion=1.3.60-dev-1120 kotlinStdlibRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_Compiler),number:1.3.60-dev-570,branch:default:any,pinned:true/artifacts/content/maven kotlinStdlibVersion=1.3.60-dev-570 testKotlinCompilerVersion=1.3.60-dev-346