From b94a4f48e3e45e8b05cd34a54f914e28a90bd186 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Fri, 6 Mar 2020 18:30:28 +0300 Subject: [PATCH] [KLIB] Fix K/N binary interface - make it use return type for binary symbol name (cherry picked from commit 4d93421688739732d75ce93f01fc3637f398752b) --- .../kotlin/backend/konan/llvm/BinaryInterface.kt | 5 +++-- .../backend/konan/serialization/KonanMangler.kt | 16 ++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) 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 a1aad3cc151..f5664302eb5 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 @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract import org.jetbrains.kotlin.backend.konan.ir.allParameters import org.jetbrains.kotlin.backend.konan.ir.isUnit import org.jetbrains.kotlin.backend.konan.isExternalObjCClass -import org.jetbrains.kotlin.backend.konan.serialization.KonanManglerIr +import org.jetbrains.kotlin.backend.konan.serialization.AbstractKonanIrMangler import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.findAnnotation import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization @@ -30,7 +30,8 @@ import org.jetbrains.kotlin.library.uniqueName // TODO: do not serialize descriptors of non-exported declarations. object KonanBinaryInterface { - private val mangler = KonanManglerIr + private val mangler = object : AbstractKonanIrMangler(true) {} + private val exportChecker = mangler.getExportChecker() val IrFunction.functionName: String get() = mangler.run { signatureString } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt index adb3f0045bb..bb1c78033e2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt @@ -13,10 +13,11 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.util.hasAnnotation -abstract class AbstractKonanIrMangler : IrBasedKotlinManglerImpl() { +abstract class AbstractKonanIrMangler(private val withReturnType: Boolean) : IrBasedKotlinManglerImpl() { override fun getExportChecker(): IrExportCheckerVisitor = KonanIrExportChecker() - override fun getMangleComputer(mode: MangleMode): IrMangleComputer = KonanIrManglerComputer(StringBuilder(256), mode) + override fun getMangleComputer(mode: MangleMode): IrMangleComputer = + KonanIrManglerComputer(StringBuilder(256), mode, withReturnType) private class KonanIrExportChecker : IrExportCheckerVisitor() { override fun IrDeclaration.isPlatformSpecificExported(): Boolean { @@ -41,11 +42,12 @@ abstract class AbstractKonanIrMangler : IrBasedKotlinManglerImpl() { return false } - } - private class KonanIrManglerComputer(builder: StringBuilder, mode: MangleMode) : IrMangleComputer(builder, mode) { - override fun copy(newMode: MangleMode): IrMangleComputer = KonanIrManglerComputer(builder, newMode) + private class KonanIrManglerComputer(builder: StringBuilder, mode: MangleMode, private val withReturnType: Boolean) : IrMangleComputer(builder, mode) { + override fun copy(newMode: MangleMode): IrMangleComputer = KonanIrManglerComputer(builder, newMode, withReturnType) + + override fun addReturnType(): Boolean = withReturnType override fun IrFunction.platformSpecificFunctionName(): String? { (if (this is IrConstructor && this.isObjCConstructor) this.getObjCInitMethod() else this)?.getObjCMethodInfo() @@ -76,12 +78,10 @@ abstract class AbstractKonanIrMangler : IrBasedKotlinManglerImpl() { return if (this.hasObjCMethodAnnotation || this.hasObjCFactoryAnnotation || this.isObjCClassMethod()) "${param.name}:" else "" } - - } } -object KonanManglerIr : AbstractKonanIrMangler() +object KonanManglerIr : AbstractKonanIrMangler(false) abstract class AbstractKonanDescriptorMangler : DescriptorBasedKotlinManglerImpl() { override fun getExportChecker(): DescriptorExportCheckerVisitor = KonanDescriptorExportChecker()