diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt index 47cf81629f3..7ad2dbb8846 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt @@ -431,7 +431,11 @@ class StubIrBuilder(private val context: StubIrContext) { private fun generateStubsForFunction(func: FunctionDecl) { try { - addStubs(FunctionStubBuilder(buildingContext, func, skipOverloads = true).build()) + addStubs(FunctionStubBuilder( + buildingContext, + func, + skipOverloads = func.name !in context.configuration.allowedOverloadsForCFunctions + ).build()) } catch (e: Throwable) { context.log("Warning: cannot generate stubs for function ${func.name}") } diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropConfiguration.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropConfiguration.kt index 1fd8416e1be..080fdc1026f 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropConfiguration.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropConfiguration.kt @@ -31,6 +31,7 @@ class InteropConfiguration( val nonStrictEnums: Set, val noStringConversion: Set, val exportForwardDeclarations: List, + val allowedOverloadsForCFunctions: Set, val disableDesignatedInitializerChecks: Boolean, val disableExperimentalAnnotation: Boolean, val target: KonanTarget diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 99cfa758883..0b5c068225d 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -324,6 +324,7 @@ private fun processCLib( nonStrictEnums = def.config.nonStrictEnums.toSet(), noStringConversion = def.config.noStringConversion.toSet(), exportForwardDeclarations = def.config.exportForwardDeclarations, + allowedOverloadsForCFunctions = def.config.allowedOverloadsForCFunctions.toSet(), disableDesignatedInitializerChecks = def.config.disableDesignatedInitializerChecks, disableExperimentalAnnotation = cinteropArguments.disableExperimentalAnnotation ?: false, target = target diff --git a/kotlin-native/platformLibs/src/platform/ios/iconv.def b/kotlin-native/platformLibs/src/platform/ios/iconv.def index e52d20f4da0..f1ef2f1c525 100644 --- a/kotlin-native/platformLibs/src/platform/ios/iconv.def +++ b/kotlin-native/platformLibs/src/platform/ios/iconv.def @@ -3,3 +3,10 @@ package = platform.iconv headers = iconv.h headerFilter = ** linkerOpts = -liconv +allowedOverloadsForCFunctions = iconv iconvctl iconv_close + +--- +typedef void* __kotlin_iconv_t; +size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv"); +int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl"); +int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close"); \ No newline at end of file diff --git a/kotlin-native/platformLibs/src/platform/osx/iconv.def b/kotlin-native/platformLibs/src/platform/osx/iconv.def index e52d20f4da0..f1ef2f1c525 100644 --- a/kotlin-native/platformLibs/src/platform/osx/iconv.def +++ b/kotlin-native/platformLibs/src/platform/osx/iconv.def @@ -3,3 +3,10 @@ package = platform.iconv headers = iconv.h headerFilter = ** linkerOpts = -liconv +allowedOverloadsForCFunctions = iconv iconvctl iconv_close + +--- +typedef void* __kotlin_iconv_t; +size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv"); +int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl"); +int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close"); \ No newline at end of file diff --git a/kotlin-native/platformLibs/src/platform/tvos/iconv.def b/kotlin-native/platformLibs/src/platform/tvos/iconv.def index e52d20f4da0..f1ef2f1c525 100644 --- a/kotlin-native/platformLibs/src/platform/tvos/iconv.def +++ b/kotlin-native/platformLibs/src/platform/tvos/iconv.def @@ -3,3 +3,10 @@ package = platform.iconv headers = iconv.h headerFilter = ** linkerOpts = -liconv +allowedOverloadsForCFunctions = iconv iconvctl iconv_close + +--- +typedef void* __kotlin_iconv_t; +size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv"); +int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl"); +int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close"); \ No newline at end of file diff --git a/kotlin-native/platformLibs/src/platform/watchos/iconv.def b/kotlin-native/platformLibs/src/platform/watchos/iconv.def index e52d20f4da0..f1ef2f1c525 100644 --- a/kotlin-native/platformLibs/src/platform/watchos/iconv.def +++ b/kotlin-native/platformLibs/src/platform/watchos/iconv.def @@ -3,3 +3,10 @@ package = platform.iconv headers = iconv.h headerFilter = ** linkerOpts = -liconv +allowedOverloadsForCFunctions = iconv iconvctl iconv_close + +--- +typedef void* __kotlin_iconv_t; +size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv"); +int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl"); +int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close"); \ No newline at end of file diff --git a/native/utils/src/org/jetbrains/kotlin/konan/util/DefFile.kt b/native/utils/src/org/jetbrains/kotlin/konan/util/DefFile.kt index 066cc875862..b11e101b722 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/util/DefFile.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/util/DefFile.kt @@ -120,6 +120,10 @@ class DefFile(val file:File?, val config:DefFileConfig, val manifestAddendProper properties.getSpaceSeparated("exportForwardDeclarations") } + val allowedOverloadsForCFunctions by lazy { + properties.getSpaceSeparated("allowedOverloadsForCFunctions") + } + val disableDesignatedInitializerChecks by lazy { properties.getProperty("disableDesignatedInitializerChecks")?.toBoolean() ?: false }