[Commonizer] Don't commonize built-ins

This commit is contained in:
Dmitriy Dolovov
2021-01-29 15:51:57 +03:00
parent 585cd64b9a
commit 3b91d1c5e5
13 changed files with 86 additions and 196 deletions
@@ -5,29 +5,15 @@
package org.jetbrains.kotlin.descriptors.commonizer
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import java.io.File
class TargetProvider(
val target: LeafTarget,
val builtInsClass: Class<out KotlinBuiltIns>,
val builtInsProvider: BuiltInsProvider,
val modulesProvider: ModulesProvider,
val dependeeModulesProvider: ModulesProvider?
)
interface BuiltInsProvider {
fun loadBuiltIns(): KotlinBuiltIns
companion object {
val defaultBuiltInsProvider = object : BuiltInsProvider {
override fun loadBuiltIns() = DefaultBuiltIns.Instance
}
}
}
interface ModulesProvider {
class ModuleInfo(
val name: String,
@@ -5,11 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
interface CirRoot : CirDeclaration {
val target: CommonizerTarget
val builtInsClass: String
val builtInsProvider: BuiltInsProvider
}
@@ -5,27 +5,10 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir.factory
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirRootImpl
object CirRootFactory {
fun create(
target: CommonizerTarget,
builtInsClass: String,
builtInsProvider: BuiltInsProvider
): CirRoot {
if (target is LeafTarget) {
check((target.konanTarget != null) == (builtInsClass == KonanBuiltIns::class.java.name))
}
return CirRootImpl(
target = target,
builtInsClass = builtInsClass,
builtInsProvider = builtInsProvider
)
}
fun create(target: CommonizerTarget): CirRoot = CirRootImpl(target = target)
}
@@ -5,12 +5,9 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir.impl
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
data class CirRootImpl(
override val target: CommonizerTarget,
override val builtInsClass: String,
override val builtInsProvider: BuiltInsProvider
override val target: CommonizerTarget
) : CirRoot
@@ -5,9 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
@@ -15,31 +12,17 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirRootFactory
class RootCommonizer : AbstractStandardCommonizer<CirRoot, CirRoot>() {
private val leafTargets = mutableSetOf<LeafTarget>()
private var konanBuiltInsProvider: BuiltInsProvider? = null
override fun commonizationResult() = CirRootFactory.create(
target = SharedTarget(leafTargets),
builtInsClass = if (konanBuiltInsProvider != null) KonanBuiltIns::class.java.name else DefaultBuiltIns::class.java.name,
builtInsProvider = konanBuiltInsProvider ?: BuiltInsProvider.defaultBuiltInsProvider
target = SharedTarget(leafTargets)
)
override fun initialize(first: CirRoot) {
leafTargets += first.target as LeafTarget
konanBuiltInsProvider = first.konanBuiltInsProvider
}
override fun doCommonizeWith(next: CirRoot): Boolean {
leafTargets += next.target as LeafTarget
// keep the first met KonanBuiltIns when all targets are Kotlin/Native
// otherwise use DefaultBuiltIns
if (konanBuiltInsProvider != null && next.konanBuiltInsProvider == null) {
konanBuiltInsProvider = null
}
return true
}
private inline val CirRoot.konanBuiltInsProvider
get() = if (builtInsClass == KonanBuiltIns::class.java.name) builtInsProvider else null
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.konan
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
import org.jetbrains.kotlin.backend.common.serialization.metadata.metadataVersion
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.*
import org.jetbrains.kotlin.descriptors.commonizer.konan.NativeDistributionCommonizer.StatsType.*
import org.jetbrains.kotlin.descriptors.commonizer.stats.*
@@ -138,8 +137,7 @@ class NativeDistributionCommonizer(
val parameters = CommonizerParameters(statsCollector, ::logProgress).apply {
val storageManager = LockBasedStorageManager("Commonized modules")
val stdlibProvider = NativeDistributionStdlibProvider(storageManager, allLibraries.stdlib)
dependeeModulesProvider = stdlibProvider
dependeeModulesProvider = NativeDistributionStdlibProvider(storageManager, allLibraries.stdlib)
allLibraries.librariesByTargets.forEach { (target, librariesToCommonize) ->
if (librariesToCommonize.libraries.isEmpty()) return@forEach
@@ -149,8 +147,6 @@ class NativeDistributionCommonizer(
addTarget(
TargetProvider(
target = target,
builtInsClass = KonanBuiltIns::class.java,
builtInsProvider = stdlibProvider,
modulesProvider = modulesProvider,
dependeeModulesProvider = null // stdlib is already set as common dependency
)
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.konan
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.descriptors.commonizer.utils.NativeFactories
@@ -19,14 +17,13 @@ import java.io.File
internal class NativeDistributionStdlibProvider(
private val storageManager: StorageManager,
private val stdlib: NativeLibrary
) : BuiltInsProvider, ModulesProvider {
) : ModulesProvider {
private val moduleInfo = ModuleInfo(
name = KONAN_STDLIB_NAME,
originalLocation = File(stdlib.library.libraryFile.absolutePath),
cInteropAttributes = null
)
override fun loadBuiltIns(): KotlinBuiltIns = loadStdlibModule().builtIns
override fun loadModuleInfos(): Map<String, ModuleInfo> = mapOf(KONAN_STDLIB_NAME to moduleInfo)
override fun loadModules(dependencies: Collection<ModuleDescriptor>): Map<String, ModuleDescriptor> {
@@ -102,11 +102,7 @@ class CirTreeMerger(
commonModuleInfos: Map<String, ModuleInfo>,
dependeeModules: Collection<ModuleDescriptor>
) {
rootNode.targetDeclarations[targetIndex] = CirRootFactory.create(
targetProvider.target,
targetProvider.builtInsClass.name,
targetProvider.builtInsProvider
)
rootNode.targetDeclarations[targetIndex] = CirRootFactory.create(targetProvider.target)
val targetDependeeModules = targetProvider.dependeeModulesProvider?.loadModules(dependeeModules)?.values.orEmpty()
val allDependeeModules = targetDependeeModules + dependeeModules
@@ -212,8 +212,6 @@ private class AnalyzedModules(
parameters.addTarget(
TargetProvider(
target = leafTarget,
builtInsClass = originalModule.builtIns::class.java,
builtInsProvider = MockBuiltInsProvider(originalModule.builtIns),
modulesProvider = MockModulesProvider.create(originalModule),
dependeeModulesProvider = dependeeModules[leafTarget]?.let(MockModulesProvider::create)
)
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.utils.MockModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.utils.assertCommonizationPerformed
import org.junit.Test
@@ -65,8 +64,6 @@ class CommonizerFacadeTest {
it.addTarget(
TargetProvider(
target = LeafTarget(targetName),
builtInsClass = DefaultBuiltIns::class.java,
builtInsProvider = BuiltInsProvider.defaultBuiltInsProvider,
modulesProvider = MockModulesProvider.create(moduleNames),
dependeeModulesProvider = null
)
@@ -12,6 +12,8 @@ import kotlin.test.fail
abstract class AbstractCommonizerTest<T, R> {
class ObjectsNotEqual(message: String) : Throwable(message)
@Test(expected = IllegalCommonizerStateException::class)
fun failOnNoVariantsSubmitted() {
createCommonizer().result
@@ -32,7 +34,7 @@ abstract class AbstractCommonizerTest<T, R> {
}
val actual = commonized.result
if (!isEqual(expected, actual)) fail("Expected: $expected\nActual: $actual")
if (!isEqual(expected, actual)) throw ObjectsNotEqual("Expected: $expected\nActual: $actual")
}
protected fun doTestFailure(
@@ -5,169 +5,133 @@
package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirRootFactory
import org.jetbrains.kotlin.descriptors.commonizer.utils.MockBuiltInsProvider
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.junit.Test
class RootCommonizerTest : AbstractCommonizerTest<CirRoot, CirRoot>() {
@Test
fun allAreNative() = doTestSuccess(
expected = KONAN_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
expected = SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm32", KonanTarget.IOS_ARM32))
).toMock(),
LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock(),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32).toMock()
)
@Test
fun jvmAndNative1() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("jvm2")
)
expected = SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("jvm2")
)
),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)),
JVM_BUILT_INS.toMock(LeafTarget("jvm2"))
).toMock(),
LeafTarget("jvm1").toMock(),
LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
LeafTarget("jvm2").toMock()
)
@Test
fun jvmAndNative2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("jvm"),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)
)
expected = SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("jvm"),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)
)
),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)),
JVM_BUILT_INS.toMock(LeafTarget("jvm")),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64))
).toMock(),
LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
LeafTarget("jvm").toMock(),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock()
)
@Test
fun noNative1() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("default1"),
LeafTarget("default2"),
LeafTarget("default3")
)
expected = SharedTarget(
setOf(
LeafTarget("default1"),
LeafTarget("default2"),
LeafTarget("default3")
)
),
DEFAULT_BUILT_INS.toMock(LeafTarget("default1")),
DEFAULT_BUILT_INS.toMock(LeafTarget("default2")),
DEFAULT_BUILT_INS.toMock(LeafTarget("default3"))
).toMock(),
LeafTarget("default1").toMock(),
LeafTarget("default2").toMock(),
LeafTarget("default3").toMock()
)
@Test
fun noNative2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("default"),
LeafTarget("jvm2")
)
expected = SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("default"),
LeafTarget("jvm2")
)
),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")),
DEFAULT_BUILT_INS.toMock(LeafTarget("default")),
JVM_BUILT_INS.toMock(LeafTarget("jvm2"))
).toMock(),
LeafTarget("jvm1").toMock(),
LeafTarget("default").toMock(),
LeafTarget("jvm2").toMock()
)
@Test
fun noNative3() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("jvm2"),
LeafTarget("jvm3")
)
expected = SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("jvm2"),
LeafTarget("jvm3")
)
),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")),
JVM_BUILT_INS.toMock(LeafTarget("jvm2")),
JVM_BUILT_INS.toMock(LeafTarget("jvm3"))
).toMock(),
LeafTarget("jvm1").toMock(),
LeafTarget("jvm2").toMock(),
LeafTarget("jvm3").toMock()
)
@Test(expected = IllegalStateException::class)
@Test(expected = ObjectsNotEqual::class)
fun misconfiguration1() = doTestSuccess(
expected = KONAN_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
expected = SharedTarget(
setOf(
LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64")),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm32", KonanTarget.IOS_ARM32))
).toMock(),
LeafTarget("ios_x64").toMock(), // KonanTarget is missing here!
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock(),
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32).toMock()
)
@Test(expected = IllegalStateException::class)
@Test(expected = ObjectsNotEqual::class)
fun misconfiguration2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock(
SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("jvm2"),
LeafTarget("jvm3")
)
expected = SharedTarget(
setOf(
LeafTarget("jvm1"),
LeafTarget("jvm2"),
LeafTarget("jvm3")
)
),
JVM_BUILT_INS.toMock(LeafTarget("jvm1", KonanTarget.IOS_X64)),
JVM_BUILT_INS.toMock(LeafTarget("jvm2")),
JVM_BUILT_INS.toMock(LeafTarget("jvm3"))
).toMock(),
LeafTarget("jvm1", KonanTarget.IOS_X64).toMock(), // mistakenly specified KonanTarget!
LeafTarget("jvm2").toMock(),
LeafTarget("jvm3").toMock()
)
override fun createCommonizer() = RootCommonizer()
override fun isEqual(a: CirRoot?, b: CirRoot?) =
(a === b)
|| (a != null && b != null
&& a.target == b.target
&& a.builtInsClass == b.builtInsClass
&& a.builtInsClass == a.builtInsProvider.loadBuiltIns()::class.java.name
&& a.builtInsProvider.loadBuiltIns()::class.java == b.builtInsProvider.loadBuiltIns()::class.java)
override fun isEqual(a: CirRoot?, b: CirRoot?) = (a === b) || (a != null && b != null && a.target == b.target)
private companion object {
inline val KONAN_BUILT_INS get() = KonanBuiltIns(LockBasedStorageManager.NO_LOCKS)
inline val JVM_BUILT_INS get() = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS, JvmBuiltIns.Kind.FROM_CLASS_LOADER)
inline val DEFAULT_BUILT_INS get() = DefaultBuiltIns.Instance
fun KotlinBuiltIns.toMock(target: CommonizerTarget) = CirRootFactory.create(
target = target,
builtInsClass = this::class.java.name,
builtInsProvider = MockBuiltInsProvider(this)
)
fun CommonizerTarget.toMock() = CirRootFactory.create(target = this)
}
}
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.utils
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassFactory
@@ -150,10 +148,6 @@ internal val MOCK_CLASSIFIERS = CirKnownClassifiers(
dependeeLibraries = emptyMap()
)
internal class MockBuiltInsProvider(private val builtIns: KotlinBuiltIns) : BuiltInsProvider {
override fun loadBuiltIns() = builtIns
}
internal class MockModulesProvider private constructor(
private val modules: Map<String, ModuleDescriptor>,
) : ModulesProvider {