[KLIB] Fix ir serializer output format

This commit is contained in:
Roman Artemev
2019-08-23 14:31:47 +03:00
committed by romanart
parent c8c9328973
commit 6bea403338
4 changed files with 52 additions and 56 deletions
@@ -5,11 +5,9 @@
package org.jetbrains.kotlin.backend.common.serialization package org.jetbrains.kotlin.backend.common.serialization
//import org.jetbrains.kotlin.library.SerializedIrFile
import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.ir.ir2string import org.jetbrains.kotlin.backend.common.ir.ir2string
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.ClassKind.* import org.jetbrains.kotlin.descriptors.ClassKind.*
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
@@ -23,10 +21,12 @@ import org.jetbrains.kotlin.ir.util.lineStartOffsets
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.library.SerializedDeclaration
import org.jetbrains.kotlin.library.SerializedIrFile import org.jetbrains.kotlin.library.SerializedIrFile
import org.jetbrains.kotlin.library.impl.SerializedDeclaration import org.jetbrains.kotlin.library.SkippedDeclaration
import org.jetbrains.kotlin.library.impl.SkippedDeclaration import org.jetbrains.kotlin.library.TopLevelDeclaration
import org.jetbrains.kotlin.library.impl.TopLevelDeclaration import org.jetbrains.kotlin.library.impl.IrMemoryArrayWriter
import org.jetbrains.kotlin.library.impl.IrMemoryDeclarationWriter
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -1352,13 +1352,13 @@ open class IrFileSerializer(
return SerializedIrFile( return SerializedIrFile(
proto.build().toByteArray(), proto.build().toByteArray(),
file.fqName.pathSegments().map { it.identifier }, file.fqName.asString(),
file.path, file.path,
protoSymbolArray.map { it.toByteArray() }, IrMemoryArrayWriter(protoSymbolArray.map { it.toByteArray() }).writeIntoMemory(),
protoTypeArray.map { it.toByteArray() }, IrMemoryArrayWriter(protoTypeArray.map { it.toByteArray() }).writeIntoMemory(),
protoStringArray.map { it.toByteArray() }, IrMemoryArrayWriter(protoStringArray.map { it.toByteArray() }).writeIntoMemory(),
protoBodyArray.map { it.toByteArray() }, IrMemoryArrayWriter(protoBodyArray.map { it.toByteArray() }).writeIntoMemory(),
topLevelDeclarations IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory()
) )
} }
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.library package org.jetbrains.kotlin.library
import org.jetbrains.kotlin.konan.properties.Properties import org.jetbrains.kotlin.konan.properties.Properties
import org.jetbrains.kotlin.library.impl.SerializedDeclaration
interface BaseWriter { interface BaseWriter {
val versions: KonanLibraryVersioning val versions: KonanLibraryVersioning
@@ -33,17 +32,37 @@ class SerializedMetadata(
val fragmentNames: List<String> val fragmentNames: List<String>
) )
sealed class SerializedDeclaration {
abstract val id: Long
abstract val local: Int
abstract val size: Int
abstract val bytes: ByteArray
abstract val declarationName: String
}
class TopLevelDeclaration(override val id: Long, isLocal: Boolean, override val declarationName: String, override val bytes: ByteArray) : SerializedDeclaration() {
override val local = if (isLocal) 1 else 0
override val size = bytes.size
}
object SkippedDeclaration : SerializedDeclaration() {
override val id = -1L
override val local = -1
override val size = 0
override val bytes = ByteArray(0)
override val declarationName: String = "<SKIPPED>"
}
class SerializedIrFile( class SerializedIrFile(
val fileData: ByteArray, val fileData: ByteArray,
// val fileProto: ProtoFile, val fqName: String,
val fqName: List<String>,
val path: String, val path: String,
// val symbols: List<SerializedIrSymbol>, val symbols: ByteArray,
val symbols: List<ByteArray>, val types: ByteArray,
val types: List<ByteArray>, val strings: ByteArray,
val strings: List<ByteArray>, val bodies: ByteArray,
val bodies: List<ByteArray>, val declarations: ByteArray
val declarations: List<SerializedDeclaration>
) )
class SerializedIrModule(val files: Collection<SerializedIrFile>) class SerializedIrModule(val files: Collection<SerializedIrFile>)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.library.impl package org.jetbrains.kotlin.library.impl
import org.jetbrains.kotlin.library.SerializedDeclaration
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.DataOutput import java.io.DataOutput
import java.io.DataOutputStream import java.io.DataOutputStream
@@ -88,30 +89,6 @@ class IrTableWriter(private val data: List<Pair<Long, ByteArray>>) : IrFileWrite
} }
} }
sealed class SerializedDeclaration {
abstract val id: Long
abstract val local: Int
abstract val size: Int
abstract val bytes: ByteArray
abstract val declarationName: String
}
class TopLevelDeclaration(override val id: Long, isLocal: Boolean, override val declarationName: String, override val bytes: ByteArray) : SerializedDeclaration() {
override val local = if (isLocal) 1 else 0
override val size = bytes.size
}
object SkippedDeclaration : SerializedDeclaration() {
override val id = -1L
override val local = -1
override val size = 0
override val bytes = ByteArray(0)
override val declarationName: String = "<SKIPPED>"
}
class IrDeclarationWriter(private val declarations: List<SerializedDeclaration>) : IrFileWriter() { class IrDeclarationWriter(private val declarations: List<SerializedDeclaration>) : IrFileWriter() {
private val SINGLE_INDEX_RECORD_SIZE = 20 // sizeof(Long) + 3 * sizeof(Int). private val SINGLE_INDEX_RECORD_SIZE = 20 // sizeof(Long) + 3 * sizeof(Int).
@@ -22,11 +22,11 @@ class IrMonoliticWriterImpl(irLayout: IrKotlinLibraryLayout) : IrWriterImpl(irLa
override fun addIr(ir: SerializedIrModule) { override fun addIr(ir: SerializedIrModule) {
with(ir.files.sortedBy { it.path }) { with(ir.files.sortedBy { it.path }) {
IrArrayWriter(map { it.fileData }).writeIntoFile(irLayout.irFiles.absolutePath) IrArrayWriter(map { it.fileData }).writeIntoFile(irLayout.irFiles.absolutePath)
IrArrayWriter(map { IrMemoryDeclarationWriter(it.declarations).writeIntoMemory() }).writeIntoFile(irLayout.irDeclarations.absolutePath) IrArrayWriter(map { it.declarations }).writeIntoFile(irLayout.irDeclarations.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.symbols).writeIntoMemory() }).writeIntoFile(irLayout.irSymbols.absolutePath) IrArrayWriter(map { it.symbols }).writeIntoFile(irLayout.irSymbols.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.types).writeIntoMemory() }).writeIntoFile(irLayout.irTypes.absolutePath) IrArrayWriter(map { it.types }).writeIntoFile(irLayout.irTypes.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.strings).writeIntoMemory() }).writeIntoFile(irLayout.irStrings.absolutePath) IrArrayWriter(map { it.strings }).writeIntoFile(irLayout.irStrings.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.bodies).writeIntoMemory() }).writeIntoFile(irLayout.irBodies.absolutePath) IrArrayWriter(map { it.bodies }).writeIntoFile(irLayout.irBodies.absolutePath)
} }
} }
} }
@@ -39,7 +39,7 @@ class IrPerFileWriterImpl(irLayout: IrKotlinLibraryLayout) : IrWriterImpl(irLayo
} }
private fun serializeFile(file: SerializedIrFile) { private fun serializeFile(file: SerializedIrFile) {
val fqnPath = file.fqName.joinToString(separator = ".") val fqnPath = file.fqName
val fileId = file.path.hashCode().toString(Character.MAX_RADIX) val fileId = file.path.hashCode().toString(Character.MAX_RADIX)
val irFileDirectory = "$fqnPath.$fileId.file" val irFileDirectory = "$fqnPath.$fileId.file"
val fileDir = irLayout.irDir.child(irFileDirectory) val fileDir = irLayout.irDir.child(irFileDirectory)
@@ -48,11 +48,11 @@ class IrPerFileWriterImpl(irLayout: IrKotlinLibraryLayout) : IrWriterImpl(irLayo
fileDir.mkdirs() fileDir.mkdirs()
irLayout.irFile(fileDir).writeBytes(file.fileData) irLayout.irFile(fileDir).writeBytes(file.fileData)
IrDeclarationWriter(file.declarations).writeIntoFile(irLayout.irDeclarations(fileDir).absolutePath)
IrArrayWriter(file.symbols).writeIntoFile(irLayout.irSymbols(fileDir).absolutePath) irLayout.irDeclarations(fileDir).writeBytes(file.declarations)
IrArrayWriter(file.types).writeIntoFile(irLayout.irTypes(fileDir).absolutePath) irLayout.irSymbols(fileDir).writeBytes(file.symbols)
IrArrayWriter(file.strings).writeIntoFile(irLayout.irStrings(fileDir).absolutePath) irLayout.irTypes(fileDir).writeBytes(file.types)
IrArrayWriter(file.bodies).writeIntoFile(irLayout.irBodies(fileDir).absolutePath) irLayout.irStrings(fileDir).writeBytes(file.strings)
// fileDir.child("declarations.txt").writeText(file.declarations.joinToString(separator = "\n") { "${it.declarationName} -> (${it.id}, ${it.local})" }) irLayout.irBodies(fileDir).writeBytes(file.bodies)
} }
} }