Added names to private functions and types

This commit is contained in:
Igor Chevdar
2018-06-08 12:24:21 +03:00
committed by Pavel Punegov
parent 0927dfd070
commit b8340ead91
6 changed files with 20 additions and 16 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.backend.konan.library.LinkData
import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget
import org.jetbrains.kotlin.backend.konan.optimizations.DataFlowIR
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
@@ -279,8 +280,8 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
var phase: KonanPhase? = null
var depth: Int = 0
lateinit var privateFunctions: List<IrFunction>
lateinit var privateClasses: List<IrClass>
lateinit var privateFunctions: List<Pair<IrFunction, DataFlowIR.FunctionSymbol.Declared>>
lateinit var privateClasses: List<Pair<IrClass, DataFlowIR.Type.Declared>>
// Cache used for source offset->(line,column) mapping.
val fileEntryCache = mutableMapOf<String, SourceManager.FileEntry>()
@@ -230,6 +230,7 @@ internal interface IrPrivateClassReference : IrClassReference {
val moduleDescriptor: ModuleDescriptor
val totalClasses: Int
val classIndex: Int
val dfgSymbol: DataFlowIR.Type.Declared
}
internal class IrPrivateClassReferenceImpl(startOffset: Int,
@@ -239,7 +240,8 @@ internal class IrPrivateClassReferenceImpl(startOffset: Int,
override val classType: KotlinType,
override val moduleDescriptor: ModuleDescriptor,
override val totalClasses: Int,
override val classIndex: Int
override val classIndex: Int,
override val dfgSymbol: DataFlowIR.Type.Declared
) : IrPrivateClassReference,
IrTerminalDeclarationReferenceBase<IrClassifierSymbol, ClassifierDescriptor>(
startOffset, endOffset, type,
@@ -300,9 +300,9 @@ internal val ClassDescriptor.objectInstanceShadowFieldSymbolName: String
internal val ClassDescriptor.typeInfoHasVtableAttached: Boolean
get() = !this.isAbstract() && !this.isExternalObjCClass()
internal fun ModuleDescriptor.privateFunctionSymbolName(index: Int) = "private_functions_${name.asString()}_$index"
internal fun ModuleDescriptor.privateFunctionSymbolName(index: Int, functionName: String?) = "private_functions_${name.asString()}_${functionName}_$index"
internal fun ModuleDescriptor.privateClassSymbolName(index: Int) = "private_classes_${name.asString()}_$index"
internal fun ModuleDescriptor.privateClassSymbolName(index: Int, className: String?) = "private_classes_${name.asString()}_${className}_$index"
internal val String.moduleConstructorName
get() = "_Konan_init_${this}"
@@ -94,12 +94,12 @@ internal fun emitLLVM(context: Context) {
val privateFunctions = moduleDFG!!.symbolTable.getPrivateFunctionsTableForExport()
privateFunctions.forEachIndexed { index, it ->
val function = codegenVisitor.codegen.llvmFunction(it)
val function = codegenVisitor.codegen.llvmFunction(it.first)
LLVMAddAlias(
context.llvmModule,
function.type,
function,
irModule.descriptor.privateFunctionSymbolName(index)
irModule.descriptor.privateFunctionSymbolName(index, it.second.name)
)!!
}
context.privateFunctions = privateFunctions
@@ -107,12 +107,12 @@ internal fun emitLLVM(context: Context) {
val privateClasses = moduleDFG!!.symbolTable.getPrivateClassesTableForExport()
privateClasses.forEachIndexed { index, it ->
val typeInfoPtr = codegenVisitor.codegen.typeInfoValue(it)
val typeInfoPtr = codegenVisitor.codegen.typeInfoValue(it.first)
LLVMAddAlias(
context.llvmModule,
typeInfoPtr.type,
typeInfoPtr,
irModule.descriptor.privateClassSymbolName(index)
irModule.descriptor.privateClassSymbolName(index, it.second.name)
)!!
}
context.privateClasses = privateClasses
@@ -2019,10 +2019,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
val dfgSymbol = callee.dfgSymbol
val functionIndex = callee.functionIndex
val function = if (callee.moduleDescriptor == context.irModule!!.descriptor) {
codegen.llvmFunction(context.privateFunctions[functionIndex])
codegen.llvmFunction(context.privateFunctions[functionIndex].first)
} else {
context.llvm.externalFunction(
callee.moduleDescriptor.privateFunctionSymbolName(functionIndex),
callee.moduleDescriptor.privateFunctionSymbolName(functionIndex, callee.dfgSymbol.name),
codegen.getLlvmFunctionType(dfgSymbol),
callee.moduleDescriptor.llvmSymbolOrigin
@@ -2036,10 +2036,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
private fun evaluatePrivateClassReference(classReference: IrPrivateClassReference): LLVMValueRef {
val classIndex = classReference.classIndex
val typeInfoPtr = if (classReference.moduleDescriptor == context.irModule!!.descriptor) {
codegen.typeInfoValue(context.privateClasses[classIndex])
codegen.typeInfoValue(context.privateClasses[classIndex].first)
} else {
codegen.importGlobal(
classReference.moduleDescriptor.privateClassSymbolName(classIndex),
classReference.moduleDescriptor.privateClassSymbolName(classIndex, classReference.dfgSymbol.name),
codegen.kTypeInfo,
classReference.moduleDescriptor.llvmSymbolOrigin
)
@@ -637,7 +637,7 @@ internal object DataFlowIR {
assert((entry.value as DataFlowIR.FunctionSymbol.Declared).symbolTableIndex == index) { "Inconsistent function table" }
}
}
.map { it.key as FunctionDescriptor }
.map { (it.key as FunctionDescriptor) to (it.value as DataFlowIR.FunctionSymbol.Declared) }
.toList()
fun getPrivateClassesTableForExport() =
@@ -650,7 +650,7 @@ internal object DataFlowIR {
assert((entry.value as DataFlowIR.Type.Declared).symbolTableIndex == index) { "Inconsistent class table" }
}
}
.map { it.key }
.map { it.key to (it.value as DataFlowIR.Type.Declared) }
.toList()
}
}
@@ -1191,7 +1191,8 @@ internal object Devirtualization {
classType = receiver.type,
moduleDescriptor = actualReceiverType.module!!.descriptor,
totalClasses = actualReceiverType.module.numberOfClasses,
classIndex = actualReceiverType.symbolTableIndex)
classIndex = actualReceiverType.symbolTableIndex,
dfgSymbol = actualReceiverType)
val condition =
if (optimize && index == possibleCallees.size - 1)
irTrue() // Don't check last type in optimize mode.