[JS IR BE] Some preparation for IrSerialization
This commit is contained in:
@@ -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 -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-15
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user