From fe591aafabd19e692ee95bc3f66b729b8e152a6b Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 18 Sep 2019 14:04:14 +0300 Subject: [PATCH] Fix IR entry point generation for partial IR compilation --- .../kotlin/backend/konan/ToplevelPhases.kt | 17 ++++++++++++++++- .../org/jetbrains/kotlin/ir/util/IrUtils2.kt | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 7fbb203fbba..fd969e7e1f6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.addChild +import org.jetbrains.kotlin.ir.util.addFile import org.jetbrains.kotlin.ir.util.file import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration @@ -343,7 +344,21 @@ internal val entryPointPhase = SameTypeNamedPhaseWrapper( override fun invoke(phaseConfig: PhaseConfig, phaserState: PhaserState, context: Context, input: IrModuleFragment): IrModuleFragment { assert(context.config.produce == CompilerOutputKind.PROGRAM) - context.ir.symbols.entryPoint!!.owner.file.addChild(makeEntryPoint(context)) + + val originalFile = context.ir.symbols.entryPoint!!.owner.file + val originalModule = originalFile.packageFragmentDescriptor.containingDeclaration + val file = if (context.llvmModuleSpecification.containsModule(originalModule)) { + originalFile + } else { + // `main` function is compiled to other LLVM module. + // For example, test running support uses `main` defined in stdlib. + context.irModule!!.addFile(originalFile.fileEntry, originalFile.fqName) + } + + require(context.llvmModuleSpecification.containsModule( + file.packageFragmentDescriptor.containingDeclaration)) + + file.addChild(makeEntryPoint(context)) return input } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt index 40ae38c1424..5871fd9ae65 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt @@ -19,7 +19,9 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ParameterDescriptor +import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.SourceManager import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* @@ -38,8 +40,10 @@ import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictsSuspensionReceiver +import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes @@ -83,6 +87,15 @@ internal fun IrFile.addTopLevelInitializer(expression: IrExpression, context: Ko addChild(irField) } +fun IrModuleFragment.addFile(fileEntry: SourceManager.FileEntry, packageFqName: FqName): IrFile { + val packageFragmentDescriptor = object : PackageFragmentDescriptorImpl(this.descriptor, packageFqName) { + override fun getMemberScope(): MemberScope = MemberScope.Empty + } + + return IrFileImpl(fileEntry, packageFragmentDescriptor) + .also { this.files += it } +} + inline fun stub(name: String): T { return Proxy.newProxyInstance(T::class.java.classLoader, arrayOf(T::class.java)) { _ /* proxy */, method, _ /* methodArgs */ ->