[Klib] Split up IR header tables onto three parts

There was one monolith protobuf at irHeader.knd, it was
split up onto 4 parts due to performance issues:
  - a small irHeader with some basic info about a module
  - symbols table
  - types table
  - strings table
These 3 tables are then mmapped and accessed by index.
This commit is contained in:
Igor Chevdar
2019-06-05 19:56:31 +03:00
parent 5faccaa49e
commit 3e8f3e6f00
14 changed files with 315 additions and 519 deletions
@@ -97,9 +97,6 @@ message IrFile {
message IrModule {
required String name = 1;
repeated IrFile file = 2;
required IrSymbolTable symbol_table = 3;
required IrTypeTable type_table = 4;
required StringTable string_table = 5;
}
/* ------ String Table ------------------------------------------ */
@@ -1,108 +0,0 @@
/**
* Copyright 2010-2019 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.backend.common.library
import java.io.File
import java.io.RandomAccessFile
import java.nio.MappedByteBuffer
import java.nio.channels.FileChannel
import java.nio.file.Files
data class DeclarationId(val id: Long, val isLocal: Boolean)
fun File.map(mode: FileChannel.MapMode = FileChannel.MapMode.READ_ONLY,
start: Long = 0, size: Long = -1): MappedByteBuffer {
val file = RandomAccessFile(path,
if (mode == FileChannel.MapMode.READ_ONLY) "r" else "rw")
val fileSize = if (mode == FileChannel.MapMode.READ_ONLY)
file.length() else size.also { assert(size != -1L) }
val channel = file.channel
return channel.map(mode, start, fileSize)
.also { channel.close() } // Channel close closes the file also.
}
class CombinedIrFileReader(file: File) {
private val buffer = file.map(FileChannel.MapMode.READ_ONLY)
private val declarationToOffsetSize = mutableMapOf<DeclarationId, Pair<Int, Int>>()
init {
val declarationsCount = buffer.int
for (i in 0 until declarationsCount) {
val id = buffer.long
val isLocal = buffer.int != 0
val offset = buffer.int
val size = buffer.int
declarationToOffsetSize[DeclarationId(id, isLocal)] = offset to size
}
}
fun declarationBytes(id: DeclarationId): ByteArray {
val offsetSize = declarationToOffsetSize[id] ?: throw Error("No declaration with $id here")
val result = ByteArray(offsetSize.second)
buffer.position(offsetSize.first)
buffer.get(result, 0, offsetSize.second)
return result
}
}
private const val SINGLE_INDEX_RECORD_SIZE = 20 // sizeof(Long) + 3 * sizeof(Int).
private const val INDEX_HEADER_SIZE = 4 // sizeof(Int).
class CombinedIrFileWriter(val declarationCount: Int) {
private var currentDeclaration = 0
private var currentPosition = 0
private val file = Files.createTempFile("ir", "").toFile()
private val randomAccessFile = RandomAccessFile(file.path, "rw")
init {
randomAccessFile.writeInt(declarationCount)
assert(randomAccessFile.filePointer.toInt() == INDEX_HEADER_SIZE)
for (i in 0 until declarationCount) {
randomAccessFile.writeLong(-1) // id
randomAccessFile.writeInt(-1) // isLocal
randomAccessFile.writeInt(-1) // offset
randomAccessFile.writeInt(-1) // size
}
currentPosition = randomAccessFile.filePointer.toInt()
assert(currentPosition == INDEX_HEADER_SIZE + SINGLE_INDEX_RECORD_SIZE * declarationCount)
}
fun skipDeclaration() {
currentDeclaration++
}
fun addDeclaration(id: DeclarationId, bytes: ByteArray) {
randomAccessFile.seek((currentDeclaration * SINGLE_INDEX_RECORD_SIZE + INDEX_HEADER_SIZE).toLong())
randomAccessFile.writeLong(id.id)
randomAccessFile.writeInt(if (id.isLocal) 1 else 0)
randomAccessFile.writeInt(currentPosition)
randomAccessFile.writeInt(bytes.size)
randomAccessFile.seek(currentPosition.toLong())
randomAccessFile.write(bytes)
assert(randomAccessFile.filePointer < Int.MAX_VALUE.toLong())
currentPosition = randomAccessFile.filePointer.toInt()
currentDeclaration++
}
fun finishWriting(): File {
assert(currentDeclaration == declarationCount)
randomAccessFile.close()
return file
}
}
@@ -7,9 +7,10 @@ package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.ir.ir2string
import org.jetbrains.kotlin.backend.common.library.CombinedIrFileWriter
import org.jetbrains.kotlin.backend.common.library.DeclarationId
import org.jetbrains.kotlin.library.SerializedIr
import org.jetbrains.kotlin.library.impl.CombinedIrFileWriter
import org.jetbrains.kotlin.library.impl.DeclarationId
import org.jetbrains.kotlin.library.impl.SimpleIrTableFileWriter
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.ClassKind.*
import org.jetbrains.kotlin.descriptors.Modality
@@ -1205,6 +1206,9 @@ open class IrModuleSerializer(
}
lateinit var writer: CombinedIrFileWriter
lateinit var symbolTableWriter: SimpleIrTableFileWriter
lateinit var typeTableWriter: SimpleIrTableFileWriter
lateinit var stringTableWriter: SimpleIrTableFileWriter
fun serializeModule(module: IrModuleFragment): KotlinIr.IrModule {
val proto = KotlinIr.IrModule.newBuilder()
@@ -1217,23 +1221,27 @@ open class IrModuleSerializer(
module.files.forEach {
proto.addFile(serializeIrFile(it))
}
proto.symbolTable = KotlinIr.IrSymbolTable.newBuilder()
.addAllSymbols(protoSymbolArray)
.build()
proto.typeTable = KotlinIr.IrTypeTable.newBuilder()
.addAllTypes(protoTypeArray)
.build()
symbolTableWriter = SimpleIrTableFileWriter("symbols", protoSymbolArray.size)
for (protoSymbol in protoSymbolArray)
symbolTableWriter.addItem(protoSymbol.toByteArray())
proto.stringTable = KotlinIr.StringTable.newBuilder()
.addAllStrings(protoStringArray)
.build()
typeTableWriter = SimpleIrTableFileWriter("types", protoTypeArray.size)
for (protoSymbol in protoTypeArray)
typeTableWriter.addItem(protoSymbol.toByteArray())
stringTableWriter = SimpleIrTableFileWriter("strings", protoStringArray.size)
for (protoSymbol in protoStringArray)
stringTableWriter.addItem(protoSymbol.toByteArray())
return proto.build()
}
fun serializedIrModule(module: IrModuleFragment): SerializedIr {
val moduleHeader = serializeModule(module).toByteArray()
return SerializedIr(moduleHeader, writer.finishWriting().absolutePath)
return SerializedIr(moduleHeader, symbolTableWriter.finishWriting().absolutePath,
typeTableWriter.finishWriting().absolutePath,
stringTableWriter.finishWriting().absolutePath,
writer.finishWriting().absolutePath)
}
}
@@ -6719,44 +6719,35 @@ public final class KotlinIr {
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
java.util.List<org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile>
getFileList();
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile getFile(int index);
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
int getFileCount();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
boolean hasSymbolTable();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable getSymbolTable();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
boolean hasTypeTable();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable getTypeTable();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
boolean hasStringTable();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable getStringTable();
}
/**
* Protobuf type {@code org.jetbrains.kotlin.backend.common.serialization.IrModule}
@@ -6829,45 +6820,6 @@ public final class KotlinIr {
file_.add(input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile.PARSER, extensionRegistry));
break;
}
case 26: {
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.Builder subBuilder = null;
if (((bitField0_ & 0x00000002) == 0x00000002)) {
subBuilder = symbolTable_.toBuilder();
}
symbolTable_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.PARSER, extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(symbolTable_);
symbolTable_ = subBuilder.buildPartial();
}
bitField0_ |= 0x00000002;
break;
}
case 34: {
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.Builder subBuilder = null;
if (((bitField0_ & 0x00000004) == 0x00000004)) {
subBuilder = typeTable_.toBuilder();
}
typeTable_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.PARSER, extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(typeTable_);
typeTable_ = subBuilder.buildPartial();
}
bitField0_ |= 0x00000004;
break;
}
case 42: {
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.Builder subBuilder = null;
if (((bitField0_ & 0x00000008) == 0x00000008)) {
subBuilder = stringTable_.toBuilder();
}
stringTable_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.PARSER, extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(stringTable_);
stringTable_ = subBuilder.buildPartial();
}
bitField0_ |= 0x00000008;
break;
}
}
}
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -6924,12 +6876,24 @@ public final class KotlinIr {
private java.util.List<org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile> file_;
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile> getFileList() {
return file_;
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public java.util.List<? extends org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFileOrBuilder>
getFileOrBuilderList() {
@@ -6937,75 +6901,45 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public int getFileCount() {
return file_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile getFile(int index) {
return file_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFileOrBuilder getFileOrBuilder(
int index) {
return file_.get(index);
}
public static final int SYMBOL_TABLE_FIELD_NUMBER = 3;
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable symbolTable_;
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public boolean hasSymbolTable() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable getSymbolTable() {
return symbolTable_;
}
public static final int TYPE_TABLE_FIELD_NUMBER = 4;
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable typeTable_;
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public boolean hasTypeTable() {
return ((bitField0_ & 0x00000004) == 0x00000004);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable getTypeTable() {
return typeTable_;
}
public static final int STRING_TABLE_FIELD_NUMBER = 5;
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable stringTable_;
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public boolean hasStringTable() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable getStringTable() {
return stringTable_;
}
private void initFields() {
name_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.String.getDefaultInstance();
file_ = java.util.Collections.emptyList();
symbolTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.getDefaultInstance();
typeTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.getDefaultInstance();
stringTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.getDefaultInstance();
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -7017,18 +6951,6 @@ public final class KotlinIr {
memoizedIsInitialized = 0;
return false;
}
if (!hasSymbolTable()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasTypeTable()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasStringTable()) {
memoizedIsInitialized = 0;
return false;
}
if (!getName().isInitialized()) {
memoizedIsInitialized = 0;
return false;
@@ -7039,14 +6961,6 @@ public final class KotlinIr {
return false;
}
}
if (!getSymbolTable().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
if (!getTypeTable().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
memoizedIsInitialized = 1;
return true;
}
@@ -7060,15 +6974,6 @@ public final class KotlinIr {
for (int i = 0; i < file_.size(); i++) {
output.writeMessage(2, file_.get(i));
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
output.writeMessage(3, symbolTable_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
output.writeMessage(4, typeTable_);
}
if (((bitField0_ & 0x00000008) == 0x00000008)) {
output.writeMessage(5, stringTable_);
}
output.writeRawBytes(unknownFields);
}
@@ -7086,18 +6991,6 @@ public final class KotlinIr {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(2, file_.get(i));
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(3, symbolTable_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(4, typeTable_);
}
if (((bitField0_ & 0x00000008) == 0x00000008)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(5, stringTable_);
}
size += unknownFields.size();
memoizedSerializedSize = size;
return size;
@@ -7196,12 +7089,6 @@ public final class KotlinIr {
bitField0_ = (bitField0_ & ~0x00000001);
file_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000002);
symbolTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000004);
typeTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000008);
stringTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000010);
return this;
}
@@ -7234,18 +7121,6 @@ public final class KotlinIr {
bitField0_ = (bitField0_ & ~0x00000002);
}
result.file_ = file_;
if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
to_bitField0_ |= 0x00000002;
}
result.symbolTable_ = symbolTable_;
if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
to_bitField0_ |= 0x00000004;
}
result.typeTable_ = typeTable_;
if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
to_bitField0_ |= 0x00000008;
}
result.stringTable_ = stringTable_;
result.bitField0_ = to_bitField0_;
return result;
}
@@ -7265,15 +7140,6 @@ public final class KotlinIr {
}
}
if (other.hasSymbolTable()) {
mergeSymbolTable(other.getSymbolTable());
}
if (other.hasTypeTable()) {
mergeTypeTable(other.getTypeTable());
}
if (other.hasStringTable()) {
mergeStringTable(other.getStringTable());
}
setUnknownFields(
getUnknownFields().concat(other.unknownFields));
return this;
@@ -7284,18 +7150,6 @@ public final class KotlinIr {
return false;
}
if (!hasSymbolTable()) {
return false;
}
if (!hasTypeTable()) {
return false;
}
if (!hasStringTable()) {
return false;
}
if (!getName().isInitialized()) {
return false;
@@ -7306,14 +7160,6 @@ public final class KotlinIr {
return false;
}
}
if (!getSymbolTable().isInitialized()) {
return false;
}
if (!getTypeTable().isInitialized()) {
return false;
}
return true;
}
@@ -7407,24 +7253,48 @@ public final class KotlinIr {
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile> getFileList() {
return java.util.Collections.unmodifiableList(file_);
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public int getFileCount() {
return file_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile getFile(int index) {
return file_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder setFile(
int index, org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile value) {
@@ -7438,6 +7308,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder setFile(
int index, org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile.Builder builderForValue) {
@@ -7448,6 +7324,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder addFile(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile value) {
if (value == null) {
@@ -7460,6 +7342,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder addFile(
int index, org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile value) {
@@ -7473,6 +7361,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder addFile(
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile.Builder builderForValue) {
@@ -7483,6 +7377,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder addFile(
int index, org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile.Builder builderForValue) {
@@ -7493,6 +7393,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder addAllFile(
java.lang.Iterable<? extends org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrFile> values) {
@@ -7504,6 +7410,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder clearFile() {
file_ = java.util.Collections.emptyList();
@@ -7513,6 +7425,12 @@ public final class KotlinIr {
}
/**
* <code>repeated .org.jetbrains.kotlin.backend.common.serialization.IrFile file = 2;</code>
*
* <pre>
*required IrSymbolTable symbol_table = 3;
*required IrTypeTable type_table = 4;
*required StringTable string_table = 5;
* </pre>
*/
public Builder removeFile(int index) {
ensureFileIsMutable();
@@ -7521,186 +7439,6 @@ public final class KotlinIr {
return this;
}
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable symbolTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.getDefaultInstance();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public boolean hasSymbolTable() {
return ((bitField0_ & 0x00000004) == 0x00000004);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable getSymbolTable() {
return symbolTable_;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public Builder setSymbolTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable value) {
if (value == null) {
throw new NullPointerException();
}
symbolTable_ = value;
bitField0_ |= 0x00000004;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public Builder setSymbolTable(
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.Builder builderForValue) {
symbolTable_ = builderForValue.build();
bitField0_ |= 0x00000004;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public Builder mergeSymbolTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable value) {
if (((bitField0_ & 0x00000004) == 0x00000004) &&
symbolTable_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.getDefaultInstance()) {
symbolTable_ =
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.newBuilder(symbolTable_).mergeFrom(value).buildPartial();
} else {
symbolTable_ = value;
}
bitField0_ |= 0x00000004;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrSymbolTable symbol_table = 3;</code>
*/
public Builder clearSymbolTable() {
symbolTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbolTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000004);
return this;
}
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable typeTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.getDefaultInstance();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public boolean hasTypeTable() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable getTypeTable() {
return typeTable_;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public Builder setTypeTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable value) {
if (value == null) {
throw new NullPointerException();
}
typeTable_ = value;
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public Builder setTypeTable(
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.Builder builderForValue) {
typeTable_ = builderForValue.build();
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public Builder mergeTypeTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable value) {
if (((bitField0_ & 0x00000008) == 0x00000008) &&
typeTable_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.getDefaultInstance()) {
typeTable_ =
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.newBuilder(typeTable_).mergeFrom(value).buildPartial();
} else {
typeTable_ = value;
}
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.IrTypeTable type_table = 4;</code>
*/
public Builder clearTypeTable() {
typeTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrTypeTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000008);
return this;
}
private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable stringTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.getDefaultInstance();
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public boolean hasStringTable() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable getStringTable() {
return stringTable_;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public Builder setStringTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable value) {
if (value == null) {
throw new NullPointerException();
}
stringTable_ = value;
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public Builder setStringTable(
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.Builder builderForValue) {
stringTable_ = builderForValue.build();
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public Builder mergeStringTable(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable value) {
if (((bitField0_ & 0x00000010) == 0x00000010) &&
stringTable_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.getDefaultInstance()) {
stringTable_ =
org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.newBuilder(stringTable_).mergeFrom(value).buildPartial();
} else {
stringTable_ = value;
}
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>required .org.jetbrains.kotlin.backend.common.serialization.StringTable string_table = 5;</code>
*/
public Builder clearStringTable() {
stringTable_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.StringTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000010);
return this;
}
// @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.backend.common.serialization.IrModule)
}
@@ -66,6 +66,10 @@ abstract class KotlinIrLinker(
private var moduleLoops = mutableMapOf<Int, IrLoopBase>()
private val symbolProtosCache = mutableMapOf<Int, KotlinIr.IrSymbolData>()
private val typeProtosCache = mutableMapOf<Int, KotlinIr.IrType>()
private val stringsCache = mutableMapOf<Int, String>()
// This is a heavy initializer
val module = deserializeIrModuleHeader(moduleProto)
@@ -132,18 +136,36 @@ abstract class KotlinIrLinker(
else -> TODO("Unexpected classifier symbol kind: ${proto.kind}")
}
private fun loadSymbolProto(index: Int): KotlinIr.IrSymbolData {
return symbolProtosCache.getOrPut(index) {
loadSymbolProto(moduleDescriptor, index)
}
}
private fun loadTypeProto(index: Int): KotlinIr.IrType {
return typeProtosCache.getOrPut(index) {
loadTypeProto(moduleDescriptor, index)
}
}
private fun loadString(index: Int): String {
return stringsCache.getOrPut(index) {
loadString(moduleDescriptor, index)
}
}
override fun deserializeIrSymbol(proto: KotlinIr.IrSymbol): IrSymbol {
val symbolData = moduleProto.symbolTable.getSymbols(proto.index)
val symbolData = loadSymbolProto(proto.index)
return deserializeIrSymbolData(symbolData)
}
override fun deserializeIrType(proto: KotlinIr.IrTypeIndex): IrType {
val typeData = moduleProto.typeTable.getTypes(proto.index)
val typeData = loadTypeProto(proto.index)
return deserializeIrTypeData(typeData)
}
override fun deserializeString(proto: KotlinIr.String): String =
moduleProto.stringTable.getStrings(proto.index)
loadString(proto.index)
override fun deserializeLoopHeader(loopIndex: Int, loopBuilder: () -> IrLoopBase) =
moduleLoops.getOrPut(loopIndex, loopBuilder)
@@ -228,7 +250,7 @@ abstract class KotlinIrLinker(
when (deserializationStrategy) {
DeserializationStrategy.EXPLICITLY_EXPORTED -> {
fileProto.explicitlyExportedToCompilerList.forEach {
val symbolProto = moduleProto.symbolTable.getSymbols(it.index)
val symbolProto = loadSymbolProto(it.index)
reachableTopLevels.add(symbolProto.topLevelUniqId.uniqIdKey(moduleDescriptor))
}
}
@@ -293,12 +315,29 @@ abstract class KotlinIrLinker(
}
protected abstract fun reader(moduleDescriptor: ModuleDescriptor, uniqId: UniqId): ByteArray
protected abstract fun readSymbol(moduleDescriptor: ModuleDescriptor, symbolIndex: Int): ByteArray
protected abstract fun readType(moduleDescriptor: ModuleDescriptor, typeIndex: Int): ByteArray
protected abstract fun readString(moduleDescriptor: ModuleDescriptor, stringIndex: Int): ByteArray
private fun loadTopLevelDeclarationProto(uniqIdKey: UniqIdKey): KotlinIr.IrDeclaration {
val stream = reader(uniqIdKey.moduleOfOrigin!!, uniqIdKey.uniqId).codedInputStream
return KotlinIr.IrDeclaration.parseFrom(stream, newInstance())
}
private fun loadSymbolProto(moduleDescriptor: ModuleDescriptor, index: Int): KotlinIr.IrSymbolData {
val stream = readSymbol(moduleDescriptor, index).codedInputStream
return KotlinIr.IrSymbolData.parseFrom(stream, newInstance())
}
private fun loadTypeProto(moduleDescriptor: ModuleDescriptor, index: Int): KotlinIr.IrType {
val stream = readType(moduleDescriptor, index).codedInputStream
return KotlinIr.IrType.parseFrom(stream, newInstance())
}
private fun loadString(moduleDescriptor: ModuleDescriptor, index: Int): String {
return String(readString(moduleDescriptor, index))
}
private fun deserializeFileAnnotationsIfFirstUse(module: ModuleDescriptor, file: IrFile) {
val annotations = fileAnnotations[file] ?: return
file.annotations.addAll(deserializersForModules[module]!!.deserializeAnnotations(annotations))