From d90aa6c805fc172017c0b540f686440c89e775d9 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Thu, 15 Dec 2022 15:57:24 +0100 Subject: [PATCH] [JS IR IC] Use fingerprints from the cache Optimization: do not read file names and recalculate fingerprints from klib. Read them from the cache if klib is not modified. --- .../ir/backend/js/ic/IncrementalCache.kt | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt index d034e268dad..42e454876c7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.serialization.IdSignatureDeserializer import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.CodedOutputStream -import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import java.io.File internal class IncrementalCache(private val library: KotlinLibraryHeader, val cacheDir: File) { @@ -33,7 +32,7 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca private val cacheHeaderFromDisk by lazy { cacheHeaderFile.useCodedInputIfExists { - CacheHeader.fromProtoStream(this, library.libraryFingerprint) + CacheHeader.fromProtoStream(this) } } @@ -41,8 +40,8 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca private class CacheHeader( val libraryFile: KotlinLibraryFile, - private val libraryFingerprint: ICHash?, - val sourceFileFingerprints: Map? + val libraryFingerprint: ICHash?, + val sourceFileFingerprints: Map ) { constructor(library: KotlinLibraryHeader) : this(library.libraryFile, library.libraryFingerprint, library.sourceFileFingerprints) @@ -51,25 +50,21 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca libraryFingerprint?.toProtoStream(out) ?: notFoundIcError("library fingerprint", libraryFile) - sourceFileFingerprints?.let { fingerprints -> - out.writeInt32NoTag(fingerprints.size) - for ((srcFile, fingerprint) in fingerprints) { - srcFile.toProtoStream(out) - fingerprint.toProtoStream(out) - } - } ?: notFoundIcError("source file fingerprints", libraryFile) + out.writeInt32NoTag(sourceFileFingerprints.size) + for ((srcFile, fingerprint) in sourceFileFingerprints) { + srcFile.toProtoStream(out) + fingerprint.toProtoStream(out) + } } companion object { - fun fromProtoStream(input: CodedInputStream, newLibraryFingerprint: ICHash?): CacheHeader { + fun fromProtoStream(input: CodedInputStream): CacheHeader { val libraryFile = KotlinLibraryFile.fromProtoStream(input) val oldLibraryFingerprint = ICHash.fromProtoStream(input) - val sourceFileFingerprints = (oldLibraryFingerprint != newLibraryFingerprint).ifTrue { - buildMapUntil(input.readInt32()) { - val file = KotlinSourceFile.fromProtoStream(input) - put(file, ICHash.fromProtoStream(input)) - } + val sourceFileFingerprints = buildMapUntil(input.readInt32()) { + val file = KotlinSourceFile.fromProtoStream(input) + put(file, ICHash.fromProtoStream(input)) } return CacheHeader(libraryFile, oldLibraryFingerprint, sourceFileFingerprints) } @@ -84,8 +79,12 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca private fun KotlinSourceFile.getCacheFile(suffix: String) = File(cacheDir, "${File(path).name}.${path.stringHashForIC()}.$suffix") fun buildIncrementalCacheArtifact(signatureToIndexMapping: Map>): IncrementalCacheArtifact { - if (cacheHeaderShouldBeUpdated) { - cacheHeaderFile.useCodedOutput { CacheHeader(library).toProtoStream(this) } + val klibSrcFiles = if (cacheHeaderShouldBeUpdated) { + val newCacheHeader = CacheHeader(library) + cacheHeaderFile.useCodedOutput { newCacheHeader.toProtoStream(this) } + newCacheHeader.sourceFileFingerprints.keys + } else { + cacheHeaderFromDisk?.sourceFileFingerprints?.keys ?: notFoundIcError("source file fingerprints", library.libraryFile) } for (removedFile in removedSrcFiles) { @@ -93,21 +92,24 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca removedFile.getCacheFile(METADATA_SUFFIX).delete() } - val fileArtifacts = library.sourceFileFingerprints.keys.map { srcFile -> + val fileArtifacts = klibSrcFiles.map { srcFile -> commitSourceFileMetadata(srcFile.getCacheFile(BINARY_AST_SUFFIX), srcFile, signatureToIndexMapping[srcFile] ?: emptyMap()) } return IncrementalCacheArtifact(cacheDir, removedSrcFiles.isNotEmpty(), fileArtifacts, library.jsOutputName) } data class ModifiedFiles( - val addedFiles: List = emptyList(), + val addedFiles: Collection = emptyList(), val removedFiles: Map = emptyMap(), val modifiedFiles: Map = emptyMap(), - val nonModifiedFiles: List = emptyList() + val nonModifiedFiles: Collection = emptyList() ) fun collectModifiedFiles(): ModifiedFiles { - val cachedFingerprints = cacheHeaderFromDisk?.let { it.sourceFileFingerprints ?: return ModifiedFiles() } ?: emptyMap() + val cachedFingerprints = cacheHeaderFromDisk?.sourceFileFingerprints ?: emptyMap() + if (cacheHeaderFromDisk?.libraryFingerprint == library.libraryFingerprint) { + return ModifiedFiles(emptyList(), emptyMap(), emptyMap(), cachedFingerprints.keys) + } val addedFiles = mutableListOf() val modifiedFiles = hashMapOf()