[klib] Introduce the "ir_signature_versions" in klib manifests
^KT-60576 Fixed
This commit is contained in:
committed by
Space Team
parent
d16445aef2
commit
c624bba8cd
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.library
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes how signatures of IR declarations are serialized in a KLIB.
|
||||||
|
*/
|
||||||
|
data class KotlinIrSignatureVersion(val number: Int) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signatures are represented by the [org.jetbrains.kotlin.ir.util.IdSignature] class. Signatures of public declarations
|
||||||
|
* ([org.jetbrains.kotlin.ir.util.IdSignature.CommonSignature]) have no description.
|
||||||
|
* Only their numeric identifier participates in linkage.
|
||||||
|
*/
|
||||||
|
val V1 = KotlinIrSignatureVersion(1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like [V1], but signatures of public declarations have a description along with a numeric identifier that can be used for showing
|
||||||
|
* more readable ABI dumps and linker errors.
|
||||||
|
* Linkage is still performed using only the numeric identifier, thus making [V2] fully compatible with [V1].
|
||||||
|
*/
|
||||||
|
val V2 = KotlinIrSignatureVersion(2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The signature versions that this compiler emits.
|
||||||
|
*/
|
||||||
|
val CURRENTLY_SUPPORTED_VERSIONS = setOf(V1, V2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun String.parseIrSignatureVersions(): Set<KotlinIrSignatureVersion> =
|
||||||
|
split(",")
|
||||||
|
.mapTo(hashSetOf()) { KotlinIrSignatureVersion(it.toInt()) }
|
||||||
|
|
||||||
|
internal fun Set<KotlinIrSignatureVersion>.toManifestValue(): String =
|
||||||
|
sortedBy { it.number }
|
||||||
|
.joinToString(separator = ",") { it.number.toString() }
|
||||||
|
|
||||||
@@ -10,6 +10,11 @@ import org.jetbrains.kotlin.konan.properties.propertyList
|
|||||||
const val KLIB_PROPERTY_ABI_VERSION = "abi_version"
|
const val KLIB_PROPERTY_ABI_VERSION = "abi_version"
|
||||||
const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version"
|
const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A set of values of [org.jetbrains.kotlin.library.KotlinIrSignatureVersion].
|
||||||
|
*/
|
||||||
|
const val KLIB_PROPERTY_IR_SIGNATURE_VERSIONS = "ir_signature_versions"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [org.jetbrains.kotlin.library.metadata.KlibMetadataVersion]
|
* [org.jetbrains.kotlin.library.metadata.KlibMetadataVersion]
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -7,13 +7,21 @@ data class KotlinLibraryVersioning(
|
|||||||
val compilerVersion: String?,
|
val compilerVersion: String?,
|
||||||
val abiVersion: KotlinAbiVersion?,
|
val abiVersion: KotlinAbiVersion?,
|
||||||
val metadataVersion: String?,
|
val metadataVersion: String?,
|
||||||
)
|
val irSignatureVersions: Set<KotlinIrSignatureVersion> = KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS,
|
||||||
|
) {
|
||||||
|
init {
|
||||||
|
require(irSignatureVersions.isNotEmpty()) {
|
||||||
|
"Signature versions must not be empty!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun Properties.writeKonanLibraryVersioning(versions: KotlinLibraryVersioning) {
|
fun Properties.writeKonanLibraryVersioning(versions: KotlinLibraryVersioning) {
|
||||||
versions.abiVersion?.let { this.setProperty(KLIB_PROPERTY_ABI_VERSION, it.toString()) }
|
versions.abiVersion?.let { this.setProperty(KLIB_PROPERTY_ABI_VERSION, it.toString()) }
|
||||||
versions.libraryVersion?.let { this.setProperty(KLIB_PROPERTY_LIBRARY_VERSION, it) }
|
versions.libraryVersion?.let { this.setProperty(KLIB_PROPERTY_LIBRARY_VERSION, it) }
|
||||||
versions.compilerVersion?.let { this.setProperty(KLIB_PROPERTY_COMPILER_VERSION, it) }
|
versions.compilerVersion?.let { this.setProperty(KLIB_PROPERTY_COMPILER_VERSION, it) }
|
||||||
versions.metadataVersion?.let { this.setProperty(KLIB_PROPERTY_METADATA_VERSION, it) }
|
versions.metadataVersion?.let { this.setProperty(KLIB_PROPERTY_METADATA_VERSION, it) }
|
||||||
|
this.setProperty(KLIB_PROPERTY_IR_SIGNATURE_VERSIONS, versions.irSignatureVersions.toManifestValue())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Properties.readKonanLibraryVersioning(): KotlinLibraryVersioning {
|
fun Properties.readKonanLibraryVersioning(): KotlinLibraryVersioning {
|
||||||
@@ -22,10 +30,16 @@ fun Properties.readKonanLibraryVersioning(): KotlinLibraryVersioning {
|
|||||||
val compilerVersion = this.getProperty(KLIB_PROPERTY_COMPILER_VERSION)
|
val compilerVersion = this.getProperty(KLIB_PROPERTY_COMPILER_VERSION)
|
||||||
val metadataVersion = this.getProperty(KLIB_PROPERTY_METADATA_VERSION)
|
val metadataVersion = this.getProperty(KLIB_PROPERTY_METADATA_VERSION)
|
||||||
|
|
||||||
|
// If there is no such property in the manifest, it means that the manifest was generated by an older version of the compiler,
|
||||||
|
// meaning that it only contains v1 signatures.
|
||||||
|
val irSignatureVersions = this.getProperty(KLIB_PROPERTY_IR_SIGNATURE_VERSIONS)?.parseIrSignatureVersions()
|
||||||
|
?: setOf(KotlinIrSignatureVersion.V1)
|
||||||
|
|
||||||
return KotlinLibraryVersioning(
|
return KotlinLibraryVersioning(
|
||||||
abiVersion = abiVersion,
|
abiVersion = abiVersion,
|
||||||
libraryVersion = libraryVersion,
|
libraryVersion = libraryVersion,
|
||||||
compilerVersion = compilerVersion,
|
compilerVersion = compilerVersion,
|
||||||
metadataVersion = metadataVersion,
|
metadataVersion = metadataVersion,
|
||||||
|
irSignatureVersions = irSignatureVersions,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user