DFG: Added number of parameters to a function’s symbol

This commit is contained in:
Igor Chevdar
2017-12-14 23:43:22 +03:00
parent 013a4abba3
commit 07a7968869
2 changed files with 46 additions and 31 deletions
@@ -260,33 +260,36 @@ internal object DFGSerializer {
} }
} }
class ExternalFunctionSymbol(val hash: Long, val name: String?) { class ExternalFunctionSymbol(val hash: Long, val numberOfParameters: Int, val name: String?) {
constructor(data: ArraySlice) : this(data.readLong(), data.readNullableString())
fun write(result: ArraySlice) {
result.writeLong(hash)
result.writeNullableString(name)
}
}
class PublicFunctionSymbol(val hash: Long, val index: Int, val name: String?) {
constructor(data: ArraySlice) : this(data.readLong(), data.readInt(), data.readNullableString()) constructor(data: ArraySlice) : this(data.readLong(), data.readInt(), data.readNullableString())
fun write(result: ArraySlice) { fun write(result: ArraySlice) {
result.writeLong(hash) result.writeLong(hash)
result.writeInt(numberOfParameters)
result.writeNullableString(name)
}
}
class PublicFunctionSymbol(val hash: Long, val numberOfParameters: Int, val index: Int, val name: String?) {
constructor(data: ArraySlice) : this(data.readLong(), data.readInt(), data.readInt(), data.readNullableString())
fun write(result: ArraySlice) {
result.writeLong(hash)
result.writeInt(numberOfParameters)
result.writeInt(index) result.writeInt(index)
result.writeNullableString(name) result.writeNullableString(name)
} }
} }
class PrivateFunctionSymbol(val index: Int, val name: String?) { class PrivateFunctionSymbol(val index: Int, val numberOfParameters: Int, val name: String?) {
constructor(data: ArraySlice) : this(data.readInt(), data.readNullableString()) constructor(data: ArraySlice) : this(data.readInt(), data.readInt(), data.readNullableString())
fun write(result: ArraySlice) { fun write(result: ArraySlice) {
result.writeInt(index) result.writeInt(index)
result.writeInt(numberOfParameters)
result.writeNullableString(name) result.writeNullableString(name)
} }
} }
@@ -308,11 +311,14 @@ internal object DFGSerializer {
} }
companion object { companion object {
fun external(hash: Long, name: String?) = FunctionSymbol(ExternalFunctionSymbol(hash, name), null, null) fun external(hash: Long, numberOfParameters: Int, name: String?) =
FunctionSymbol(ExternalFunctionSymbol(hash, numberOfParameters, name), null, null)
fun public(hash: Long, index: Int, name: String?) = FunctionSymbol(null, PublicFunctionSymbol(hash, index, name), null) fun public(hash: Long, numberOfParameters: Int, index: Int, name: String?) =
FunctionSymbol(null, PublicFunctionSymbol(hash, numberOfParameters, index, name), null)
fun private(index: Int, name: String?) = FunctionSymbol(null, null, PrivateFunctionSymbol(index, name)) fun private(index: Int, numberOfParameters: Int, name: String?) =
FunctionSymbol(null, null, PrivateFunctionSymbol(index, numberOfParameters, name))
fun read(data: ArraySlice): FunctionSymbol { fun read(data: ArraySlice): FunctionSymbol {
val tag = data.readByte().toInt() val tag = data.readByte().toInt()
@@ -663,15 +669,17 @@ internal object DFGSerializer {
.sortedBy { it.value } .sortedBy { it.value }
.map { .map {
val functionSymbol = it.key val functionSymbol = it.key
val numberOfParameters = functionSymbol.numberOfParameters
val name = functionSymbol.name
when (functionSymbol) { when (functionSymbol) {
is DataFlowIR.FunctionSymbol.External -> is DataFlowIR.FunctionSymbol.External ->
FunctionSymbol.external(functionSymbol.hash, functionSymbol.name) FunctionSymbol.external(functionSymbol.hash, numberOfParameters, name)
is DataFlowIR.FunctionSymbol.Public -> is DataFlowIR.FunctionSymbol.Public ->
FunctionSymbol.public(functionSymbol.hash, functionSymbol.symbolTableIndex, functionSymbol.name) FunctionSymbol.public(functionSymbol.hash, numberOfParameters, functionSymbol.symbolTableIndex, name)
is DataFlowIR.FunctionSymbol.Private -> is DataFlowIR.FunctionSymbol.Private ->
FunctionSymbol.private(functionSymbol.symbolTableIndex, functionSymbol.name) FunctionSymbol.private(functionSymbol.symbolTableIndex, numberOfParameters, name)
else -> error("Unknown function symbol $functionSymbol") else -> error("Unknown function symbol $functionSymbol")
} }
@@ -806,13 +814,14 @@ internal object DFGSerializer {
val public = it.public val public = it.public
val private = it.private val private = it.private
when { when {
external != null -> DataFlowIR.FunctionSymbol.External(external.hash, external.name) external != null ->
DataFlowIR.FunctionSymbol.External(external.hash, external.numberOfParameters, external.name)
public != null -> { public != null -> {
val symbolTableIndex = public.index val symbolTableIndex = public.index
if (symbolTableIndex >= 0) if (symbolTableIndex >= 0)
++module.numberOfFunctions ++module.numberOfFunctions
DataFlowIR.FunctionSymbol.Public(public.hash, module, symbolTableIndex, public.name).also { DataFlowIR.FunctionSymbol.Public(public.hash, public.numberOfParameters, module, symbolTableIndex, public.name).also {
publicFunctionsMap.put(it.hash, it) publicFunctionsMap.put(it.hash, it)
} }
} }
@@ -821,7 +830,7 @@ internal object DFGSerializer {
val symbolTableIndex = private!!.index val symbolTableIndex = private!!.index
if (symbolTableIndex >= 0) if (symbolTableIndex >= 0)
++module.numberOfFunctions ++module.numberOfFunctions
DataFlowIR.FunctionSymbol.Private(privateFunIndex++, module, symbolTableIndex, private.name) DataFlowIR.FunctionSymbol.Private(privateFunIndex++, private.numberOfParameters, module, symbolTableIndex, private.name)
} }
} }
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.backend.konan.optimizations package org.jetbrains.kotlin.backend.konan.optimizations
import org.jetbrains.kotlin.backend.common.descriptors.allParameters
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.externalOrIntrinsic import org.jetbrains.kotlin.backend.konan.descriptors.externalOrIntrinsic
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
@@ -93,8 +94,9 @@ internal object DataFlowIR {
var numberOfFunctions = 0 var numberOfFunctions = 0
} }
abstract class FunctionSymbol { abstract class FunctionSymbol(val numberOfParameters: Int, val name: String?) {
class External(val hash: Long, val name: String? = null) : FunctionSymbol() { class External(val hash: Long, numberOfParameters: Int, name: String? = null)
: FunctionSymbol(numberOfParameters, name) {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (other !is External) return false if (other !is External) return false
@@ -111,9 +113,11 @@ internal object DataFlowIR {
} }
} }
abstract class Declared(val module: Module, val symbolTableIndex: Int) : FunctionSymbol() abstract class Declared(numberOfParameters: Int, val module: Module, val symbolTableIndex: Int, name: String?)
: FunctionSymbol(numberOfParameters, name)
class Public(val hash: Long, module: Module, symbolTableIndex: Int, val name: String? = null) : Declared(module, symbolTableIndex) { class Public(val hash: Long, numberOfParameters: Int, module: Module, symbolTableIndex: Int, name: String? = null)
: Declared(numberOfParameters, module, symbolTableIndex, name) {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (other !is Public) return false if (other !is Public) return false
@@ -130,7 +134,8 @@ internal object DataFlowIR {
} }
} }
class Private(val index: Int, module: Module, symbolTableIndex: Int, val name: String? = null) : Declared(module, symbolTableIndex) { class Private(val index: Int, numberOfParameters: Int, module: Module, symbolTableIndex: Int, name: String? = null)
: Declared(numberOfParameters, module, symbolTableIndex, name) {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (other !is Private) return false if (other !is Private) return false
@@ -412,12 +417,13 @@ internal object DataFlowIR {
functionMap.getOrPut(it) { functionMap.getOrPut(it) {
when (it) { when (it) {
is PropertyDescriptor -> is PropertyDescriptor ->
FunctionSymbol.Private(privateFunIndex++, module, -1, takeName { "${it.symbolName}_init" }) FunctionSymbol.Private(privateFunIndex++, 0, module, -1, takeName { "${it.symbolName}_init" })
is FunctionDescriptor -> { is FunctionDescriptor -> {
val name = if (it.isExported()) it.symbolName else it.internalName val name = if (it.isExported()) it.symbolName else it.internalName
val numberOfParameters = it.allParameters.size + if (it.isSuspend) 1 else 0
if (it.module != irModule.descriptor || it.externalOrIntrinsic()) if (it.module != irModule.descriptor || it.externalOrIntrinsic())
FunctionSymbol.External(name.localHash.value, takeName { name }) FunctionSymbol.External(name.localHash.value, numberOfParameters, takeName { name })
else { else {
val isAbstract = it.modality == Modality.ABSTRACT val isAbstract = it.modality == Modality.ABSTRACT
val classDescriptor = it.containingDeclaration as? ClassDescriptor val classDescriptor = it.containingDeclaration as? ClassDescriptor
@@ -428,9 +434,9 @@ internal object DataFlowIR {
++module.numberOfFunctions ++module.numberOfFunctions
val symbolTableIndex = if (!placeToFunctionsTable) -1 else couldBeCalledVirtuallyIndex++ val symbolTableIndex = if (!placeToFunctionsTable) -1 else couldBeCalledVirtuallyIndex++
if (it.isExported()) if (it.isExported())
FunctionSymbol.Public(name.localHash.value, module, symbolTableIndex, takeName { name }) FunctionSymbol.Public(name.localHash.value, numberOfParameters, module, symbolTableIndex, takeName { name })
else else
FunctionSymbol.Private(privateFunIndex++, module, symbolTableIndex, takeName { name }) FunctionSymbol.Private(privateFunIndex++, numberOfParameters, module, symbolTableIndex, takeName { name })
} }
} }