From 9447cf8d9dc82e152170fd59b049d0cb809a8287 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 29 Mar 2017 15:10:37 +0300 Subject: [PATCH] Do not duplicate inherited bridge --- .../kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt | 6 ++++++ .../jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt | 4 +--- .../jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt index 393df0de6f0..2e53bd643bf 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassVtablesBuilder.kt @@ -26,6 +26,12 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor, get() = overriddenDescriptor.isOverridable || DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable } + val inheritsBridge: Boolean + get() { + return !descriptor.kind.isReal + && OverridingUtil.overrides(descriptor.target, overriddenDescriptor) + && descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded() + } override fun toString(): String { return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)" diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index de26d04b275..28e5e9f8693 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -170,9 +170,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { get() { val target = descriptor.target if (!needBridge) return target - val bridgeOwner = if (!descriptor.kind.isReal - && OverridingUtil.overrides(target, overriddenDescriptor) - && descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()) { + val bridgeOwner = if (inheritsBridge) { target // Bridge is inherited from superclass. } else { descriptor diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt index 2e4654eeef8..e0c8c16d35f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt @@ -81,6 +81,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { .map { OverriddenFunctionDescriptor(function, it) } .filter { !it.bridgeDirections.allNotNeeded() } .filter { it.canBeCalledVirtually } + .filter { !it.inheritsBridge } .distinctBy { it.bridgeDirections } .forEach { buildBridge(it, irClass)