diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index e58fe44649e..347fe572513 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -173,22 +173,6 @@ internal val PropertyDescriptor.symbolName: String } -internal val TypeParameterDescriptor.symbolName: String - get() { - val containingDeclarationPart = containingDeclaration.fqNameSafe.let { - if (it.isRoot) "" else "$it." - } - return "ktypeparam:$containingDeclarationPart$name" - } - -internal val ValueParameterDescriptor.symbolName: String - get() { - val containingDeclarationPart = containingDeclaration.fqNameSafe.let { - if (it.isRoot) "" else "$it." - } - return "kvalueparam:$containingDeclarationPart$name" - } - private fun getStringValue(annotation: AnnotationDescriptor): String? { annotation.allValueArguments.values.ifNotEmpty { val stringValue = this.single() as StringValue diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DescriptorTable.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DescriptorTable.kt index e53bb2138ac..a989c247065 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DescriptorTable.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DescriptorTable.kt @@ -29,54 +29,39 @@ import org.jetbrains.kotlin.backend.konan.llvm.typeInfoSymbolName import org.jetbrains.kotlin.backend.konan.llvm.symbolName import org.jetbrains.kotlin.backend.konan.llvm.localHash -// TODO: We take Long hash .toInt() here. -// Make it long all the way down to the protobuf? -internal fun DeclarationDescriptor.uniqId(): Int = when (this) { - is FunctionDescriptor -> { - this.symbolName.localHash.value.toInt() - } - is PropertyDescriptor -> { - this.symbolName.localHash.value.toInt() - } - is TypeParameterDescriptor -> { - this.symbolName.localHash.value.toInt() - } - is ValueParameterDescriptor -> { - this.symbolName.localHash.value.toInt() - } - is ClassDescriptor -> { - this.typeInfoSymbolName.localHash.value.toInt() - } +internal fun DeclarationDescriptor.symbolName(): String = when (this) { + is FunctionDescriptor + -> this.symbolName + is PropertyDescriptor + -> this.symbolName + is ClassDescriptor + -> this.typeInfoSymbolName else -> error("Unexpected exported descriptor: $this") } +internal val DeclarationDescriptor.uniqId + get() = this.symbolName().localHash.value -// TODO: we currently just assign each encountered -// descriptor a new int id. -// That;s okay until we have more than one external module. -// In that case the descriptors will get different ids. -// Need to come up with a stable scheme of ids -// dependant on something like FunctionDescriptor.functionName + +// TODO: We don't manage id clashes anyhow now. class DescriptorTable(val builtIns: IrBuiltIns) { - val table = mutableMapOf() - var currentIndex = 0 + val table = mutableMapOf() + var currentIndex = 0L init { - builtIns.irBuiltInDescriptors.forEachIndexed { - index, descriptor -> - - table.put(descriptor, index) - currentIndex = index + 1 + builtIns.irBuiltInDescriptors.forEach { + table.put(it, it.uniqId) } } - fun indexByValue(value: DeclarationDescriptor): Int { + fun indexByValue(value: DeclarationDescriptor): Long { val index = table.getOrPut(value) { - if (!value.isExported()) { + if (!value.isExported() + || value is TypeParameterDescriptor) { currentIndex++ } else { - value.uniqId() + value.uniqId } } return index @@ -85,12 +70,11 @@ class DescriptorTable(val builtIns: IrBuiltIns) { class IrDeserializationDescriptorIndex(irBuiltIns: IrBuiltIns) { - val map = mutableMapOf() + val map = mutableMapOf() init { - irBuiltIns.irBuiltInDescriptors.forEachIndexed { - index, descriptor -> - map.put(index, descriptor) + irBuiltIns.irBuiltInDescriptors.forEach { + map.put(it.uniqId, it) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt index e93e995bb80..5d7f4c49489 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt @@ -39,6 +39,55 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor import org.jetbrains.kotlin.types.KotlinType +fun newUniqId(index: Long): KonanLinkData.UniqId = + KonanLinkData.UniqId.newBuilder().setIndex(index).build() + +val ProtoBuf.Function.functionIndex: Long + get() = this.getExtension(KonanLinkData.functionIndex).index + +val ProtoBuf.Constructor.constructorIndex: Long + get() = this.getExtension(KonanLinkData.constructorIndex).index + +val ProtoBuf.Property.propertyIndex: Long + get() = this.getExtension(KonanLinkData.propertyIndex).index + + +fun ProtoBuf.Function.Builder.setFunctionIndex(index: Long) + = this.setExtension(KonanLinkData.functionIndex, newUniqId(index)) + +fun ProtoBuf.Constructor.Builder.setConstructorIndex(index: Long) + = this.setExtension(KonanLinkData.constructorIndex, newUniqId(index)) + +fun ProtoBuf.Property.Builder.setPropertyIndex(index: Long) + = this.setExtension(KonanLinkData.propertyIndex, newUniqId(index)) + +fun ProtoBuf.Class.Builder.setClassIndex(index: Long) + = this.setExtension(KonanLinkData.classIndex, newUniqId(index)) + + +val KonanIr.KotlinDescriptor.index: Long + get() = this.uniqId.index + +fun KonanIr.KotlinDescriptor.Builder.setIndex(index: Long) + = this.setUniqId(newUniqId(index)) + +val KonanIr.KotlinDescriptor.originalIndex: Long + get() = this.originalUniqId.index + +fun KonanIr.KotlinDescriptor.Builder.setOriginalIndex(index: Long) + = this.setOriginalUniqId(newUniqId(index)) + +val KonanIr.KotlinDescriptor.dispatchReceiverIndex: Long + get() = this.dispatchReceiverUniqId.index + +fun KonanIr.KotlinDescriptor.Builder.setDispatchReceiverIndex(index: Long) + = this.setDispatchReceiverUniqId(newUniqId(index)) + +val KonanIr.KotlinDescriptor.extensionReceiverIndex: Long + get() = this.extensionReceiverUniqId.index + +fun KonanIr.KotlinDescriptor.Builder.setExtensionReceiverIndex(index: Long) + = this.setExtensionReceiverUniqId(newUniqId(index)) internal fun printType(proto: ProtoBuf.Type) { println("debug text: " + proto.getExtension(KonanLinkData.typeText)) @@ -92,12 +141,11 @@ internal class IrDescriptorDeserializer(val context: Context, return type } - fun deserializeLocalDeclaration(proto: KonanLinkData.Descriptor): DeclarationDescriptor { when { proto.hasFunction() -> { val functionProto = proto.function - val index = functionProto.getExtension(KonanLinkData.functionIndex) + val index = functionProto.functionIndex val descriptor = localDeserializer.deserializeFunction(functionProto) descriptorIndex.put(index, descriptor) return descriptor @@ -105,7 +153,7 @@ internal class IrDescriptorDeserializer(val context: Context, proto.hasProperty() -> { val propertyProto = proto.property - val index = propertyProto.getExtension(KonanLinkData.propertyIndex) + val index = propertyProto.propertyIndex val descriptor = localDeserializer.deserializeProperty(propertyProto) descriptorIndex.put(index, descriptor) return descriptor @@ -204,21 +252,19 @@ internal class IrDescriptorDeserializer(val context: Context, val dispatchReceiver = functionDescriptor.dispatchReceiverParameter if (dispatchReceiver != null) { - assert(proto.hasDispatchReceiverIndex()) + assert(proto.hasDispatchReceiverUniqId()) val dispatchReceiverIndex = proto.dispatchReceiverIndex descriptorIndex.put(dispatchReceiverIndex, dispatchReceiver) } - val extensionReceiver = functionDescriptor.extensionReceiverParameter if (extensionReceiver != null) { - assert(proto.hasExtensionReceiverIndex()) + assert(proto.hasExtensionReceiverUniqId()) val extensionReceiverIndex = proto.extensionReceiverIndex descriptorIndex.put(extensionReceiverIndex, extensionReceiver) } } - fun substituteFunction(proto: KonanIr.KotlinDescriptor, originalDescriptor: FunctionDescriptor): FunctionDescriptor { @@ -292,14 +338,14 @@ internal class IrDescriptorDeserializer(val context: Context, val dispatchReceiver = newPropertyDescriptor.dispatchReceiverParameter if (dispatchReceiver != null) { - assert(proto.hasDispatchReceiverIndex()) + assert(proto.hasDispatchReceiverUniqId()) val dispatchReceiverIndex = proto.dispatchReceiverIndex descriptorIndex.put(dispatchReceiverIndex, dispatchReceiver) } val extensionReceiver = newPropertyDescriptor.extensionReceiverParameter if (extensionReceiver != null) { - assert(proto.hasExtensionReceiverIndex()) + assert(proto.hasExtensionReceiverUniqId()) val extensionReceiverIndex = proto.extensionReceiverIndex descriptorIndex.put(extensionReceiverIndex, extensionReceiver) } @@ -362,8 +408,7 @@ internal class IrDescriptorDeserializer(val context: Context, val originalIndex = descriptorProto.originalIndex val match = functions.singleOrNull() { val proto = (it as DeserializedSimpleFunctionDescriptor).proto - println("${proto.getExtension(KonanLinkData.functionIndex)} =? ${originalIndex}") - proto.getExtension(KonanLinkData.functionIndex) == originalIndex + proto.functionIndex == originalIndex } as? DeserializedSimpleFunctionDescriptor if (match != null) return match @@ -388,7 +433,7 @@ internal class IrDescriptorDeserializer(val context: Context, val originalIndex = descriptorProto.originalIndex return constructors.single { val proto = (it as DeserializedClassConstructorDescriptor).proto - proto.getExtension(KonanLinkData.constructorIndex) == originalIndex + proto.constructorIndex == originalIndex } as DeserializedClassConstructorDescriptor } @@ -406,7 +451,7 @@ internal class IrDescriptorDeserializer(val context: Context, val originalIndex = proto.originalIndex return functions.single { val property = (it as PropertyAccessorDescriptor).correspondingProperty as DeserializedPropertyDescriptor - property.proto.getExtension(KonanLinkData.propertyIndex) == originalIndex + property.proto.propertyIndex == originalIndex } as PropertyAccessorDescriptor } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto index 24f13fd2b78..4e90f371551 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto @@ -23,16 +23,16 @@ message KotlinDescriptor { // TODO: Use the string table? optional string name = 1; required Kind kind = 2; - required int32 index = 3; - required int32 original_index = 4; + required UniqId uniq_id = 3; + required UniqId original_uniq_id = 4; // index in fq name table required int32 class_or_package = 5; // Descriptor kind specific fields. optional KotlinType type = 6; repeated KotlinDescriptor value_parameter = 7; repeated KotlinDescriptor type_parameter = 8; - optional int32 dispatch_receiver_index = 9; - optional int32 extension_receiver_index = 10; + optional UniqId dispatch_receiver_uniq_id = 9; + optional UniqId extension_receiver_uniq_id = 10; optional KotlinType extension_receiver_type = 11; optional LocalDeclaration ir_local_declaration = 12; } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto index 32bc5f1e5ae..e246d08daaf 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto @@ -15,31 +15,35 @@ option optimize_for = LITE_RUNTIME; // Konan extensions to the "descriptors" protobuf. +message UniqId { + required int64 index = 1; +} + extend Package { optional int32 package_fq_name = 171; } extend Class { repeated Annotation class_annotation = 170; - optional int32 class_index = 171; + optional UniqId class_index = 171; } extend Constructor { repeated Annotation constructor_annotation = 170; - optional int32 constructor_index = 171; + optional UniqId constructor_index = 171; optional int32 constructor_parent = 172; } extend Function { repeated Annotation function_annotation = 170; - optional int32 function_index = 171; + optional UniqId function_index = 171; optional int32 function_parent = 172; optional InlineIrBody inline_ir_body = 174; } extend Property { repeated Annotation property_annotation = 170; - optional int32 property_index = 171; + optional UniqId property_index = 171; optional int32 property_parent = 172; optional bool used_as_variable = 173; optional Annotation.Argument.Value compile_time_value = 174; @@ -47,24 +51,21 @@ extend Property { extend EnumEntry { repeated Annotation enum_entry_annotation = 170; - optional int32 enum_entry_index = 171; + optional UniqId enum_entry_index = 171; } extend ValueParameter { repeated Annotation parameter_annotation = 170; - optional int32 value_parameter_index = 171; } extend Type { repeated Annotation type_annotation = 170; - optional int32 type_index = 171; + optional UniqId type_index = 171; optional string type_text = 172; // TODO: remove me } extend TypeParameter { repeated Annotation type_parameter_annotation = 170; - //optional int32 type_parameter_index = 171; - //optional int32 type_parameter_parent = 172; } message InlineIrBody { 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 c03ea70f6e9..c0e15543a3a 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 @@ -62,10 +62,6 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer } override fun serializeValueParameter(descriptor: ValueParameterDescriptor, proto: ProtoBuf.ValueParameter.Builder) { - - val index = inlineDescriptorTable.indexByValue(descriptor) - proto.setExtension(KonanLinkData.valueParameterIndex, index) - super.serializeValueParameter(descriptor, proto) } @@ -87,7 +83,7 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { - proto.setExtension(KonanLinkData.constructorIndex, + proto.setConstructorIndex( inlineDescriptorTable.indexByValue(descriptor)) val parentIndex = descriptor.parentFqNameIndex() proto.setExtension(KonanLinkData.constructorParent, parentIndex) @@ -97,13 +93,14 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) { - proto.setExtension(KonanLinkData.classIndex, inlineDescriptorTable.indexByValue(descriptor)) + proto.setClassIndex( + inlineDescriptorTable.indexByValue(descriptor)) super.serializeClass(descriptor, proto) } override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { - proto.setExtension(KonanLinkData.functionIndex, + proto.setFunctionIndex( inlineDescriptorTable.indexByValue(descriptor)) val parentIndex = descriptor.parentFqNameIndex() proto.setExtension(KonanLinkData.functionParent, parentIndex) @@ -137,10 +134,12 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer val variable = originalVariables[descriptor] if (variable != null) { proto.setExtension(KonanLinkData.usedAsVariable, true) - proto.setExtension(KonanLinkData.propertyIndex, inlineDescriptorTable.indexByValue(variable)) + proto.setPropertyIndex( + inlineDescriptorTable.indexByValue(variable)) } else { - proto.setExtension(KonanLinkData.propertyIndex, inlineDescriptorTable.indexByValue(descriptor)) + proto.setPropertyIndex( + inlineDescriptorTable.indexByValue(descriptor)) } super.serializeProperty(descriptor, proto)