IR: Handle exceptions from by-file lowering thread
This commit is contained in:
+15
-2
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
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 java.lang.IllegalStateException
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
// Phase composition.
|
// Phase composition.
|
||||||
@@ -145,7 +146,14 @@ private class PerformByIrFilePhase<Context : CommonBackendContext>(
|
|||||||
private fun invokeParallel(
|
private fun invokeParallel(
|
||||||
phaseConfig: PhaseConfig, phaserState: PhaserState<IrModuleFragment>, context: Context, input: IrModuleFragment
|
phaseConfig: PhaseConfig, phaserState: PhaserState<IrModuleFragment>, context: Context, input: IrModuleFragment
|
||||||
): IrModuleFragment {
|
): IrModuleFragment {
|
||||||
val threads = input.files.map { irFile ->
|
if (input.files.isEmpty()) return input
|
||||||
|
|
||||||
|
// We can only report one exception through ISE
|
||||||
|
var thrownFromThread: Throwable? = null
|
||||||
|
|
||||||
|
// Each thread needs its own copy of phaserState.alreadyDone
|
||||||
|
val filesAndStates = input.files.map { it to phaserState.clone() }
|
||||||
|
val threads = filesAndStates.map { (irFile, state) ->
|
||||||
thread {
|
thread {
|
||||||
try {
|
try {
|
||||||
val filePhaserState = state.changeType<IrModuleFragment, IrFile>()
|
val filePhaserState = state.changeType<IrModuleFragment, IrFile>()
|
||||||
@@ -153,13 +161,18 @@ private class PerformByIrFilePhase<Context : CommonBackendContext>(
|
|||||||
phase.invoke(phaseConfig, filePhaserState, context, irFile)
|
phase.invoke(phaseConfig, filePhaserState, context, irFile)
|
||||||
}
|
}
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
CodegenUtil.reportBackendException(e, "IR lowering", irFile.fileEntry.name)
|
thrownFromThread = e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
threads.forEach { it.join() }
|
threads.forEach { it.join() }
|
||||||
|
|
||||||
|
if (thrownFromThread != null) throw IllegalStateException("Exception in file lowering", thrownFromThread)
|
||||||
|
|
||||||
|
// Presumably each thread has run through the same list of phases.
|
||||||
|
phaserState.alreadyDone.addAll(filesAndStates[0].second.alreadyDone)
|
||||||
|
|
||||||
// TODO: no guarantee that module identity is preserved by `lower`
|
// TODO: no guarantee that module identity is preserved by `lower`
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user