[IR] Rename .symbolName and similar extension properties

Convert these extensions to functions with `compute` prefix to make it obvious that they are not cheap.
This commit is contained in:
Sergey Bogolepov
2020-11-06 19:09:03 +07:00
committed by Stanislav Erokhin
parent f22d84c07b
commit 56683ef403
15 changed files with 33 additions and 38 deletions
@@ -152,7 +152,7 @@ internal class SpecialDeclarationsFactory(val context: Context) {
startOffset, endOffset,
DECLARATION_ORIGIN_BRIDGE_METHOD(function),
IrSimpleFunctionSymbolImpl(descriptor),
"<bridge-$bridgeDirections>${function.functionName}".synthesizedName,
"<bridge-$bridgeDirections>${function.computeFunctionName()}".synthesizedName,
function.visibility,
function.modality,
isInline = false,
@@ -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<IrFunction, Long>()
private val IrFunction.uniqueId get() = functionIds.getOrPut(this) { functionName.localHash.value }
private val IrFunction.uniqueId get() = functionIds.getOrPut(this) { computeFunctionName().localHash.value }
}
@@ -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)
@@ -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())
@@ -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
@@ -1934,7 +1934,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
scope.members.add(DICreateMemberType(
refBuilder = context.debugInfo.builder,
refScope = scope.scope as DIScopeOpaqueRef,
name = expression.symbolName,
name = expression.computeSymbolName(),
file = irFile.file(),
lineNum = expression.startLine(),
sizeInBits = sizeInBits,
@@ -163,7 +163,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
val typeInfoGlobal: StaticData.Global
val typeInfoSymbolName = if (declaration.isExported()) {
declaration.typeInfoSymbolName
declaration.computeTypeInfoSymbolName()
} else {
"ktype:$internalName"
}
@@ -348,14 +348,14 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|| (declaration.isAccessor && declaration.isFromInteropLibrary())
|| declaration.annotations.hasAnnotation(RuntimeNames.cCall)) return
context.llvm.externalFunction(declaration.symbolName, llvmFunctionType,
context.llvm.externalFunction(declaration.computeSymbolName(), llvmFunctionType,
// Assume that `external fun` is defined in native libs attached to this module:
origin = declaration.llvmSymbolOrigin,
independent = declaration.hasAnnotation(RuntimeNames.independent)
)
} else {
val symbolName = if (declaration.isExported()) {
declaration.symbolName.also {
declaration.computeSymbolName().also {
if (declaration.name.asString() != "main") {
assert(LLVMGetNamedFunction(context.llvm.llvmModule, it) == null) { it }
} else {
@@ -12,14 +12,12 @@ import org.jetbrains.kotlin.backend.konan.descriptors.*
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.isExternalObjCClassMethod
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.isPublicApi
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.isAnnotationClass
import org.jetbrains.kotlin.ir.util.isInterface
import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.name.FqName
internal class RTTIGenerator(override val context: Context) : ContextUtils {
@@ -327,7 +325,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
fun methodTableRecords(irClass: IrClass): List<MethodTableRecord> {
val functionNames = mutableMapOf<Long, OverriddenFunctionInfo>()
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)
}
@@ -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)") }
}
}
@@ -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
@@ -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
@@ -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()))
@@ -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()
}
@@ -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,
@@ -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