[KLIB] Fix ir serializer output format
This commit is contained in:
+11
-11
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user