Implement varargs in interop for Kotlin N (#393)
* Implement CValues.equals and .hashCode * Add trivial test for interop varargs * Implement varargs in interop for Kotlin N * Compile and link runtime with libffi * Fix few places.
This commit is contained in:
committed by
Nikolay Igotti
parent
334d2f0ee6
commit
c4abb8f706
+2
@@ -44,6 +44,8 @@ class Distribution(val config: CompilerConfiguration) {
|
||||
sysRoot
|
||||
}
|
||||
|
||||
val libffi = "$dependenciesDir/${properties.propertyString("libffiDir.$suffix")}/lib/libffi.a"
|
||||
|
||||
val llvmBin = "$llvmHome/bin"
|
||||
val llvmLib = "$llvmHome/lib"
|
||||
|
||||
|
||||
+4
-3
@@ -63,7 +63,7 @@ internal class IPhoneOSfromMacOSPlatform(distribution: Distribution)
|
||||
override val arch = properties.propertyString("arch.osx-ios")!!
|
||||
override val osVersionMin = properties.propertyList("osVersionMin.osx-ios")
|
||||
override val llvmLlcFlags = properties.propertyList("llvmLlcFlags.osx-ios")
|
||||
override val targetSysRoot = "${distribution.dependencies}/${properties.propertyString("targetSysRoot.osx-ios")!!}"
|
||||
override val targetSysRoot = "${distribution.dependenciesDir}/${properties.propertyString("targetSysRoot.osx-ios")!!}"
|
||||
}
|
||||
|
||||
internal class IPhoneSimulatorFromMacOSPlatform(distribution: Distribution)
|
||||
@@ -72,7 +72,7 @@ internal class IPhoneSimulatorFromMacOSPlatform(distribution: Distribution)
|
||||
override val arch = properties.propertyString("arch.osx-ios-sim")!!
|
||||
override val osVersionMin = properties.propertyList("osVersionMin.osx-ios-sim")
|
||||
override val llvmLlcFlags = properties.propertyList("llvmLlcFlags.osx-ios-sim")
|
||||
override val targetSysRoot = "${distribution.dependencies}/${properties.propertyString("targetSysRoot.osx-ios-sim")!!}"
|
||||
override val targetSysRoot = "${distribution.dependenciesDir}/${properties.propertyString("targetSysRoot.osx-ios-sim")!!}"
|
||||
}
|
||||
|
||||
internal open class LinuxPlatform(distribution: Distribution)
|
||||
@@ -119,7 +119,7 @@ internal open class LinuxPlatform(distribution: Distribution)
|
||||
internal class RaspberryPiPlatform(distribution: Distribution)
|
||||
: LinuxPlatform(distribution) {
|
||||
|
||||
override val sysRoot = "${distribution.dependencies}/${properties.propertyString("targetSysRoot.linux-raspberrypi")!!}"
|
||||
override val sysRoot = "${distribution.dependenciesDir}/${properties.propertyString("targetSysRoot.linux-raspberrypi")!!}"
|
||||
|
||||
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
|
||||
// TODO: Can we extract more to the konan.properties?
|
||||
@@ -229,6 +229,7 @@ internal class LinkStage(val context: Context) {
|
||||
fun link(objectFiles: List<ObjectFile>): ExecutableFile {
|
||||
val executable = config.get(KonanConfigKeys.EXECUTABLE_FILE)!!
|
||||
val linkCommand = platform.linkCommand(objectFiles, executable, optimize) +
|
||||
distribution.libffi +
|
||||
asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) +
|
||||
entryPointSelector
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ dependenciesUrl = https://jetbrains.bintray.com/kotlin-native-dependencies
|
||||
# macbook
|
||||
arch.osx = x86_64
|
||||
sysRoot.osx = target-sysroot-1-darwin-macos
|
||||
libffiDir.osx = libffi-3.2.1-2-darwin-macos
|
||||
llvmHome.osx = clang+llvm-3.9.0-darwin-macos
|
||||
llvmLtoFlags.osx = -O3 -function-sections -exported-symbol=_Konan_main
|
||||
llvmLlcFlags.osx = -mtriple=x86_64-apple-macosx10.10.0 --disable-fp-elim
|
||||
@@ -13,12 +14,13 @@ linkerKonanFlags.osx = -lc++
|
||||
linkerOptimizationFlags.osx = -dead_strip
|
||||
osVersionMin.osx = -macosx_version_min 10.10.0
|
||||
entrySelector.osx = -alias _Konan_main _main
|
||||
dependencies.osx = target-sysroot-1-darwin-macos clang+llvm-3.9.0-darwin-macos
|
||||
dependencies.osx = target-sysroot-1-darwin-macos libffi-3.2.1-2-darwin-macos clang+llvm-3.9.0-darwin-macos
|
||||
|
||||
# iphone
|
||||
arch.osx-ios = arm64
|
||||
sysRoot.osx-ios = target-sysroot-1-darwin-macos
|
||||
targetSysRoot.osx-ios = target-sysroot-2-darwin-ios
|
||||
libffiDir.osx-ios = libffi-3.2.1-2-darwin-ios
|
||||
llvmHome.osx-ios = clang+llvm-3.9.0-darwin-macos
|
||||
llvmLtoFlags.osx-ios = -O3 -function-sections -exported-symbol=_Konan_main
|
||||
llvmLlcFlags.osx-ios = -mtriple=arm64-apple-ios5.0.0 --disable-fp-elim
|
||||
@@ -27,6 +29,7 @@ linkerOptimizationFlags.osx-ios = -dead_strip
|
||||
osVersionMin.osx-ios = -iphoneos_version_min 5.0.0
|
||||
entrySelector.osx-ios = -alias _Konan_main _main
|
||||
dependencies.osx-ios = target-sysroot-1-darwin-macos \
|
||||
libffi-3.2.1-2-darwin-ios \
|
||||
clang+llvm-3.9.0-darwin-macos \
|
||||
target-sysroot-2-darwin-ios
|
||||
|
||||
@@ -34,6 +37,7 @@ dependencies.osx-ios = target-sysroot-1-darwin-macos \
|
||||
arch.osx-ios-sim = x86_64
|
||||
sysRoot.osx-ios-sim = target-sysroot-1-darwin-macos
|
||||
targetSysRoot.osx-ios-sim = target-sysroot-1-darwin-ios-sim
|
||||
libffiDir.osx-ios-sim = libffi-3.2.1-2-darwin-ios-sim
|
||||
llvmHome.osx-ios-sim = clang+llvm-3.9.0-darwin-macos
|
||||
llvmLtoFlags.osx-ios-sim = -O3 -function-sections -exported-symbol=_Konan_main
|
||||
llvmLlcFlags.osx-ios-sim = -mtriple=x86_64-apple-ios5.0.0 --disable-fp-elim
|
||||
@@ -42,11 +46,13 @@ linkerOptimizationFlags.osx-ios-sim = -dead_strip
|
||||
osVersionMin.osx-ios-sim = -ios_simulator_version_min 5.0.0
|
||||
entrySelector.osx-ios-sim = -alias _Konan_main _main
|
||||
dependencies.osx-ios-sim = target-sysroot-1-darwin-macos \
|
||||
libffi-3.2.1-2-darwin-ios-sim \
|
||||
clang+llvm-3.9.0-darwin-macos \
|
||||
target-sysroot-1-darwin-ios-sim
|
||||
|
||||
# linux
|
||||
sysRoot.linux = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu/sysroot
|
||||
libffiDir.linux = libffi-3.2.1-2-linux-x86-64
|
||||
llvmHome.linux = clang+llvm-3.9.0-linux-x86-64
|
||||
libGcc.linux = target-gcc-toolchain-3-linux-x86-64/lib/gcc/x86_64-unknown-linux-gnu/4.8.5
|
||||
gccToolChain.linux = target-gcc-toolchain-3-linux-x86-64
|
||||
@@ -56,12 +62,13 @@ linkerKonanFlags.linux = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lpthread
|
||||
linkerOptimizationFlags.linux = --gc-sections
|
||||
pluginOptimizationFlags.linux = -plugin-opt=mcpu=x86-64 -plugin-opt=O3
|
||||
entrySelector.linux = --defsym main=Konan_main
|
||||
dependencies.linux = clang+llvm-3.9.0-linux-x86-64 target-gcc-toolchain-3-linux-x86-64
|
||||
dependencies.linux = clang+llvm-3.9.0-linux-x86-64 target-gcc-toolchain-3-linux-x86-64 libffi-3.2.1-2-linux-x86-64
|
||||
|
||||
# Raspberry Pi
|
||||
arch.linux-raspberrypi = armv7
|
||||
sysRoot.linux-raspberrypi = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu/sysroot
|
||||
targetSysRoot.linux-raspberrypi = target-sysroot-1-raspberrypi
|
||||
libffiDir.linux-raspberrypi = libffi-3.2.1-2-raspberrypi
|
||||
llvmHome.linux-raspberrypi = clang+llvm-3.9.0-linux-x86-64
|
||||
libGcc.linux-raspberrypi = target-sysroot-1-raspberrypi/lib/gcc/arm-linux-gnueabihf/4.8.3/
|
||||
gccToolChain.linux-raspberrypi = target-gcc-toolchain-3-linux-x86-64
|
||||
@@ -71,5 +78,5 @@ linkerKonanFlags.linux-raspberrypi = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lc -l
|
||||
entrySelector.linux-raspberrypi = --defsym main=Konan_main
|
||||
dependencies.raspberrypi = clang+llvm-3.9.0-linux-x86-64 \
|
||||
target-gcc-toolchain-3-linux-x86-64 \
|
||||
target-sysroot-1-raspberrypi
|
||||
|
||||
target-sysroot-1-raspberrypi \
|
||||
libffi-3.2.1-2-linux-x86-64
|
||||
|
||||
@@ -1617,6 +1617,12 @@ task interop3(type: RunInteropKonanTest) {
|
||||
interop = 'cstdlib'
|
||||
}
|
||||
|
||||
task interop4(type: RunInteropKonanTest) {
|
||||
goldValue = "a b -1 2 3 9223372036854775807 0.1 0.2\n1 42\n"
|
||||
source = "interop/basics/4.kt"
|
||||
interop = 'cstdio'
|
||||
}
|
||||
|
||||
task interop_echo_server(type: RunInteropKonanTest) {
|
||||
if (isLinux()) {
|
||||
disabled = true
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
import cstdio.*
|
||||
import kotlinx.cinterop.*
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
printf("%s %s %d %d %d %lld %.1f %.1lf\n",
|
||||
"a", "b".cstr, (-1).toByte(), 2.toShort(), 3, Long.MAX_VALUE, 0.1.toFloat(), 0.2)
|
||||
|
||||
memScoped {
|
||||
val aVar = alloc<CInt32Var>()
|
||||
val bVar = alloc<CInt32Var>()
|
||||
val sscanfResult = sscanf("42", "%d%d", aVar.ptr, bVar.ptr)
|
||||
printf("%d %d\n", sscanfResult, aVar.value)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user