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:
SvyatoslavScherbina
2017-03-27 16:44:24 +03:00
committed by Nikolay Igotti
parent 334d2f0ee6
commit c4abb8f706
15 changed files with 340 additions and 13 deletions
@@ -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"
@@ -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
+11 -4
View File
@@ -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
+6
View File
@@ -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
+14
View File
@@ -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)
}
}