From 56683ef40303170c8ead8ecb95ae64dd46c5b584 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Fri, 6 Nov 2020 19:09:03 +0700 Subject: [PATCH] [IR] Rename .symbolName and similar extension properties Convert these extensions to functions with `compute` prefix to make it obvious that they are not cheap. --- .../src/org/jetbrains/kotlin/backend/konan/Context.kt | 2 +- .../backend/konan/descriptors/ClassLayoutBuilder.kt | 4 ++-- .../kotlin/backend/konan/llvm/BinaryInterface.kt | 11 ++++++----- .../kotlin/backend/konan/llvm/CodeGenerator.kt | 2 +- .../kotlin/backend/konan/llvm/ContextUtils.kt | 5 ++--- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 2 +- .../kotlin/backend/konan/llvm/LlvmDeclarations.kt | 6 +++--- .../kotlin/backend/konan/llvm/RTTIGenerator.kt | 6 ++---- .../konan/llvm/coverage/CoverageInformation.kt | 4 ++-- .../backend/konan/llvm/coverage/LLVMCoverageWriter.kt | 2 -- .../konan/llvm/objcexport/ObjCExportCodeGenerator.kt | 4 ++-- .../backend/konan/lower/FunctionReferenceLowering.kt | 4 ++-- .../kotlin/backend/konan/lower/ReflectionSupport.kt | 4 ++-- .../kotlin/backend/konan/optimizations/DFGBuilder.kt | 4 ++-- .../kotlin/backend/konan/optimizations/DataFlowIR.kt | 11 +++++------ 15 files changed, 33 insertions(+), 38 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 7c32df1e0f3..ccffa7eeb73 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -152,7 +152,7 @@ internal class SpecialDeclarationsFactory(val context: Context) { startOffset, endOffset, DECLARATION_ORIGIN_BRIDGE_METHOD(function), IrSimpleFunctionSymbolImpl(descriptor), - "${function.functionName}".synthesizedName, + "${function.computeFunctionName()}".synthesizedName, function.visibility, function.modality, isInline = false, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt index 75e9ace5c2f..4dae07c4451 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt @@ -9,7 +9,7 @@ import llvm.LLVMStoreSizeOfType import org.jetbrains.kotlin.backend.common.ir.simpleFunctions import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.ir.* -import org.jetbrains.kotlin.backend.konan.llvm.functionName +import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName import org.jetbrains.kotlin.backend.konan.llvm.llvmType import org.jetbrains.kotlin.backend.konan.llvm.localHash import org.jetbrains.kotlin.backend.konan.lower.InnerClassLowering @@ -462,5 +462,5 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context, va private val functionIds = mutableMapOf() - private val IrFunction.uniqueId get() = functionIds.getOrPut(this) { functionName.localHash.value } + private val IrFunction.uniqueId get() = functionIds.getOrPut(this) { computeFunctionName().localHash.value } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index 3cc6ea68d6f..b68ffe1be4e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -112,14 +112,15 @@ internal val IrClass.kotlinObjCClassInfoSymbolName: String return "kobjcclassinfo:$fqNameForIrSerialization" } -val IrFunction.functionName get() = with(KonanBinaryInterface) { functionName } -val IrFunction.fullName get() = parent.fqNameForIrSerialization.child(Name.identifier(functionName)).asString() +fun IrFunction.computeFunctionName() = with(KonanBinaryInterface) { functionName } -val IrFunction.symbolName get() = with(KonanBinaryInterface) { symbolName } +fun IrFunction.computeFullName() = parent.fqNameForIrSerialization.child(Name.identifier(computeFunctionName())).asString() -val IrField.symbolName get() = with(KonanBinaryInterface) { symbolName } +fun IrFunction.computeSymbolName() = with(KonanBinaryInterface) { symbolName } -val IrClass.typeInfoSymbolName get() = with(KonanBinaryInterface) { typeInfoSymbolName } +fun IrField.computeSymbolName() = with(KonanBinaryInterface) { symbolName } + +fun IrClass.computeTypeInfoSymbolName() = with(KonanBinaryInterface) { typeInfoSymbolName } fun IrDeclaration.isExported() = KonanBinaryInterface.isExported(this) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index 54fba7661ec..932fbbe8866 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -63,7 +63,7 @@ internal class CodeGenerator(override val context: Context) : ContextUtils { private fun countParams(fn: IrFunction) = LLVMCountParams(fn.llvmFunction) fun functionEntryPointAddress(function: IrFunction) = function.entryPointAddress.llvm - fun functionHash(function: IrFunction): LLVMValueRef = function.functionName.localHash.llvm + fun functionHash(function: IrFunction): LLVMValueRef = function.computeFunctionName().localHash.llvm fun typeInfoForAllocation(constructedClass: IrClass): LLVMValueRef { assert(!constructedClass.isObjCClass()) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index 05ecc700e61..42fe7820d25 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.ir.util.isReal import org.jetbrains.kotlin.konan.library.KonanLibrary import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.library.KotlinLibrary -import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -181,7 +180,7 @@ internal interface ContextUtils : RuntimeAware { get() { assert(this.isReal) return if (isExternal(this)) { - runtime.addedLLVMExternalFunctions.getOrPut(this) { context.llvm.externalFunction(this.symbolName, getLlvmFunctionType(this), + runtime.addedLLVMExternalFunctions.getOrPut(this) { context.llvm.externalFunction(this.computeSymbolName(), getLlvmFunctionType(this), origin = this.llvmSymbolOrigin) } } else { @@ -201,7 +200,7 @@ internal interface ContextUtils : RuntimeAware { val IrClass.typeInfoPtr: ConstPointer get() { return if (isExternal(this)) { - constPointer(importGlobal(this.typeInfoSymbolName, runtime.typeInfoType, + constPointer(importGlobal(this.computeTypeInfoSymbolName(), runtime.typeInfoType, origin = this.llvmSymbolOrigin)) } else { context.llvmDeclarations.forClass(this).typeInfo diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 6897fe8715f..d4cd2c4626c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1934,7 +1934,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map { val functionNames = mutableMapOf() return context.getLayoutBuilder(irClass).methodTableEntries.map { - val functionName = it.overriddenFunction.functionName + val functionName = it.overriddenFunction.computeFunctionName() val nameSignature = functionName.localHash val previous = functionNames.putIfAbsent(nameSignature.value, it) if (previous != null) @@ -542,7 +540,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { val methods = (methodTableRecords(superClass) + methodImpls.map { (method, impl) -> assert(method.parent == irClass) - MethodTableRecord(method.functionName.localHash, impl.bitcast(int8TypePtr)) + MethodTableRecord(method.computeFunctionName().localHash, impl.bitcast(int8TypePtr)) }).sortedBy { it.nameSignature.value }.also { assert(it.distinctBy { it.nameSignature.value } == it) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt index c318cdebaaa..07ecae2fbe9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.backend.konan.llvm.coverage import org.jetbrains.kotlin.backend.common.ir.ir2string import org.jetbrains.kotlin.backend.konan.llvm.column import org.jetbrains.kotlin.backend.konan.llvm.line -import org.jetbrains.kotlin.backend.konan.llvm.symbolName +import org.jetbrains.kotlin.backend.konan.llvm.computeSymbolName import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrFile @@ -87,7 +87,7 @@ class FunctionRegions( val structuralHash: Long = 0 override fun toString(): String = buildString { - appendLine("${function.symbolName} regions:") + appendLine("${function.computeSymbolName()} regions:") regions.forEach { (irElem, region) -> appendLine("${ir2string(irElem)} -> ($region)") } } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt index 4e28b9f5fea..886754ed2b8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt @@ -8,9 +8,7 @@ import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.llvm.name -import org.jetbrains.kotlin.backend.konan.llvm.symbolName import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.name import org.jetbrains.kotlin.ir.declarations.path import org.jetbrains.kotlin.konan.file.File diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index b1a25250c97..322f1926e60 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -1342,13 +1342,13 @@ private fun ObjCExportCodeGenerator.createReverseAdapters( inherited.forEach { presentVtableBridges += vtableIndex(it) - presentMethodTableBridges += it.functionName + presentMethodTableBridges += it.computeFunctionName() presentItableBridges += itablePlace(it) } uninherited.forEach { val vtableIndex = vtableIndex(it) - val functionName = it.functionName + val functionName = it.computeFunctionName() val itablePlace = itablePlace(it) if (vtableIndex !in presentVtableBridges || functionName !in presentMethodTableBridges diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt index 51ec2a03f98..f6d39c27c8a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.backend.common.pop import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName -import org.jetbrains.kotlin.backend.konan.llvm.fullName +import org.jetbrains.kotlin.backend.konan.llvm.computeFullName import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor @@ -374,7 +374,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass val receiver = if (needReceiver) irGet(valueParameters.single()) else irNull() val arity = unboundFunctionParameters.size + if (functionReferenceTarget.isSuspend) 1 else 0 putValueArgument(0, irString(name.asString())) - putValueArgument(1, irString(functionReferenceTarget.fullName)) + putValueArgument(1, irString(functionReferenceTarget.computeFullName())) putValueArgument(2, receiver) putValueArgument(3, irInt(arity)) putValueArgument(4, irInt(getFlags())) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt index 088766b8151..8364b0eb0e7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.backend.konan.KonanBackendContext import org.jetbrains.kotlin.backend.konan.ir.typeWithStarProjections import org.jetbrains.kotlin.backend.konan.ir.typeWithoutArguments import org.jetbrains.kotlin.backend.konan.isObjCClass -import org.jetbrains.kotlin.backend.konan.llvm.fullName +import org.jetbrains.kotlin.backend.konan.llvm.computeFullName import org.jetbrains.kotlin.backend.konan.reportCompilationError import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.ir.IrElement @@ -122,7 +122,7 @@ internal class KTypeGenerator( } private val IrTypeParameter.parentUniqueName get() = when (val parent = parent) { - is IrFunction -> parent.fullName + is IrFunction -> parent.computeFullName() else -> parent.fqNameForIrSerialization.asString() } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index b906b3ec31a..abe1a7f1f58 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions import org.jetbrains.kotlin.backend.konan.ir.* -import org.jetbrains.kotlin.backend.konan.llvm.functionName +import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName import org.jetbrains.kotlin.backend.konan.llvm.localHash import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -786,7 +786,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag } } if (owner.isInterface) { - val calleeHash = callee.functionName.localHash.value + val calleeHash = callee.computeFunctionName().localHash.value DataFlowIR.Node.ItableCall( symbolTable.mapFunction(callee.target), receiverType, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index 30644c322b5..ac6f9c5b9cb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -10,13 +10,12 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract import org.jetbrains.kotlin.backend.konan.descriptors.isBuiltInOperator import org.jetbrains.kotlin.backend.common.ir.allParameters import org.jetbrains.kotlin.backend.konan.ir.isOverridableOrOverrides -import org.jetbrains.kotlin.backend.konan.llvm.functionName +import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName +import org.jetbrains.kotlin.backend.konan.llvm.computeSymbolName import org.jetbrains.kotlin.backend.konan.llvm.isExported import org.jetbrains.kotlin.backend.konan.llvm.localHash -import org.jetbrains.kotlin.backend.konan.llvm.symbolName 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.Function.Companion.appendCastTo import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrElement @@ -507,7 +506,7 @@ internal object DataFlowIR { mapFunction(it.getImplementation(context)!!) } layoutBuilder.methodTableEntries.forEach { - type.itable[it.overriddenFunction.functionName.localHash.value] = mapFunction(it.getImplementation(context)!!) + type.itable[it.overriddenFunction.computeFunctionName().localHash.value] = mapFunction(it.getImplementation(context)!!) } } else if (irClass.isInterface) { // Warmup interface table so it is computed before DCE. @@ -565,7 +564,7 @@ internal object DataFlowIR { val containingDeclarationPart = parent.fqNameForIrSerialization.let { if (it.isRoot) "" else "$it." } - val name = "kfun:$containingDeclarationPart${it.functionName}" + val name = "kfun:$containingDeclarationPart${it.computeFunctionName()}" val returnsUnit = it is IrConstructor || (!it.isSuspend && it.returnType.isUnit()) val returnsNothing = !it.isSuspend && it.returnType.isNothing() @@ -639,7 +638,7 @@ internal object DataFlowIR { assert(irField.parent !is IrClass) { "All local properties initializers should've been lowered" } val attributes = FunctionAttributes.IS_GLOBAL_INITIALIZER or FunctionAttributes.RETURNS_UNIT - val symbol = FunctionSymbol.Private(privateFunIndex++, module, -1, attributes, null, null, takeName { "${irField.symbolName}_init" }) + val symbol = FunctionSymbol.Private(privateFunIndex++, module, -1, attributes, null, null, takeName { "${irField.computeSymbolName()}_init" }) functionMap[irField] = symbol