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:
Igor Chevdar
2017-03-29 19:28:38 +03:00
parent dbea244b0e
commit 760de3cdad
2 changed files with 16 additions and 8 deletions
@@ -21,21 +21,32 @@ import org.jetbrains.kotlin.backend.common.lower.*
import org.jetbrains.kotlin.backend.common.validateIrFile
import org.jetbrains.kotlin.backend.konan.lower.*
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
internal class KonanLower(val context: Context) {
fun lower() {
// Phases to run against whole module.
lowerModule(context.irModule!!)
// Phases to run against a file.
context.irModule!!.files.forEach {
lower(it)
lowerFile(it)
}
}
fun lower(irFile: IrFile) {
fun lowerModule(irModule: IrModuleFragment) {
val phaser = PhaseManager(context)
// Inlining must be run before other phases.
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) {
StringConcatenationLowering(context).lower(irFile)
}
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.declarations.IrFile
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.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.util.DeepCopyIrTree
@@ -48,7 +45,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid(
//-------------------------------------------------------------------------//
private val deserializer = DeserializerDriver(context)
fun inline(irFile: IrFile) = irFile.accept(this, null)
fun inline(irModule: IrModuleFragment) = irModule.accept(this, null)
//-------------------------------------------------------------------------//