From b8e5185b612de8b00da587a28ccea1e88f4a8ec1 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Wed, 26 May 2021 20:01:08 +0300 Subject: [PATCH] [KLIB] Add extra debug information for Local signatures --- .../RemoteIncrementalResultsConsumer.kt | 3 +- .../serialization.common/src/KotlinIr.proto | 2 +- .../IncrementalCompilationSupport.kt | 12 +++ .../serialization/IrFileDeserializer.kt | 5 +- .../common/serialization/IrFileSerializer.kt | 21 ++++- .../serialization/IrSymbolDeserializer.kt | 6 +- .../proto/CompositeSignature.java | 2 +- .../serialization/proto/LocalSignature.java | 80 +++++++------------ .../proto/LocalSignatureOrBuilder.java | 16 +--- .../jetbrains/kotlin/ir/backend/js/klib.kt | 4 +- .../jetbrains/kotlin/library/KotlinLibrary.kt | 1 + .../kotlin/library/KotlinLibraryLayout.kt | 5 +- .../kotlin/library/KotlinLibraryWriter.kt | 3 +- .../kotlin/library/impl/IrWriterImpl.kt | 6 +- .../kotlin/library/impl/KotlinLibraryImpl.kt | 25 ++++++ .../library/impl/KotlinLibraryLayoutImpl.kt | 2 + .../js/IncrementalResultsConsumer.kt | 8 +- .../incremental/js/TranslationResultValue.kt | 3 +- 18 files changed, 120 insertions(+), 84 deletions(-) diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalResultsConsumer.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalResultsConsumer.kt index 8e71abae354..887f8edf916 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalResultsConsumer.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalResultsConsumer.kt @@ -25,7 +25,8 @@ class RemoteIncrementalResultsConsumer( strings: ByteArray, declarations: ByteArray, bodies: ByteArray, - fqn: ByteArray + fqn: ByteArray, + debugInfo: ByteArray? ) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/compiler/ir/serialization.common/src/KotlinIr.proto b/compiler/ir/serialization.common/src/KotlinIr.proto index 8ba46606fb2..654edadff19 100644 --- a/compiler/ir/serialization.common/src/KotlinIr.proto +++ b/compiler/ir/serialization.common/src/KotlinIr.proto @@ -52,7 +52,7 @@ message CompositeSignature { message LocalSignature { repeated int32 local_fq_name = 1 [packed=true]; optional int64 local_hash = 2; - optional int32 description = 3; // debug information + optional int32 debug_info = 3; } message FileSignature {} diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt index 1382dcc10d9..a6e6d6f4567 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt @@ -38,10 +38,17 @@ class ICKotlinLibrary(private val icData: List) : IrLibrary { return reader.tableItemBytes(index) } + private inline fun Array.itemNullableBytes(fileIndex: Int, index: Int, factory: () -> R): ByteArray? { + val reader = this[fileIndex] ?: factory().also { this[fileIndex] = it } + + return reader?.tableItemBytes(index) + } + private val indexedDeclarations = arrayOfNulls(icData.size) private val indexedTypes = arrayOfNulls(icData.size) private val indexedSignatures = arrayOfNulls(icData.size) private val indexedStrings = arrayOfNulls(icData.size) + private val indexedDebugInfos = arrayOfNulls(icData.size) private val indexedBodies = arrayOfNulls(icData.size) override fun irDeclaration(index: Int, fileIndex: Int): ByteArray = @@ -69,6 +76,11 @@ class ICKotlinLibrary(private val icData: List) : IrLibrary { IrArrayMemoryReader(icData[fileIndex].bodies) } + override fun debugInfo(index: Int, fileIndex: Int): ByteArray? = + indexedDebugInfos.itemNullableBytes(fileIndex, index) { + icData[fileIndex].debugInfo?.let { IrArrayMemoryReader(it) } + } + override fun file(index: Int): ByteArray = icData[index].fileData override fun fileCount(): Int = icData.size diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index ba96257bbb2..ab14555bf3d 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -146,17 +146,20 @@ abstract class IrLibraryFile { abstract fun signature(index: Int): ByteArray abstract fun string(index: Int): ByteArray abstract fun body(index: Int): ByteArray + abstract fun debugInfo(index: Int): ByteArray? } -class IrLibraryFileFromKlib(private val klib: IrLibrary, private val fileIndex: Int): IrLibraryFile() { +class IrLibraryFileFromKlib(private val klib: IrLibrary, private val fileIndex: Int) : IrLibraryFile() { override fun irDeclaration(index: Int): ByteArray = klib.irDeclaration(index, fileIndex) override fun type(index: Int): ByteArray = klib.type(index, fileIndex) override fun signature(index: Int): ByteArray = klib.signature(index, fileIndex) override fun string(index: Int): ByteArray = klib.string(index, fileIndex) override fun body(index: Int): ByteArray = klib.body(index, fileIndex) + override fun debugInfo(index: Int): ByteArray? = klib.debugInfo(index, fileIndex) } internal fun IrLibraryFile.deserializeString(index: Int): String = WobblyTF8.decode(string(index)) +internal fun IrLibraryFile.deserializeDebugInfo(index: Int): String? = debugInfo(index)?.let { WobblyTF8.decode(it) } internal fun IrLibraryFile.deserializeFqName(fqn: List): String = fqn.joinToString(".", transform = ::deserializeString) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt index 550a60b8969..8582453b47e 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt @@ -127,6 +127,7 @@ open class IrFileSerializer( private val skipMutableState: Boolean = false, private val allowNullTypes: Boolean = false, private val allowErrorStatementOrigins: Boolean = false, // TODO: support InlinerExpressionLocationHint + private val addDebugInfo: Boolean = true ) { private val loopIndex = mutableMapOf() private var currentLoopIndex = 0 @@ -150,6 +151,8 @@ open class IrFileSerializer( private val protoBodyArray = mutableListOf() + private val protoDebugInfoArray = arrayListOf() + sealed class XStatementOrExpression { abstract fun toByteArray(): ByteArray @@ -198,6 +201,11 @@ open class IrFileSerializer( protoStringArray.size - 1 } + private fun serializeDebugInfo(value: String): Int { + protoDebugInfoArray.add(value) + return protoDebugInfoArray.size - 1 + } + private fun serializeName(name: Name): Int = serializeString(name.toString()) /* ------- IdSignature ------------------------------------------------------ */ @@ -235,6 +243,9 @@ open class IrFileSerializer( proto.container = protoIdSignature(signature.container) proto.localId = signature.id + if (addDebugInfo) { + signature.description?.let { proto.debugInfo = serializeDebugInfo(it) } + } return proto.build() } @@ -259,7 +270,7 @@ open class IrFileSerializer( proto.addAllLocalFqName(serializeFqName(signature.localFqn)) signature.hashSig?.let { proto.localHash = it } if (addDebugInfo) { - signature.description?.let { proto.description = serializeDebugInfo(it) } + signature.description?.let { proto.debugInfo = serializeDebugInfo(it) } } return proto.build() @@ -1493,7 +1504,8 @@ open class IrFileSerializer( IrMemoryArrayWriter(protoIdSignatureArray.map { it.toByteArray() }).writeIntoMemory(), IrMemoryArrayWriter(protoStringArray.map { it.toByteArray() }).writeIntoMemory(), IrMemoryArrayWriter(protoBodyArray.map { it.toByteArray() }).writeIntoMemory(), - IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory() + IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory(), + debugInfo = null ) } @@ -1555,11 +1567,12 @@ open class IrFileSerializer( IrMemoryArrayWriter(protoIdSignatureArray.map { it.toByteArray() }).writeIntoMemory(), IrMemoryStringWriter(protoStringArray).writeIntoMemory(), IrMemoryArrayWriter(protoBodyArray.map { it.toByteArray() }).writeIntoMemory(), - IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory() + IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory(), + if (addDebugInfo) IrMemoryStringWriter(protoDebugInfoArray).writeIntoMemory() else null ) } - fun serializeExpectActualSubstitutionTable(proto: ProtoFile.Builder) { + private fun serializeExpectActualSubstitutionTable(proto: ProtoFile.Builder) { if (skipExpects) return expectActualTable.table.forEach next@{ (expect, actualSymbol) -> diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt index 16bb253b774..f389f97cf24 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrSymbolDeserializer.kt @@ -22,14 +22,14 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.backend.common.serialization.proto.AccessorIdSignature as ProtoAccessorIdSignature -import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature +import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature import org.jetbrains.kotlin.backend.common.serialization.proto.CompositeSignature as ProtoCompositeSignature import org.jetbrains.kotlin.backend.common.serialization.proto.FileLocalIdSignature as ProtoFileLocalIdSignature import org.jetbrains.kotlin.backend.common.serialization.proto.ScopeLocalIdSignature as ProtoScopeLocalIdSignature import org.jetbrains.kotlin.backend.common.serialization.proto.FileSignature as ProtoFileSignature import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature +import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature import org.jetbrains.kotlin.backend.common.serialization.proto.LoweredIdSignature as ProtoLoweredIdSignature -import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature class IrSymbolDeserializer( val symbolTable: ReferenceSymbolTable, @@ -192,7 +192,7 @@ class IrSymbolDeserializer( private fun deserializeLocalIdSignature(proto: ProtoLocalSignature): IdSignature.LocalSignature { val localFqn = fileReader.deserializeFqName(proto.localFqNameList) val localHash = if (proto.hasLocalHash()) proto.localHash else null - val description = if (proto.hasDescription()) fileReader.deserializeDebugInfo(proto.description) else null + val description = if (proto.hasDebugInfo()) fileReader.deserializeDebugInfo(proto.debugInfo) else null return IdSignature.LocalSignature(localFqn, localHash, description) } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/CompositeSignature.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/CompositeSignature.java index 4d7f38cb79f..9bd877063e6 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/CompositeSignature.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/CompositeSignature.java @@ -425,4 +425,4 @@ public final class CompositeSignature extends } // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.backend.common.serialization.proto.CompositeSignature) -} +} \ No newline at end of file diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignature.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignature.java index 1bf09ea38df..64fca01cf69 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignature.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignature.java @@ -81,7 +81,7 @@ public final class LocalSignature extends } case 24: { bitField0_ |= 0x00000002; - description_ = input.readInt32(); + debugInfo_ = input.readInt32(); break; } } @@ -159,33 +159,25 @@ public final class LocalSignature extends return localHash_; } - public static final int DESCRIPTION_FIELD_NUMBER = 3; - private int description_; + public static final int DEBUG_INFO_FIELD_NUMBER = 3; + private int debugInfo_; /** - * optional int32 description = 3; - * - *
-   * debug information
-   * 
+ * optional int32 debug_info = 3; */ - public boolean hasDescription() { + public boolean hasDebugInfo() { return ((bitField0_ & 0x00000002) == 0x00000002); } /** - * optional int32 description = 3; - * - *
-   * debug information
-   * 
+ * optional int32 debug_info = 3; */ - public int getDescription() { - return description_; + public int getDebugInfo() { + return debugInfo_; } private void initFields() { localFqName_ = java.util.Collections.emptyList(); localHash_ = 0L; - description_ = 0; + debugInfo_ = 0; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -211,7 +203,7 @@ public final class LocalSignature extends output.writeInt64(2, localHash_); } if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeInt32(3, description_); + output.writeInt32(3, debugInfo_); } output.writeRawBytes(unknownFields); } @@ -242,7 +234,7 @@ public final class LocalSignature extends } if (((bitField0_ & 0x00000002) == 0x00000002)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream - .computeInt32Size(3, description_); + .computeInt32Size(3, debugInfo_); } size += unknownFields.size(); memoizedSerializedSize = size; @@ -342,7 +334,7 @@ public final class LocalSignature extends bitField0_ = (bitField0_ & ~0x00000001); localHash_ = 0L; bitField0_ = (bitField0_ & ~0x00000002); - description_ = 0; + debugInfo_ = 0; bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -379,7 +371,7 @@ public final class LocalSignature extends if (((from_bitField0_ & 0x00000004) == 0x00000004)) { to_bitField0_ |= 0x00000002; } - result.description_ = description_; + result.debugInfo_ = debugInfo_; result.bitField0_ = to_bitField0_; return result; } @@ -399,8 +391,8 @@ public final class LocalSignature extends if (other.hasLocalHash()) { setLocalHash(other.getLocalHash()); } - if (other.hasDescription()) { - setDescription(other.getDescription()); + if (other.hasDebugInfo()) { + setDebugInfo(other.getDebugInfo()); } setUnknownFields( getUnknownFields().concat(other.unknownFields)); @@ -528,50 +520,34 @@ public final class LocalSignature extends return this; } - private int description_ ; + private int debugInfo_ ; /** - * optional int32 description = 3; - * - *
-     * debug information
-     * 
+ * optional int32 debug_info = 3; */ - public boolean hasDescription() { + public boolean hasDebugInfo() { return ((bitField0_ & 0x00000004) == 0x00000004); } /** - * optional int32 description = 3; - * - *
-     * debug information
-     * 
+ * optional int32 debug_info = 3; */ - public int getDescription() { - return description_; + public int getDebugInfo() { + return debugInfo_; } /** - * optional int32 description = 3; - * - *
-     * debug information
-     * 
+ * optional int32 debug_info = 3; */ - public Builder setDescription(int value) { + public Builder setDebugInfo(int value) { bitField0_ |= 0x00000004; - description_ = value; + debugInfo_ = value; return this; } /** - * optional int32 description = 3; - * - *
-     * debug information
-     * 
+ * optional int32 debug_info = 3; */ - public Builder clearDescription() { + public Builder clearDebugInfo() { bitField0_ = (bitField0_ & ~0x00000004); - description_ = 0; + debugInfo_ = 0; return this; } @@ -585,4 +561,4 @@ public final class LocalSignature extends } // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature) -} +} \ No newline at end of file diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignatureOrBuilder.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignatureOrBuilder.java index 296ce518de9..614e998e686 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignatureOrBuilder.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/LocalSignatureOrBuilder.java @@ -30,19 +30,11 @@ public interface LocalSignatureOrBuilder extends long getLocalHash(); /** - * optional int32 description = 3; - * - *
-   * debug information
-   * 
+ * optional int32 debug_info = 3; */ - boolean hasDescription(); + boolean hasDebugInfo(); /** - * optional int32 description = 3; - * - *
-   * debug information
-   * 
+ * optional int32 debug_info = 3; */ - int getDescription(); + int getDebugInfo(); } \ No newline at end of file diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 14b240de686..0ef3b3b3fee 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -130,7 +130,7 @@ fun generateKLib( val irData = compiledIrFiles[f] ?: error("No Ir Data found for file $f") val metaFile = compiledMetaFiles[f] ?: error("No Meta Data found for file $f") val irFile = with(irData) { - SerializedIrFile(fileData, String(fqn), f.path.replace('\\', '/'), types, signatures, strings, bodies, declarations) + SerializedIrFile(fileData, String(fqn), f.path.replace('\\', '/'), types, signatures, strings, bodies, declarations, debugInfo) } storage.add(KotlinFileSerializedData(metaFile.metadata, irFile)) } @@ -523,7 +523,7 @@ fun serializeModuleIntoKlib( incrementalResultsConsumer?.run { processPackagePart(ioFile, compiledFile.metadata, empty, empty) with(compiledFile.irData) { - processIrFile(ioFile, fileData, types, signatures, strings, declarations, bodies, fqName.toByteArray()) + processIrFile(ioFile, fileData, types, signatures, strings, declarations, bodies, fqName.toByteArray(), debugInfo) } } } diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt index a9a7468f52d..5955867db9c 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt @@ -64,6 +64,7 @@ interface IrLibrary { fun signature(index: Int, fileIndex: Int): ByteArray fun string(index: Int, fileIndex: Int): ByteArray fun body(index: Int, fileIndex: Int): ByteArray + fun debugInfo(index: Int, fileIndex: Int): ByteArray? fun file(index: Int): ByteArray fun fileCount(): Int } diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryLayout.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryLayout.kt index dbd09791e82..12653476d37 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryLayout.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryLayout.kt @@ -70,11 +70,14 @@ interface IrKotlinLibraryLayout : KotlinLibraryLayout { get() = File(irDir, "files.knf") val dataFlowGraphFile get() = File(irDir, "module_data_flow_graph") + val irDebugInfo + get() = File(irDir, "debugInfo.knd") - fun irDeclarations(file: File): File = File(file, "irCombined.knd") + fun irDeclarations(file: File): File = File(file, "irDeclarations.knd") fun irTypes(file: File): File = File(file, "types.knt") fun irSignatures(file: File): File = File(file, "signatures.knt") fun irStrings(file: File): File = File(file, "strings.knt") fun irBodies(file: File): File = File(file, "body.knb") fun irFile(file: File): File = File(file, "file.knf") + fun irDebugInfo(file: File): File = File(file, "debugInfo.knd") } diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryWriter.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryWriter.kt index 29dba74f7a4..94daf7195d1 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryWriter.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryWriter.kt @@ -60,7 +60,8 @@ class SerializedIrFile( val signatures: ByteArray, val strings: ByteArray, val bodies: ByteArray, - val declarations: ByteArray + val declarations: ByteArray, + val debugInfo: ByteArray? ) class SerializedIrModule(val files: Collection) \ No newline at end of file diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrWriterImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrWriterImpl.kt index 358e6e8aced..5b9da6e6c1f 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrWriterImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrWriterImpl.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.library.impl -import org.jetbrains.kotlin.library.* +import org.jetbrains.kotlin.library.IrKotlinLibraryLayout +import org.jetbrains.kotlin.library.IrWriter +import org.jetbrains.kotlin.library.SerializedIrFile +import org.jetbrains.kotlin.library.SerializedIrModule abstract class IrWriterImpl(val irLayout: IrKotlinLibraryLayout) : IrWriter { override fun addDataFlowGraph(dataFlowGraph: ByteArray) { @@ -25,6 +28,7 @@ class IrMonoliticWriterImpl(_irLayout: IrKotlinLibraryLayout) : IrWriterImpl(_ir IrArrayWriter(map { it.signatures }).writeIntoFile(irLayout.irSignatures.absolutePath) IrArrayWriter(map { it.strings }).writeIntoFile(irLayout.irStrings.absolutePath) IrArrayWriter(map { it.bodies }).writeIntoFile(irLayout.irBodies.absolutePath) + IrArrayWriter(mapNotNull { it.debugInfo }).writeIntoFile(irLayout.irDebugInfo.absolutePath) } } } diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt index bfd076d35ac..7a3bc5f9877 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt @@ -108,6 +108,8 @@ class IrMonoliticLibraryImpl(_access: IrLibraryAccess) : override fun body(index: Int, fileIndex: Int) = bodies.tableItemBytes(fileIndex, index) + override fun debugInfo(index: Int, fileIndex: Int) = debugInfos?.tableItemBytes(fileIndex, index) + override fun file(index: Int) = files.tableItemBytes(index) private fun loadIrDeclaration(index: Int, fileIndex: Int) = @@ -143,6 +145,12 @@ class IrMonoliticLibraryImpl(_access: IrLibraryAccess) : }) } + private val debugInfos: IrMultiArrayFileReader? by lazy { + access.realFiles { + it.irDebugInfo.let { diFile -> if (diFile.exists) IrMultiArrayFileReader(diFile) else null } + } + } + private val files: IrArrayFileReader by lazy { IrArrayFileReader(access.realFiles { it.irFiles @@ -212,6 +220,23 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess) : Ir return dataReader.tableItemBytes(index) } + + private val fileToDebugInfoMap = mutableMapOf() + override fun debugInfo(index: Int, fileIndex: Int): ByteArray? { + val dataReader = fileToDebugInfoMap.getOrPut(fileIndex) { + val fileDirectory = directories[fileIndex] + access.realFiles { + it.irDebugInfo(fileDirectory).let { diFile -> + if (diFile.exists) { + IrArrayFileReader(diFile) + } else null + } + } + + } + return dataReader?.tableItemBytes(index) + } + override fun file(index: Int): ByteArray { return access.realFiles { it.irFile(directories[index]).readBytes() diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt index f2a53982da8..597f90f7916 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt @@ -150,6 +150,8 @@ class ExtractingIrLibraryImpl(val zipped: IrLibraryLayoutImpl) : override val irBodies: File by lazy { zipped.extract(zipped.irBodies) } override val irFiles: File by lazy { zipped.extract(zipped.irFiles) } + + override val irDebugInfo: File by lazy { zipped.extract(zipped.irDebugInfo) } } internal fun zippedKotlinLibraryChecks(klibFile: File) { diff --git a/js/js.config/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt b/js/js.config/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt index cf52d43514a..0736959f38b 100644 --- a/js/js.config/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt +++ b/js/js.config/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt @@ -49,7 +49,8 @@ interface IncrementalResultsConsumer { strings: ByteArray, declarations: ByteArray, bodies: ByteArray, - fqn: ByteArray + fqn: ByteArray, + debugInfo: ByteArray? ) } @@ -134,9 +135,10 @@ open class IncrementalResultsConsumerImpl : IncrementalResultsConsumer { strings: ByteArray, declarations: ByteArray, bodies: ByteArray, - fqn: ByteArray + fqn: ByteArray, + debugInfo: ByteArray? ) { - _irFileData[sourceFile] = IrTranslationResultValue(fileData, types, signatures, strings, declarations, bodies, fqn) + _irFileData[sourceFile] = IrTranslationResultValue(fileData, types, signatures, strings, declarations, bodies, fqn, debugInfo) } } diff --git a/js/js.config/src/org/jetbrains/kotlin/incremental/js/TranslationResultValue.kt b/js/js.config/src/org/jetbrains/kotlin/incremental/js/TranslationResultValue.kt index 2414baff8e5..ebf6d75b0f5 100644 --- a/js/js.config/src/org/jetbrains/kotlin/incremental/js/TranslationResultValue.kt +++ b/js/js.config/src/org/jetbrains/kotlin/incremental/js/TranslationResultValue.kt @@ -26,5 +26,6 @@ data class IrTranslationResultValue( val strings: ByteArray, val declarations: ByteArray, val bodies: ByteArray, - val fqn: ByteArray + val fqn: ByteArray, + val debugInfo: ByteArray? )