diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 487115c8014..ce01a8041c1 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -9,6 +9,7 @@ import llvm.LLVMTypeRef import org.jetbrains.kotlin.backend.common.DefaultDelegateFactory import org.jetbrains.kotlin.backend.common.DefaultMapping import org.jetbrains.kotlin.backend.common.LoggingContext +import org.jetbrains.kotlin.backend.konan.cexport.CAdapterExportedElements import org.jetbrains.kotlin.backend.konan.cexport.CAdapterGenerator import org.jetbrains.kotlin.backend.konan.descriptors.BridgeDirections import org.jetbrains.kotlin.backend.konan.descriptors.ClassLayoutBuilder @@ -90,7 +91,7 @@ internal class Context( */ override var symbolTable: SymbolTable? = null - lateinit var cAdapterGenerator: CAdapterGenerator + lateinit var cAdapterExportedElements: CAdapterExportedElements lateinit var expectDescriptorToSymbol: MutableMap diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 4e7d77ddb63..92ec4744ff7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.checkDeclarationParents import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer +import org.jetbrains.kotlin.backend.konan.cexport.CAdapterExportedElements import org.jetbrains.kotlin.backend.konan.cexport.CAdapterGenerator import org.jetbrains.kotlin.backend.konan.cexport.CAdapterTypeTranslator import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary @@ -107,9 +108,8 @@ internal val buildCExportsPhase = konanUnitPhase( op = { val prefix = config.fullExportedNamePrefix.replace("-|\\.".toRegex(), "_") val cAdapterTypeTranslator = CAdapterTypeTranslator(prefix, this.builtIns) - this.cAdapterGenerator = CAdapterGenerator(this, cAdapterTypeTranslator).also { - it.buildExports(this.symbolTable!!) - } + this.cAdapterExportedElements = CAdapterGenerator(this, this.moduleDescriptor, cAdapterTypeTranslator) + .buildExports(this.symbolTable!!) }, name = "BuildCExports", description = "Build C exports", diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt index 27226bb541b..5abc716439c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.descriptors.allParameters import org.jetbrains.kotlin.backend.common.pop import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.driver.phases.PsiToIrContext import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -108,7 +109,7 @@ internal class ExportedElementScope(val kind: ScopeKind, val name: String) { fun scopeUniqueName(descriptor: DeclarationDescriptor, shortName: Boolean): String { scopeNamesMap[descriptor to shortName]?.apply { return this } var computedName = when (descriptor) { - is ConstructorDescriptor -> "${descriptor.constructedClass.fqNameSafe.shortName().asString()}" + is ConstructorDescriptor -> descriptor.constructedClass.fqNameSafe.shortName().asString() is PropertyGetterDescriptor -> "get_${descriptor.correspondingProperty.name.asString()}" is PropertySetterDescriptor -> "set_${descriptor.correspondingProperty.name.asString()}" is FunctionDescriptor -> functionImplName(descriptor, descriptor.fqNameSafe.shortName().asString(), shortName) @@ -140,7 +141,7 @@ internal class ExportedElement( lateinit var cname: String override fun toString(): String { - return "$kind: $name (aliased to ${if (::cname.isInitialized) cname.toString() else ""})" + return "$kind: $name (aliased to ${if (::cname.isInitialized) cname else ""})" } fun uniqueName(descriptor: DeclarationDescriptor, shortName: Boolean) = @@ -167,9 +168,9 @@ internal class ExportedElement( else -> error("unexpected $kind element: $declaration") } - fun KotlinType.includeToSignature() = !this.isUnit() + private fun KotlinType.includeToSignature() = !this.isUnit() - fun makeCFunctionSignature(shortName: Boolean): List { + private fun makeCFunctionSignature(shortName: Boolean): List { if (!isFunction) { throw Error("only for functions") } @@ -195,7 +196,7 @@ internal class ExportedElement( val descriptor = declaration val original = descriptor.original as FunctionDescriptor val returnedType = when { - original is ConstructorDescriptor -> owner.context.builtIns.unitType + original is ConstructorDescriptor -> typeTranslator.builtIns.unitType else -> original.returnType!! } val params = ArrayList(original.allParameters @@ -396,11 +397,12 @@ private fun ModuleDescriptor.getPackageFragments(): List { private val scopes = mutableListOf() - internal val prefix = context.config.fullExportedNamePrefix.replace("-|\\.".toRegex(), "_") + internal val prefix = typeTranslator.prefix private val paramNamesRecorded = mutableMapOf() private var symbolTableOrNull: SymbolTable? = null @@ -410,7 +412,7 @@ internal class CAdapterGenerator( paramNamesRecorded.clear() return params.associate { val name = translateName(it.name) - val count = paramNamesRecorded.getOrDefault(name, 0) + val count = paramNamesRecorded.getOrPut(name) { 0 } paramNamesRecorded[name] = count + 1 if (count == 0) { it to name @@ -534,14 +536,11 @@ internal class CAdapterGenerator( private val moduleDescriptors = mutableSetOf() - // TODO: Use explicit I/O between phases. - private lateinit var cAdapterExportedElements: CAdapterExportedElements - - fun buildExports(symbolTable: SymbolTable) { + fun buildExports(symbolTable: SymbolTable): CAdapterExportedElements { this.symbolTableOrNull = symbolTable try { buildExports() - cAdapterExportedElements = CAdapterExportedElements(typeTranslator, scopes) + return CAdapterExportedElements(typeTranslator, scopes) } finally { this.symbolTableOrNull = null } @@ -549,15 +548,15 @@ internal class CAdapterGenerator( private fun buildExports() { scopes.push(ExportedElementScope(ScopeKind.TOP, "kotlin")) - moduleDescriptors += context.moduleDescriptor - moduleDescriptors += context.getExportedDependencies() + moduleDescriptors += moduleDescriptor + moduleDescriptors += moduleDescriptor.getExportedDependencies(context.config) currentPackageFragments = moduleDescriptors.flatMap { it.getPackageFragments() }.toSet().sortedWith( Comparator { o1, o2 -> o1.fqName.toString().compareTo(o2.fqName.toString()) }) - context.moduleDescriptor.getPackage(FqName.ROOT).accept(this, null) + moduleDescriptor.getPackage(FqName.ROOT).accept(this, null) } private val simpleNameMapping = mapOf( @@ -565,7 +564,7 @@ internal class CAdapterGenerator( "" to "set" ) - fun translateName(name: Name): String { + private fun translateName(name: Name): String { val nameString = name.asString() return when { simpleNameMapping.contains(nameString) -> simpleNameMapping[nameString]!! @@ -577,6 +576,4 @@ internal class CAdapterGenerator( private var functionIndex = 0 fun nextFunctionIndex() = functionIndex++ - - fun generateBindings(codegen: CodeGenerator) = CAdapterBindingsBuilder(codegen, cAdapterExportedElements).build() } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 8fae48d7ac1..251588c8e2f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -10,6 +10,7 @@ import llvm.* import org.jetbrains.kotlin.backend.common.lower.coroutines.getOrCreateFunctionWithContinuationStub import org.jetbrains.kotlin.backend.common.lower.inline.InlinerExpressionLocationHint import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.cexport.CAdapterBindingsBuilder import org.jetbrains.kotlin.backend.konan.cgen.CBridgeOrigin import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.ir.* @@ -326,7 +327,7 @@ internal class CodeGeneratorVisitor(val generationState: NativeGenerationState, } } private fun appendCAdapters() { - context.cAdapterGenerator.generateBindings(codegen) + CAdapterBindingsBuilder(codegen, context.cAdapterExportedElements).build() } private fun FunctionGenerationContext.initThreadLocalField(irField: IrField) {