diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt index 301d0bdb4fa..a6b63ee6083 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt @@ -50,7 +50,7 @@ class CacheBuilder( private val allLibraries by lazy { konanConfig.resolvedLibraries.getFullList(TopologicalLibraryOrder) } private val uniqueNameToLibrary by lazy { allLibraries.associateBy { it.uniqueName } } - private val uniqueNameToHash = mutableMapOf() + private val uniqueNameToHash = mutableMapOf() private val caches = mutableMapOf() private val cacheRootDirectories = mutableMapOf() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt index 9ca067603b5..68fb24bf06a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.backend.konan +import org.jetbrains.kotlin.backend.common.serialization.FingerprintHash +import org.jetbrains.kotlin.backend.common.serialization.Hash128Bits +import org.jetbrains.kotlin.backend.common.serialization.SerializedKlibFingerprint import org.jetbrains.kotlin.backend.konan.serialization.* import org.jetbrains.kotlin.backend.konan.serialization.ClassFieldsSerializer import org.jetbrains.kotlin.backend.konan.serialization.InlineFunctionBodyReferenceSerializer @@ -12,16 +15,21 @@ import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.library.KotlinLibrary +import org.jetbrains.kotlin.library.impl.javaFile import org.jetbrains.kotlin.library.uniqueName -import java.security.MessageDigest -private fun MessageDigest.digestFile(file: File) = - if (file.isDirectory) digestDirectory(file) else update(file.readBytes()) +private class LibraryHashComputer { + private val hashes = mutableListOf() -private fun MessageDigest.digestDirectory(directory: File): Unit = - directory.listFiles.sortedBy { it.name }.forEach { digestFile(it) } + fun update(hash: FingerprintHash) { + hashes.add(hash) + } -private fun MessageDigest.digestLibrary(library: KotlinLibrary) = digestFile(library.libraryFile) + fun digest() = FingerprintHash(hashes.fold(Hash128Bits(hashes.size.toULong())) { acc, x -> acc.combineWith(x.hash) }) +} + +private fun LibraryHashComputer.digestLibrary(library: KotlinLibrary) = + update(SerializedKlibFingerprint(library.libraryFile.javaFile()).klibFingerprint) private fun getArtifactName(target: KonanTarget, baseName: String, kind: CompilerOutputKind) = "${kind.prefix(target)}$baseName${kind.suffix(target)}" @@ -171,7 +179,7 @@ class CachedLibraries( } private val uniqueNameToLibrary = allLibraries.associateBy { it.uniqueName } - private val uniqueNameToHash = mutableMapOf() + private val uniqueNameToHash = mutableMapOf() private val allCaches: Map = allLibraries.mapNotNull { library -> val explicitPath = explicitCaches[library] @@ -221,32 +229,28 @@ class CachedLibraries( fun getCachedLibraryName(library: KotlinLibrary): String = getCachedLibraryName(library.uniqueName) fun getCachedLibraryName(libraryName: String): String = "$libraryName-cache" - private fun computeLibraryHash( - library: KotlinLibrary, - librariesHashes: MutableMap, - ): ByteArray = librariesHashes.getOrPut(library.uniqueName) { - val messageDigest = MessageDigest.getInstance("SHA-256") - messageDigest.digestLibrary(library) - messageDigest.digest() - } + private fun computeLibraryHash(library: KotlinLibrary, librariesHashes: MutableMap) = + librariesHashes.getOrPut(library.uniqueName) { + val hashComputer = LibraryHashComputer() + hashComputer.digestLibrary(library) + hashComputer.digest() + } fun computeVersionedCacheDirectory( baseCacheDirectory: File, library: KotlinLibrary, allLibraries: Map, - librariesHashes: MutableMap, + librariesHashes: MutableMap, ): File { val dependencies = library.getAllTransitiveDependencies(allLibraries) - val messageDigest = MessageDigest.getInstance("SHA-256") - messageDigest.update(compilerMarker) - messageDigest.update(computeLibraryHash(library, librariesHashes)) + val hashComputer = LibraryHashComputer() + hashComputer.update(computeLibraryHash(library, librariesHashes)) dependencies.sortedBy { it.uniqueName }.forEach { - messageDigest.update(computeLibraryHash(it, librariesHashes)) + hashComputer.update(computeLibraryHash(it, librariesHashes)) } val version = library.versions.libraryVersion ?: "unspecified" - val hashString = messageDigest.digest() - .joinToString("") { it.toUByte().toString(radix = 16).padStart(2, '0') } + val hashString = hashComputer.digest().toString() return baseCacheDirectory.child(library.uniqueName).child(version).child(hashString) } @@ -258,8 +262,5 @@ class CachedLibraries( const val INLINE_FUNCTION_BODIES_FILE_NAME = "inline_bodies" const val CLASS_FIELDS_FILE_NAME = "class_fields" const val EAGER_INITIALIZED_PROPERTIES_FILE_NAME = "eager_init" - - // TODO: Remove after dropping Gradle cache orchestration. - private val compilerMarker = "K/N orchestration".encodeToByteArray() } }