IR: fixes for IR by-file copying
This commit is contained in:
+2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.builders.irString
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
|
|
||||||
interface LoggingContext {
|
interface LoggingContext {
|
||||||
@@ -40,6 +41,7 @@ interface CommonBackendContext : BackendContext, LoggingContext {
|
|||||||
|
|
||||||
// Adjust internal structures after a deep copy of some declarations.
|
// Adjust internal structures after a deep copy of some declarations.
|
||||||
fun handleDeepCopy(
|
fun handleDeepCopy(
|
||||||
|
fileSymbolMap: MutableMap<IrFileSymbol, IrFileSymbol>,
|
||||||
classSymbolMap: MutableMap<IrClassSymbol, IrClassSymbol>,
|
classSymbolMap: MutableMap<IrClassSymbol, IrClassSymbol>,
|
||||||
functionSymbolMap: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
functionSymbolMap: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
||||||
) {}
|
) {}
|
||||||
|
|||||||
+14
-2
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
|||||||
import org.jetbrains.kotlin.backend.common.lower
|
import org.jetbrains.kotlin.backend.common.lower
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.ir.expressions.IrCall
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
|
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
|
||||||
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
|
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
|
||||||
@@ -166,12 +168,13 @@ private class PerformByIrFilePhase<Context : CommonBackendContext>(
|
|||||||
// We can only report one exception through ISE
|
// We can only report one exception through ISE
|
||||||
val thrownFromThread = AtomicReference<Pair<Throwable, IrFile>?>(null)
|
val thrownFromThread = AtomicReference<Pair<Throwable, IrFile>?>(null)
|
||||||
|
|
||||||
|
val remappedFiles = mutableMapOf<IrFileSymbol, IrFileSymbol>()
|
||||||
val remappedFunctions = mutableMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
|
val remappedFunctions = mutableMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
|
||||||
val remappedClasses = mutableMapOf<IrClassSymbol, IrClassSymbol>()
|
val remappedClasses = mutableMapOf<IrClassSymbol, IrClassSymbol>()
|
||||||
|
|
||||||
// Each thread needs its own copy of phaserState.alreadyDone
|
// Each thread needs its own copy of phaserState.alreadyDone
|
||||||
val filesAndStates = input.files.map {
|
val filesAndStates = input.files.map {
|
||||||
it.copySavingMappings(remappedFunctions, remappedClasses) to phaserState.copyOf()
|
it.copySavingMappings(remappedFiles, remappedFunctions, remappedClasses) to phaserState.copyOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
val executor = Executors.newFixedThreadPool(nThreads)
|
val executor = Executors.newFixedThreadPool(nThreads)
|
||||||
@@ -201,8 +204,8 @@ private class PerformByIrFilePhase<Context : CommonBackendContext>(
|
|||||||
input.files.addAll(filesAndStates.map { (irFile, _) -> irFile }.toMutableList())
|
input.files.addAll(filesAndStates.map { (irFile, _) -> irFile }.toMutableList())
|
||||||
|
|
||||||
adjustDefaultArgumentStubs(context, remappedFunctions)
|
adjustDefaultArgumentStubs(context, remappedFunctions)
|
||||||
|
context.handleDeepCopy(remappedFiles, remappedClasses, remappedFunctions)
|
||||||
input.transformChildrenVoid(CrossFileCallAdjuster(remappedFunctions))
|
input.transformChildrenVoid(CrossFileCallAdjuster(remappedFunctions))
|
||||||
context.handleDeepCopy(remappedClasses, remappedFunctions)
|
|
||||||
|
|
||||||
// TODO: no guarantee that module identity is preserved by `lower`
|
// TODO: no guarantee that module identity is preserved by `lower`
|
||||||
return input
|
return input
|
||||||
@@ -283,6 +286,7 @@ fun <Context : CommonBackendContext, OldData, NewData> transform(op: (OldData) -
|
|||||||
// We need to remap inline function calls after lowering files
|
// We need to remap inline function calls after lowering files
|
||||||
|
|
||||||
fun IrFile.copySavingMappings(
|
fun IrFile.copySavingMappings(
|
||||||
|
remappedFiles: MutableMap<IrFileSymbol, IrFileSymbol>,
|
||||||
remappedFunctions: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>,
|
remappedFunctions: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>,
|
||||||
remappedClasses: MutableMap<IrClassSymbol, IrClassSymbol>,
|
remappedClasses: MutableMap<IrClassSymbol, IrClassSymbol>,
|
||||||
): IrFile {
|
): IrFile {
|
||||||
@@ -297,6 +301,8 @@ fun IrFile.copySavingMappings(
|
|||||||
remappedClasses[klass] = symbolRemapper.getReferencedClass(klass)
|
remappedClasses[klass] = symbolRemapper.getReferencedClass(klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remappedFiles[symbol] = newIrFile.symbol
|
||||||
|
|
||||||
return newIrFile
|
return newIrFile
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,6 +337,12 @@ fun adjustDefaultArgumentStubs(
|
|||||||
private class CrossFileCallAdjuster(
|
private class CrossFileCallAdjuster(
|
||||||
val remappedFunctions: Map<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
val remappedFunctions: Map<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
||||||
) : IrElementTransformerVoid() {
|
) : IrElementTransformerVoid() {
|
||||||
|
|
||||||
|
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
|
||||||
|
declaration.overriddenSymbols = declaration.overriddenSymbols.map { remappedFunctions[it] ?: it }
|
||||||
|
return super.visitSimpleFunction(declaration)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
return remappedFunctions[expression.symbol]?.let { newSymbol ->
|
return remappedFunctions[expression.symbol]?.let { newSymbol ->
|
||||||
|
|||||||
@@ -155,9 +155,18 @@ class JvmBackendContext(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun handleDeepCopy(
|
override fun handleDeepCopy(
|
||||||
|
fileSymbolMap: MutableMap<IrFileSymbol, IrFileSymbol>,
|
||||||
classSymbolMap: MutableMap<IrClassSymbol, IrClassSymbol>,
|
classSymbolMap: MutableMap<IrClassSymbol, IrClassSymbol>,
|
||||||
functionSymbolMap: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
functionSymbolMap: MutableMap<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
|
||||||
) {
|
) {
|
||||||
|
for ((oldFileSymbol, newFileSymbol) in fileSymbolMap) {
|
||||||
|
val psiFileEntry = psiSourceManager.getFileEntry(oldFileSymbol.owner) as? PsiSourceManager.PsiFileEntry ?: continue
|
||||||
|
psiSourceManager.putFileEntry(
|
||||||
|
newFileSymbol.owner,
|
||||||
|
psiFileEntry
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val oldClassesWithNameOverride = classNameOverride.keys.toList()
|
val oldClassesWithNameOverride = classNameOverride.keys.toList()
|
||||||
for (klass in oldClassesWithNameOverride) {
|
for (klass in oldClassesWithNameOverride) {
|
||||||
classSymbolMap[klass.symbol]?.let { newSymbol ->
|
classSymbolMap[klass.symbol]?.let { newSymbol ->
|
||||||
@@ -170,7 +179,29 @@ class JvmBackendContext(
|
|||||||
multifileFacade.setValue(newPartClasses.toMutableList())
|
multifileFacade.setValue(newPartClasses.toMutableList())
|
||||||
}
|
}
|
||||||
|
|
||||||
super.handleDeepCopy(classSymbolMap, functionSymbolMap)
|
for ((staticReplacement, original) in inlineClassReplacements.originalFunctionForStaticReplacement) {
|
||||||
|
val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue
|
||||||
|
val newStaticReplacement = inlineClassReplacements.getReplacementFunction(newOriginal) ?: continue
|
||||||
|
staticReplacement as IrSimpleFunction
|
||||||
|
functionSymbolMap[staticReplacement.symbol] = newStaticReplacement.symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
for ((original, suspendView) in suspendFunctionOriginalToView) {
|
||||||
|
val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue
|
||||||
|
val newSuspendView = suspendFunctionOriginalToView[newOriginal] ?: continue
|
||||||
|
suspendView as? IrSimpleFunction ?: continue
|
||||||
|
newSuspendView as? IrSimpleFunction ?: continue
|
||||||
|
functionSymbolMap[suspendView.symbol] = newSuspendView.symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
for ((nonStaticDefaultSymbol, staticDefault) in staticDefaultStubs) {
|
||||||
|
val staticDefaultSymbol = staticDefault.symbol
|
||||||
|
val newNonStaticDefaultSymbol = functionSymbolMap[nonStaticDefaultSymbol] ?: continue
|
||||||
|
val newStaticDefaultSymbol = staticDefaultStubs[newNonStaticDefaultSymbol]?.symbol ?: continue
|
||||||
|
functionSymbolMap[staticDefaultSymbol] = newStaticDefaultSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
super.handleDeepCopy(fileSymbolMap, classSymbolMap, functionSymbolMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class JvmIr(
|
inner class JvmIr(
|
||||||
|
|||||||
Reference in New Issue
Block a user