[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
//import org.jetbrains.kotlin.library.SerializedIrFile
import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.ir.ir2string
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.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.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.library.SerializedDeclaration
import org.jetbrains.kotlin.library.SerializedIrFile
import org.jetbrains.kotlin.library.impl.SerializedDeclaration
import org.jetbrains.kotlin.library.impl.SkippedDeclaration
import org.jetbrains.kotlin.library.impl.TopLevelDeclaration
import org.jetbrains.kotlin.library.SkippedDeclaration
import org.jetbrains.kotlin.library.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.Name
import org.jetbrains.kotlin.types.Variance
@@ -1352,13 +1352,13 @@ open class IrFileSerializer(
return SerializedIrFile(
proto.build().toByteArray(),
file.fqName.pathSegments().map { it.identifier },
file.fqName.asString(),
file.path,
protoSymbolArray.map { it.toByteArray() },
protoTypeArray.map { it.toByteArray() },
protoStringArray.map { it.toByteArray() },
protoBodyArray.map { it.toByteArray() },
topLevelDeclarations
IrMemoryArrayWriter(protoSymbolArray.map { it.toByteArray() }).writeIntoMemory(),
IrMemoryArrayWriter(protoTypeArray.map { it.toByteArray() }).writeIntoMemory(),
IrMemoryArrayWriter(protoStringArray.map { it.toByteArray() }).writeIntoMemory(),
IrMemoryArrayWriter(protoBodyArray.map { it.toByteArray() }).writeIntoMemory(),
IrMemoryDeclarationWriter(topLevelDeclarations).writeIntoMemory()
)
}
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.library
import org.jetbrains.kotlin.konan.properties.Properties
import org.jetbrains.kotlin.library.impl.SerializedDeclaration
interface BaseWriter {
val versions: KonanLibraryVersioning
@@ -33,17 +32,37 @@ class SerializedMetadata(
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(
val fileData: ByteArray,
// val fileProto: ProtoFile,
val fqName: List<String>,
val fqName: String,
val path: String,
// val symbols: List<SerializedIrSymbol>,
val symbols: List<ByteArray>,
val types: List<ByteArray>,
val strings: List<ByteArray>,
val bodies: List<ByteArray>,
val declarations: List<SerializedDeclaration>
val symbols: ByteArray,
val types: ByteArray,
val strings: ByteArray,
val bodies: ByteArray,
val declarations: ByteArray
)
class SerializedIrModule(val files: Collection<SerializedIrFile>)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.library.impl
import org.jetbrains.kotlin.library.SerializedDeclaration
import java.io.ByteArrayOutputStream
import java.io.DataOutput
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() {
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) {
with(ir.files.sortedBy { it.path }) {
IrArrayWriter(map { it.fileData }).writeIntoFile(irLayout.irFiles.absolutePath)
IrArrayWriter(map { IrMemoryDeclarationWriter(it.declarations).writeIntoMemory() }).writeIntoFile(irLayout.irDeclarations.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.symbols).writeIntoMemory() }).writeIntoFile(irLayout.irSymbols.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.types).writeIntoMemory() }).writeIntoFile(irLayout.irTypes.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.strings).writeIntoMemory() }).writeIntoFile(irLayout.irStrings.absolutePath)
IrArrayWriter(map { IrMemoryArrayWriter(it.bodies).writeIntoMemory() }).writeIntoFile(irLayout.irBodies.absolutePath)
IrArrayWriter(map { it.declarations }).writeIntoFile(irLayout.irDeclarations.absolutePath)
IrArrayWriter(map { it.symbols }).writeIntoFile(irLayout.irSymbols.absolutePath)
IrArrayWriter(map { it.types }).writeIntoFile(irLayout.irTypes.absolutePath)
IrArrayWriter(map { it.strings }).writeIntoFile(irLayout.irStrings.absolutePath)
IrArrayWriter(map { it.bodies }).writeIntoFile(irLayout.irBodies.absolutePath)
}
}
}
@@ -39,7 +39,7 @@ class IrPerFileWriterImpl(irLayout: IrKotlinLibraryLayout) : IrWriterImpl(irLayo
}
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 irFileDirectory = "$fqnPath.$fileId.file"
val fileDir = irLayout.irDir.child(irFileDirectory)
@@ -48,11 +48,11 @@ class IrPerFileWriterImpl(irLayout: IrKotlinLibraryLayout) : IrWriterImpl(irLayo
fileDir.mkdirs()
irLayout.irFile(fileDir).writeBytes(file.fileData)
IrDeclarationWriter(file.declarations).writeIntoFile(irLayout.irDeclarations(fileDir).absolutePath)
IrArrayWriter(file.symbols).writeIntoFile(irLayout.irSymbols(fileDir).absolutePath)
IrArrayWriter(file.types).writeIntoFile(irLayout.irTypes(fileDir).absolutePath)
IrArrayWriter(file.strings).writeIntoFile(irLayout.irStrings(fileDir).absolutePath)
IrArrayWriter(file.bodies).writeIntoFile(irLayout.irBodies(fileDir).absolutePath)
// fileDir.child("declarations.txt").writeText(file.declarations.joinToString(separator = "\n") { "${it.declarationName} -> (${it.id}, ${it.local})" })
irLayout.irDeclarations(fileDir).writeBytes(file.declarations)
irLayout.irSymbols(fileDir).writeBytes(file.symbols)
irLayout.irTypes(fileDir).writeBytes(file.types)
irLayout.irStrings(fileDir).writeBytes(file.strings)
irLayout.irBodies(fileDir).writeBytes(file.bodies)
}
}