DFG: Added number of parameters to a function’s symbol
This commit is contained in:
+31
-22
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-9
@@ -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 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user