JVM IR: decouple JvmBackendContext from intrinsic implementation
This commit is contained in:
+8
-1
@@ -8,7 +8,11 @@ package org.jetbrains.kotlin.backend.jvm
|
|||||||
import org.jetbrains.kotlin.analyzer.hasJdkCapability
|
import org.jetbrains.kotlin.analyzer.hasJdkCapability
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
|
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.*
|
import org.jetbrains.kotlin.backend.common.phaser.CompilerPhase
|
||||||
|
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||||
|
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
|
||||||
|
import org.jetbrains.kotlin.backend.common.phaser.then
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.getKtFile
|
import org.jetbrains.kotlin.backend.jvm.ir.getKtFile
|
||||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||||
import org.jetbrains.kotlin.codegen.CodegenFactory
|
import org.jetbrains.kotlin.codegen.CodegenFactory
|
||||||
@@ -29,6 +33,7 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
|||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
|
||||||
import org.jetbrains.kotlin.ir.linkage.IrProvider
|
import org.jetbrains.kotlin.ir.linkage.IrProvider
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
@@ -230,6 +235,8 @@ open class JvmIrCodegenFactory(
|
|||||||
val context = JvmBackendContext(
|
val context = JvmBackendContext(
|
||||||
state, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions, backendExtension, irSerializer,
|
state, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions, backendExtension, irSerializer,
|
||||||
)
|
)
|
||||||
|
val intrinsics by lazy { IrIntrinsicMethods(irModuleFragment.irBuiltins, context.ir.symbols) }
|
||||||
|
context.getIntrinsic = { symbol: IrFunctionSymbol -> intrinsics.getIntrinsic(symbol) }
|
||||||
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
|
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
|
||||||
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -503,7 +503,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
val builder = context.createJvmIrBuilder(expression.symbol)
|
val builder = context.createJvmIrBuilder(expression.symbol)
|
||||||
|
|
||||||
// invokeSpecial(owner: String, name: String, descriptor: String, isInterface: Boolean): T
|
// invokeSpecial(owner: String, name: String, descriptor: String, isInterface: Boolean): T
|
||||||
return builder.irCall(context.ir.symbols.jvmDebuggerInvokeSpecialIntrinsic).apply {
|
return builder.irCall(symbols.jvmDebuggerInvokeSpecialIntrinsic).apply {
|
||||||
dispatchReceiver = expression.dispatchReceiver
|
dispatchReceiver = expression.dispatchReceiver
|
||||||
this.type = expression.symbol.owner.returnType
|
this.type = expression.symbol.owner.returnType
|
||||||
putValueArgument(0, builder.irString("${owner.packageFqName}/${owner.name}"))
|
putValueArgument(0, builder.irString("${owner.packageFqName}/${owner.name}"))
|
||||||
|
|||||||
+3
-2
@@ -54,13 +54,14 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : FileL
|
|||||||
context: JvmBackendContext,
|
context: JvmBackendContext,
|
||||||
currentScope: ScopeWithIr?,
|
currentScope: ScopeWithIr?,
|
||||||
inlineScopeResolver: IrInlineScopeResolver,
|
inlineScopeResolver: IrInlineScopeResolver,
|
||||||
withSuper: Boolean, thisObjReference: IrClassSymbol?): Boolean {
|
withSuper: Boolean, thisObjReference: IrClassSymbol?,
|
||||||
|
): Boolean {
|
||||||
/// We assume that IR code that reaches us has been checked for correctness at the frontend.
|
/// We assume that IR code that reaches us has been checked for correctness at the frontend.
|
||||||
/// This function needs to single out those cases where Java accessibility rules differ from Kotlin's.
|
/// This function needs to single out those cases where Java accessibility rules differ from Kotlin's.
|
||||||
val declarationRaw = owner as IrDeclarationWithVisibility
|
val declarationRaw = owner as IrDeclarationWithVisibility
|
||||||
|
|
||||||
// If this expression won't actually result in a JVM instruction call, access modifiers don't matter.
|
// If this expression won't actually result in a JVM instruction call, access modifiers don't matter.
|
||||||
if (declarationRaw is IrFunction && (declarationRaw.isInline || context.irIntrinsics.getIntrinsic(declarationRaw.symbol) != null))
|
if (declarationRaw is IrFunction && (declarationRaw.isInline || context.getIntrinsic(declarationRaw.symbol) != null))
|
||||||
return true
|
return true
|
||||||
|
|
||||||
// Enum entry constructors are generated as package-private and are accessed only from corresponding enum class
|
// Enum entry constructors are generated as package-private and are accessed only from corresponding enum class
|
||||||
|
|||||||
+1
-1
@@ -133,7 +133,7 @@ internal class LambdaMetafactoryArgumentsBuilder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't generate references to intrinsic functions as invokedynamic (no such method exists at run-time).
|
// Don't generate references to intrinsic functions as invokedynamic (no such method exists at run-time).
|
||||||
if (context.irIntrinsics.getIntrinsic(implFun.symbol) != null) {
|
if (context.getIntrinsic(implFun.symbol) != null) {
|
||||||
functionHazard = true
|
functionHazard = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
|
interface IntrinsicMarker
|
||||||
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.common.ir.Ir
|
|||||||
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||||
import org.jetbrains.kotlin.backend.jvm.caches.BridgeLoweringCache
|
import org.jetbrains.kotlin.backend.jvm.caches.BridgeLoweringCache
|
||||||
import org.jetbrains.kotlin.backend.jvm.caches.CollectionStubComputer
|
import org.jetbrains.kotlin.backend.jvm.caches.CollectionStubComputer
|
||||||
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper
|
import org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper
|
||||||
import org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper
|
import org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
@@ -75,7 +74,7 @@ class JvmBackendContext(
|
|||||||
|
|
||||||
override val sharedVariablesManager = JvmSharedVariablesManager(state.module, ir.symbols, irBuiltIns, irFactory)
|
override val sharedVariablesManager = JvmSharedVariablesManager(state.module, ir.symbols, irBuiltIns, irFactory)
|
||||||
|
|
||||||
val irIntrinsics by lazy { IrIntrinsicMethods(irBuiltIns, ir.symbols) }
|
lateinit var getIntrinsic: (IrFunctionSymbol) -> IntrinsicMarker?
|
||||||
|
|
||||||
private val localClassType = ConcurrentHashMap<IrAttributeContainer, Type>()
|
private val localClassType = ConcurrentHashMap<IrAttributeContainer, Type>()
|
||||||
|
|
||||||
|
|||||||
+5
-8
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER
|
import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER
|
||||||
import org.jetbrains.kotlin.backend.common.lower.LoweredStatementOrigins
|
import org.jetbrains.kotlin.backend.common.lower.LoweredStatementOrigins
|
||||||
import org.jetbrains.kotlin.backend.jvm.*
|
import org.jetbrains.kotlin.backend.jvm.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
|
import org.jetbrains.kotlin.backend.jvm.intrinsics.IntrinsicMethod
|
||||||
import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty
|
import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.*
|
import org.jetbrains.kotlin.backend.jvm.ir.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.mapping.*
|
import org.jetbrains.kotlin.backend.jvm.mapping.*
|
||||||
@@ -455,11 +455,8 @@ class ExpressionCodegen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall, data: BlockInfo): PromisedValue {
|
override fun visitCall(expression: IrCall, data: BlockInfo): PromisedValue {
|
||||||
val intrinsic = classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol)
|
val intrinsic = classCodegen.context.getIntrinsic(expression.symbol) as IntrinsicMethod?
|
||||||
if (intrinsic != null) {
|
intrinsic?.invoke(expression, this, data)?.let { return it }
|
||||||
intrinsic.invoke(expression, this, data)
|
|
||||||
?.let { return it }
|
|
||||||
}
|
|
||||||
|
|
||||||
val callee = expression.symbol.owner
|
val callee = expression.symbol.owner
|
||||||
require(callee.parent is IrClass) { "Unhandled intrinsic in ExpressionCodegen: ${callee.render()}" }
|
require(callee.parent is IrClass) { "Unhandled intrinsic in ExpressionCodegen: ${callee.render()}" }
|
||||||
@@ -598,8 +595,8 @@ class ExpressionCodegen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitConstructorCall(expression: IrConstructorCall, data: BlockInfo): PromisedValue {
|
override fun visitConstructorCall(expression: IrConstructorCall, data: BlockInfo): PromisedValue {
|
||||||
classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol)
|
val intrinsic = classCodegen.context.getIntrinsic(expression.symbol) as IntrinsicMethod?
|
||||||
?.invoke(expression, this, data)?.let { return it }
|
intrinsic?.invoke(expression, this, data)?.let { return it }
|
||||||
|
|
||||||
val callee = expression.symbol.owner
|
val callee = expression.symbol.owner
|
||||||
val owner = typeMapper.mapClass(callee.constructedClass)
|
val owner = typeMapper.mapClass(callee.constructedClass)
|
||||||
|
|||||||
+6
-2
@@ -5,8 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.jvm.intrinsics
|
package org.jetbrains.kotlin.backend.jvm.intrinsics
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.IntrinsicMarker
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.codegen.MaterialValue
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.codegen.PromisedValue
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
||||||
@@ -14,7 +18,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
|||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.Method
|
import org.jetbrains.org.objectweb.asm.commons.Method
|
||||||
|
|
||||||
abstract class IntrinsicMethod {
|
abstract class IntrinsicMethod : IntrinsicMarker {
|
||||||
open fun toCallable(
|
open fun toCallable(
|
||||||
expression: IrFunctionAccessExpression,
|
expression: IrFunctionAccessExpression,
|
||||||
signature: JvmMethodSignature,
|
signature: JvmMethodSignature,
|
||||||
|
|||||||
Reference in New Issue
Block a user