[JS IR BE] Some preparation for IrSerialization

This commit is contained in:
Roman Artemev
2019-01-16 20:35:42 +03:00
committed by romanart
parent d4b97d33ef
commit 3718edb6bc
5 changed files with 106 additions and 30 deletions
@@ -45,6 +45,7 @@ fun compile(
files: List<KtFile>,
configuration: CompilerConfiguration,
export: List<FqName> = emptyList(),
isKlibCompilation: Boolean = false,
dependencies: List<CompiledModule> = emptyList(),
builtInsModule: CompiledModule? = null,
moduleType: ModuleType
@@ -82,24 +83,36 @@ fun compile(
moduleType
)
// TODO: Split compilation into two steps: kt -> ir, ir -> js
val moduleName = configuration[CommonConfigurationKeys.MODULE_NAME]!!
when (moduleType) {
ModuleType.MAIN -> {
val moduleDependencies: List<CompiledModule> =
DFS.topologicalOrder(dependencies, CompiledModule::dependencies)
.filter { it.moduleType == ModuleType.SECONDARY }
val fileDependencies = moduleDependencies.flatMap { it.moduleFragment!!.files }
if (isKlibCompilation) {
// val declarationTable = DeclarationTable(moduleFragment.irBuiltins, DescriptorTable())
// val serializedIr = IrModuleSerializer(context, declarationTable/*, onlyForInlines = false*/).serializedIrModule(moduleFragment)
// val serializer = KonanSerializationUtil(context, configuration.get(CommonConfigurationKeys.METADATA_VERSION)!!, declarationTable)
// val serializedData = serializer.serializeModule(analysisResult.moduleDescriptor, serializedIr)
// buildLibrary(serializedData)
//
TODO("Implemenet IrSerialization")
} else {
moduleFragment.files.addAll(0, fileDependencies)
}
// TODO: Split compilation into two steps: kt -> ir, ir -> js
val moduleName = configuration[CommonConfigurationKeys.MODULE_NAME]!!
when (moduleType) {
ModuleType.MAIN -> {
val moduleDependencies: List<CompiledModule> =
DFS.topologicalOrder(dependencies, CompiledModule::dependencies)
.filter { it.moduleType == ModuleType.SECONDARY }
ModuleType.SECONDARY -> {
return CompiledModule(moduleName, null, moduleFragment, moduleType, dependencies)
}
val fileDependencies = moduleDependencies.flatMap { it.moduleFragment!!.files }
ModuleType.TEST_RUNTIME -> {
moduleFragment.files.addAll(0, fileDependencies)
}
ModuleType.SECONDARY -> {
return CompiledModule(moduleName, null, moduleFragment, moduleType, dependencies)
}
ModuleType.TEST_RUNTIME -> {
}
}
}
@@ -14,10 +14,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.builders.irReturn
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -29,9 +26,7 @@ import org.jetbrains.kotlin.ir.types.toKotlinType
import org.jetbrains.kotlin.ir.util.file
import org.jetbrains.kotlin.ir.util.getArguments
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.ir.visitors.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.inline.InlineUtil
@@ -134,8 +129,6 @@ internal class FunctionInlining(val context: Context): IrElementTransformerWithC
return transformedModule
}
//-------------------------------------------------------------------------//
override fun visitFunctionNew(declaration: IrFunction, data: Ref<Boolean>): IrStatement {
val descriptor = declaration.descriptor
@@ -160,15 +153,14 @@ internal class FunctionInlining(val context: Context): IrElementTransformerWithC
if (callee == null) { // We failed to get the declaration.
val message = "Inliner failed to obtain function declaration: " +
functionDescriptor.fqNameSafe.toString()
callee
context.reportWarning(message, currentFile, callSite) // Report warning.
return callSite
}
data.value = data.value or callee.second
val childIsBad = Ref(inlineFunctions[functionDescriptor] ?: false)
callee.first.transformChildren(this, childIsBad)
inlineFunctions[functionDescriptor] = childIsBad.value// Process recursive inline.
callee.first.transformChildren(this, childIsBad) // Process recursive inline.
inlineFunctions[functionDescriptor] = childIsBad.value
data.value = data.value or childIsBad.value
val currentCalleeIsBad = argsAreBad.value or childIsBad.value or callee.second
@@ -194,7 +186,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerWithC
}
// TODO: should we keep this at all?
private val inlineConstructor = FqName("konan.internal.InlineConstructor")
private val inlineConstructor = FqName("kotlin.native.internal.InlineConstructor")
private val FunctionDescriptor.isInlineConstructor get() = annotations.hasAnnotation(inlineConstructor)
//-----------------------------------------------------------------------------//
@@ -328,7 +320,8 @@ private class Inliner(val globalSubstituteMap: MutableMap<DeclarationDescriptor,
if (functionArgument == null)
return super.visitCall(expression)
val dispatchDescriptor = dispatchReceiver.descriptor
if (dispatchDescriptor is ValueParameterDescriptor && dispatchDescriptor.isNoinline) return super.visitCall(expression)
if (dispatchDescriptor is ValueParameterDescriptor &&
dispatchDescriptor.isNoinline) return super.visitCall(expression)
if (functionArgument is IrFunctionReference) {
if (!functionArgument.isLambda) return super.visitCall(expression)
@@ -378,7 +371,7 @@ private class Inliner(val globalSubstituteMap: MutableMap<DeclarationDescriptor,
override fun visitElement(element: IrElement) = element.accept(this, null)
}
private fun isLambdaCall(irCall: IrCall) = irCall.descriptor.isFunctionInvoke && irCall.dispatchReceiver is IrGetValue
private fun isLambdaCall(irCall: IrCall) = irCall.descriptor.isFunctionInvoke && irCall.dispatchReceiver is IrGetValue
private fun createTypeSubstitutor(irCall: IrCall): TypeSubstitutor? {
if (irCall.typeArgumentsCount == 0) return null