diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index aaadd72ad61..17a60736854 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -20,18 +20,19 @@ import com.intellij.openapi.Disposable import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable import org.jetbrains.kotlin.backend.konan.* -import org.jetbrains.kotlin.konan.util.profile import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLITool import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager import org.jetbrains.kotlin.cli.common.ExitCode -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.konan.util.profile import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.utils.KotlinPaths @@ -172,6 +173,8 @@ class K2Native : CLICompiler() { } else { arguments.checkDependencies }) + if (arguments.friendModules != null) + put(FRIEND_MODULES, arguments.friendModules!!.split(File.pathSeparator).filterNot(String::isEmpty)) } } } diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 6ad57e4bdc3..6bc268cada5 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -141,5 +141,11 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { @Argument(value = "--verify_ir", description = "Verify IR") var verifyIr: Boolean = false + @Argument( + value = "-friend-modules", + valueDescription = "", + description = "Paths to friend modules" + ) + var friendModules: String? = null } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index f0665b44207..615c081d372 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -108,6 +108,8 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration private val loadedDescriptors = loadLibMetadata() + internal lateinit var friends:Set + internal val defaultNativeLibraries = if (produce == CompilerOutputKind.PROGRAM) File(distribution.defaultNatives(target)).listFiles.map { it.absolutePath } @@ -125,13 +127,20 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration val specifics = configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS)!! val libraries = immediateLibraries.withResolvedDependencies() + val friendLibsSet = configuration.get(KonanConfigKeys.FRIEND_MODULES)?.map{File(it)}?.toSet() + val friends = mutableListOf() for (klib in libraries) { profile("Loading ${klib.libraryName}") { // MutableModuleContext needs ModuleDescriptorImpl, rather than ModuleDescriptor. val moduleDescriptor = klib.moduleDescriptor(specifics) allMetadata.add(moduleDescriptor) + friendLibsSet?.apply { + if (contains(klib.libraryFile)) + friends.add(moduleDescriptor) + } } } + this.friends = friends.toSet() return allMetadata } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 6a468ea317c..c5d4de97f3c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -105,6 +105,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("verify ir") val VERBOSE_PHASES: CompilerConfigurationKey> = CompilerConfigurationKey.create("verbose backend phases") + val FRIEND_MODULES: CompilerConfigurationKey> + = CompilerConfigurationKey.create>("friend module paths") } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt index af694deb8a9..5926529e28a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt @@ -39,8 +39,9 @@ object TopDownAnalyzerFacadeForKonan { val context = MutableModuleContextImpl(module, projectContext) if (!module.isStdlib()) { - context.setDependencies(listOf(module) + config.moduleDescriptors + - config.getOrCreateForwardDeclarationsModule(module.builtIns, projectContext.storageManager)) + val dependencies = listOf(module) + config.moduleDescriptors + + config.getOrCreateForwardDeclarationsModule(module.builtIns, projectContext.storageManager) + module.setDependencies(dependencies, config.friends) } else { assert (config.moduleDescriptors.isEmpty()) context.setDependencies(module) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index 12746cda771..f024dd012ca 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -99,6 +99,9 @@ internal tailrec fun DeclarationDescriptor.isExported(): Boolean { else -> null } + /** + * note: about INTERNAL - with support of friend modules we let frontend to deal with internal declarations. + */ if (visibility != null && !visibility.isPublicAPI && visibility != Visibilities.INTERNAL) { // If the declaration is explicitly marked as non-public, // then it must not be accessible from other modules. diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index 9e8e1fc445d..90e38d93401 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -16,23 +16,27 @@ package org.jetbrains.kotlin.backend.konan.llvm -import kotlinx.cinterop.* +import kotlinx.cinterop.allocArray +import kotlinx.cinterop.cValuesOf +import kotlinx.cinterop.get +import kotlinx.cinterop.memScoped import llvm.* import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.CurrentKonanModule import org.jetbrains.kotlin.backend.konan.descriptors.DeserializedKonanModule import org.jetbrains.kotlin.backend.konan.descriptors.LlvmSymbolOrigin import org.jetbrains.kotlin.backend.konan.descriptors.findPackage -import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.backend.konan.hash.GlobalHash import org.jetbrains.kotlin.backend.konan.irasdescriptors.* -import org.jetbrains.kotlin.backend.konan.isNativeBinary import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import kotlin.properties.ReadOnlyProperty