From ff27066502bbc2fb27011fcf2c445d41b71c7010 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 5 Apr 2017 19:18:21 +0300 Subject: [PATCH] Use a hash of public name as descriptor deserialization id. --- .../backend/konan/llvm/BinaryInterface.kt | 25 +++++++++++++++ .../konan/serialization/DescriptorTable.kt | 31 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) 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 fc46a340766..2727ac0a3f4 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 @@ -163,6 +163,31 @@ internal val FunctionDescriptor.symbolName: String return "kfun:$containingDeclarationPart$functionName" } +internal val PropertyDescriptor.symbolName: String + get() { + val containingDeclarationPart = containingDeclaration.fqNameSafe.let { + if (it.isRoot) "" else "$it." + } + return "kprop:$containingDeclarationPart$name" + + } + +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 1c77ed3bf82..e53bb2138ac 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 @@ -24,6 +24,31 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName +import org.jetbrains.kotlin.backend.konan.llvm.isExported +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() + } + else -> error("Unexpected exported descriptor: $this") +} // TODO: we currently just assign each encountered @@ -48,7 +73,11 @@ class DescriptorTable(val builtIns: IrBuiltIns) { fun indexByValue(value: DeclarationDescriptor): Int { val index = table.getOrPut(value) { - currentIndex ++ + if (!value.isExported()) { + currentIndex++ + } else { + value.uniqId() + } } return index }