Skip to content

Commit cced4d2

Browse files
mcpiromanSpace Team
authored andcommitted
[Klib] Deduplicate entries in KotlinLibraryLayout about two IR dirs
#KT-80999 Fixed
1 parent 2ca1f0b commit cced4d2

File tree

4 files changed

+56
-79
lines changed

4 files changed

+56
-79
lines changed

compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibraryLayout.kt

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -56,48 +56,35 @@ interface MetadataKotlinLibraryLayout : KotlinLibraryLayout {
5656
}
5757

5858
interface IrKotlinLibraryLayout : KotlinLibraryLayout {
59-
val irDir
60-
get() = File(componentDir, KLIB_IR_FOLDER_NAME)
61-
val irDeclarations
62-
get() = File(irDir, IR_DECLARATIONS_FILE_NAME)
63-
val irTypes
64-
get() = File(irDir, IR_TYPES_FILE_NAME)
65-
val irSignatures
66-
get() = File(irDir, IR_SIGNATURES_FILE_NAME)
67-
val irStrings
68-
get() = File(irDir, IR_STRINGS_FILE_NAME)
69-
val irBodies
70-
get() = File(irDir, IR_BODIES_FILE_NAME)
71-
val irFiles
72-
get() = File(irDir, IR_FILES_FILE_NAME)
73-
val irDebugInfo
74-
get() = File(irDir, IR_DEBUG_INFO_FILE_NAME)
75-
// Please check `hasFileEntriesTable` before getter invocation, otherwise it may crash in override getter
76-
val irFileEntries
77-
get() = File(irDir, IR_FILE_ENTRIES_FILE_NAME)
59+
val mainIr: IrDirectory
60+
get() = IrDirectory(File(componentDir, KLIB_IR_FOLDER_NAME))
7861

7962
// This directory is similar to the main "ir" directory but contains only specially prepared copies of public inline functions,
8063
// instead of the entire IR.
8164
// Those may be read and inlined on the first stage of compilation, without the need to read the main, much bigger,
8265
// "ir" directory (see KT-75794).
83-
val irOfInlineableFunsDir
84-
get() = File(componentDir, KLIB_IR_INLINABLE_FUNCTIONS_DIR_NAME)
85-
val irFilesOfInlineableFuns
86-
get() = File(irOfInlineableFunsDir, IR_FILES_FILE_NAME)
87-
val irDeclarationsOfInlineableFuns
88-
get() = File(irOfInlineableFunsDir, IR_DECLARATIONS_FILE_NAME)
89-
val irTypesOfInlineableFuns
90-
get() = File(irOfInlineableFunsDir, IR_TYPES_FILE_NAME)
91-
val irSignaturesOfInlineableFuns
92-
get() = File(irOfInlineableFunsDir, IR_SIGNATURES_FILE_NAME)
93-
val irStringsOfInlineableFuns
94-
get() = File(irOfInlineableFunsDir, IR_STRINGS_FILE_NAME)
95-
val irBodiesOfInlineableFuns
96-
get() = File(irOfInlineableFunsDir, IR_BODIES_FILE_NAME)
97-
val irDebugInfoOfInlineableFuns
98-
get() = File(irOfInlineableFunsDir, IR_DEBUG_INFO_FILE_NAME)
99-
val irFileEntriesOfInlineableFuns
100-
get() = File(irOfInlineableFunsDir, IR_FILE_ENTRIES_FILE_NAME)
66+
val inlineableFunsIr: IrDirectory
67+
get() = IrDirectory(File(componentDir, KLIB_IR_INLINABLE_FUNCTIONS_DIR_NAME))
68+
69+
class IrDirectory(val dir: File) {
70+
val irDeclarations
71+
get() = File(dir, IR_DECLARATIONS_FILE_NAME)
72+
val irTypes
73+
get() = File(dir, IR_TYPES_FILE_NAME)
74+
val irSignatures
75+
get() = File(dir, IR_SIGNATURES_FILE_NAME)
76+
val irStrings
77+
get() = File(dir, IR_STRINGS_FILE_NAME)
78+
val irBodies
79+
get() = File(dir, IR_BODIES_FILE_NAME)
80+
val irFiles
81+
get() = File(dir, IR_FILES_FILE_NAME)
82+
val irDebugInfo
83+
get() = File(dir, IR_DEBUG_INFO_FILE_NAME)
84+
// Please check `hasFileEntriesTable` before getter invocation, otherwise it may crash in override getter
85+
val irFileEntries
86+
get() = File(dir, IR_FILE_ENTRIES_FILE_NAME)
87+
}
10188

10289
companion object {
10390
const val IR_DECLARATIONS_FILE_NAME = "irDeclarations.knd"

compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrWriterImpl.kt

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,23 @@ import org.jetbrains.kotlin.konan.file.File as KFile
1313

1414
class IrWriterImpl(val irLayout: IrKotlinLibraryLayout) : IrWriter {
1515
override fun addIr(ir: SerializedIrModule) {
16-
irLayout.irDir.mkdirs()
17-
18-
with(ir.files.sortedBy { it.path }) {
19-
serializeNonNullableEntities(SerializedIrFile::fileData, irLayout::irFiles)
20-
serializeNonNullableEntities(SerializedIrFile::declarations, irLayout::irDeclarations)
21-
serializeNonNullableEntities(SerializedIrFile::types, irLayout::irTypes)
22-
serializeNonNullableEntities(SerializedIrFile::signatures, irLayout::irSignatures)
23-
serializeNonNullableEntities(SerializedIrFile::strings, irLayout::irStrings)
24-
serializeNonNullableEntities(SerializedIrFile::bodies, irLayout::irBodies)
25-
serializeNullableEntries(SerializedIrFile::debugInfo, irLayout::irDebugInfo)
26-
serializeNullableEntries(SerializedIrFile::fileEntries, irLayout::irFileEntries)
16+
serializeIrDirectory(irLayout.mainIr, ir.files.sortedBy { it.path })
17+
if (ir.fileWithPreparedInlinableFunctions != null) {
18+
serializeIrDirectory(irLayout.inlineableFunsIr, listOf(ir.fileWithPreparedInlinableFunctions))
2719
}
20+
}
2821

29-
if (ir.fileWithPreparedInlinableFunctions != null) {
30-
irLayout.irOfInlineableFunsDir.mkdirs()
31-
// Write all inlinable functions together, in a single file.
32-
with(listOf(ir.fileWithPreparedInlinableFunctions)) {
33-
serializeNonNullableEntities(SerializedIrFile::fileData, irLayout::irFilesOfInlineableFuns)
34-
serializeNonNullableEntities(SerializedIrFile::declarations, irLayout::irDeclarationsOfInlineableFuns)
35-
serializeNonNullableEntities(SerializedIrFile::types, irLayout::irTypesOfInlineableFuns)
36-
serializeNonNullableEntities(SerializedIrFile::signatures, irLayout::irSignaturesOfInlineableFuns)
37-
serializeNonNullableEntities(SerializedIrFile::strings, irLayout::irStringsOfInlineableFuns)
38-
serializeNonNullableEntities(SerializedIrFile::bodies, irLayout::irBodiesOfInlineableFuns)
39-
serializeNullableEntries(SerializedIrFile::debugInfo, irLayout::irDebugInfoOfInlineableFuns)
40-
serializeNullableEntries(SerializedIrFile::fileEntries, irLayout::irFileEntriesOfInlineableFuns)
41-
}
22+
private fun serializeIrDirectory(irDirectory: IrKotlinLibraryLayout.IrDirectory, irFiles: List<SerializedIrFile>) {
23+
irDirectory.dir.mkdirs()
24+
with(irFiles.sortedBy { it.path }) {
25+
serializeNonNullableEntities(SerializedIrFile::fileData, irDirectory::irFiles)
26+
serializeNonNullableEntities(SerializedIrFile::declarations, irDirectory::irDeclarations)
27+
serializeNonNullableEntities(SerializedIrFile::types, irDirectory::irTypes)
28+
serializeNonNullableEntities(SerializedIrFile::signatures, irDirectory::irSignatures)
29+
serializeNonNullableEntities(SerializedIrFile::strings, irDirectory::irStrings)
30+
serializeNonNullableEntities(SerializedIrFile::bodies, irDirectory::irBodies)
31+
serializeNullableEntries(SerializedIrFile::debugInfo, irDirectory::irDebugInfo)
32+
serializeNullableEntries(SerializedIrFile::fileEntries, irDirectory::irFileEntries)
4233
}
4334
}
4435

compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -87,22 +87,22 @@ class MetadataLibraryImpl(
8787
class IrLibraryImpl(val access: IrLibraryAccess<IrKotlinLibraryLayout>) : IrLibrary {
8888
override val hasMainIr by lazy {
8989
access.inPlace { it: IrKotlinLibraryLayout ->
90-
it.irDir.exists
90+
it.mainIr.dir.exists
9191
}
9292
}
93-
override val mainIr = IrDirectory(false)
93+
override val mainIr = IrDirectory { mainIr }
9494

9595
override val hasInlinableFunsIr by lazy {
9696
access.inPlace { it: IrKotlinLibraryLayout ->
97-
it.irOfInlineableFunsDir.exists
97+
it.inlineableFunsIr.dir.exists
9898
}
9999
}
100-
override val inlinableFunsIr = IrDirectory(true)
100+
override val inlinableFunsIr = IrDirectory { inlineableFunsIr }
101101

102-
inner class IrDirectory(private val takeInlineableIrDir: Boolean) : IrLibrary.IrDirectory {
102+
inner class IrDirectory(private val selectIrDir: IrKotlinLibraryLayout.() -> IrKotlinLibraryLayout.IrDirectory) : IrLibrary.IrDirectory {
103103
override val hasFileEntriesTable: Boolean by lazy {
104104
access.inPlace { it: IrKotlinLibraryLayout ->
105-
(if (takeInlineableIrDir) it.irFileEntries else it.irFileEntriesOfInlineableFuns).exists
105+
it.selectIrDir().irFileEntries.exists
106106
}
107107
}
108108

@@ -128,42 +128,41 @@ class IrLibraryImpl(val access: IrLibraryAccess<IrKotlinLibraryLayout>) : IrLibr
128128
combinedDeclarations.tableItemBytes(fileIndex, DeclarationId(index))
129129

130130
private val combinedDeclarations: DeclarationIdMultiTableReader by lazy {
131-
DeclarationIdMultiTableReader(access) { if (takeInlineableIrDir) irTypes else irTypesOfInlineableFuns }
132-
DeclarationIdMultiTableReader(access) { if (takeInlineableIrDir) irDeclarations else irDeclarationsOfInlineableFuns }
131+
DeclarationIdMultiTableReader(access) { selectIrDir().irDeclarations}
133132
}
134133

135134
private val types: IrMultiArrayReader by lazy {
136-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irTypes else irTypesOfInlineableFuns }
135+
IrMultiArrayReader(access) { selectIrDir().irTypes }
137136
}
138137

139138
private val signatures: IrMultiArrayReader by lazy {
140-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irSignatures else irSignaturesOfInlineableFuns }
139+
IrMultiArrayReader(access) { selectIrDir().irSignatures }
141140
}
142141

143142
private val strings: IrMultiArrayReader by lazy {
144-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irStrings else irStringsOfInlineableFuns }
143+
IrMultiArrayReader(access) { selectIrDir().irStrings }
145144
}
146145

147146
private val bodies: IrMultiArrayReader by lazy {
148-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irBodies else irBodiesOfInlineableFuns }
147+
IrMultiArrayReader(access) { selectIrDir().irBodies }
149148
}
150149

151150
private val debugInfos: IrMultiArrayReader? by lazy {
152-
if (access.inPlace { (if (takeInlineableIrDir) it.irDebugInfo else it.irDebugInfoOfInlineableFuns).exists })
153-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irDebugInfo else irDebugInfoOfInlineableFuns }
151+
if (access.inPlace { it.selectIrDir().irDebugInfo.exists })
152+
IrMultiArrayReader(access) { selectIrDir().irDebugInfo }
154153
else
155154
null
156155
}
157156

158157
private val fileEntries: IrMultiArrayReader? by lazy {
159-
if (access.inPlace { (if (takeInlineableIrDir) it.irFileEntries else it.irFileEntriesOfInlineableFuns).exists })
160-
IrMultiArrayReader(access) { if (takeInlineableIrDir) irFileEntries else irFileEntriesOfInlineableFuns }
158+
if (access.inPlace { it.selectIrDir().irFileEntries.exists })
159+
IrMultiArrayReader(access) { selectIrDir().irFileEntries }
161160
else
162161
null
163162
}
164163

165164
private val files: IrArrayReader by lazy {
166-
IrArrayReader(access) { if (takeInlineableIrDir) irFiles else irFilesOfInlineableFuns }
165+
IrArrayReader(access) { selectIrDir().irFiles }
167166
}
168167

169168
override fun types(fileIndex: Int): ByteArray {

compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryWriterImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class KotlinLibraryOnlyIrWriter(output: String, moduleName: String, versions: Ko
166166

167167
fun invalidate() {
168168
outputDir.deleteRecursively()
169-
library.layout.irDir.mkdirs()
169+
library.layout.mainIr.dir.mkdirs()
170170
}
171171

172172
fun writeIr(serializedIrModule: SerializedIrModule) {

0 commit comments

Comments
 (0)