Run inlining phase against whole module
It is wrong to run inlining phase file by file, because other lowerings could modify inline function before it had been inlined.
This commit is contained in:
+14
-3
@@ -21,21 +21,32 @@ import org.jetbrains.kotlin.backend.common.lower.*
|
|||||||
import org.jetbrains.kotlin.backend.common.validateIrFile
|
import org.jetbrains.kotlin.backend.common.validateIrFile
|
||||||
import org.jetbrains.kotlin.backend.konan.lower.*
|
import org.jetbrains.kotlin.backend.konan.lower.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
|
|
||||||
internal class KonanLower(val context: Context) {
|
internal class KonanLower(val context: Context) {
|
||||||
|
|
||||||
fun lower() {
|
fun lower() {
|
||||||
|
// Phases to run against whole module.
|
||||||
|
lowerModule(context.irModule!!)
|
||||||
|
|
||||||
|
// Phases to run against a file.
|
||||||
context.irModule!!.files.forEach {
|
context.irModule!!.files.forEach {
|
||||||
lower(it)
|
lowerFile(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun lower(irFile: IrFile) {
|
fun lowerModule(irModule: IrModuleFragment) {
|
||||||
val phaser = PhaseManager(context)
|
val phaser = PhaseManager(context)
|
||||||
|
|
||||||
|
// Inlining must be run before other phases.
|
||||||
phaser.phase(KonanPhase.LOWER_INLINE) {
|
phaser.phase(KonanPhase.LOWER_INLINE) {
|
||||||
FunctionInlining(context).inline(irFile)
|
FunctionInlining(context).inline(irModule)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun lowerFile(irFile: IrFile) {
|
||||||
|
val phaser = PhaseManager(context)
|
||||||
|
|
||||||
phaser.phase(KonanPhase.LOWER_STRING_CONCAT) {
|
phaser.phase(KonanPhase.LOWER_STRING_CONCAT) {
|
||||||
StringConcatenationLowering(context).lower(irFile)
|
StringConcatenationLowering(context).lower(irFile)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-5
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.Scope
|
import org.jetbrains.kotlin.ir.builders.Scope
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.util.DeepCopyIrTree
|
import org.jetbrains.kotlin.ir.util.DeepCopyIrTree
|
||||||
@@ -48,7 +45,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid(
|
|||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
private val deserializer = DeserializerDriver(context)
|
private val deserializer = DeserializerDriver(context)
|
||||||
|
|
||||||
fun inline(irFile: IrFile) = irFile.accept(this, null)
|
fun inline(irModule: IrModuleFragment) = irModule.accept(this, null)
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user