From 22d748001d5f868b2cd3ff66a934cd28b778ae8e Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 1 Dec 2016 15:11:42 +0300 Subject: [PATCH] Added "start" function between the C launcher and Kotlin "main" --- backend.native/build.gradle | 22 +++++++++++++++++++++- backend.native/tests/build.gradle | 8 +++++++- runtime/src/launcher/cpp/launcher.cpp | 4 ++-- runtime/src/launcher/kotlin/konan/start.kt | 16 ++++++++++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 runtime/src/launcher/kotlin/konan/start.kt diff --git a/backend.native/build.gradle b/backend.native/build.gradle index e86b56768b5..fdb3ede9e46 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -162,7 +162,6 @@ dependencies { build.dependsOn 'compilerClasses','cli_bcClasses','bc_frontendClasses' - task stdlib(type: JavaExec) { main 'org.jetbrains.kotlin.cli.bc.K2NativeKt' classpath configurations.cli_bc @@ -182,6 +181,27 @@ task stdlib(type: JavaExec) { environment 'LD_LIBRARY_PATH' : "${llvmDir}/lib:${project.buildDir}/nativelibs" } +task start(type: JavaExec) { + main 'org.jetbrains.kotlin.cli.bc.K2NativeKt' + classpath configurations.cli_bc + + args project(':runtime').file('src/launcher/kotlin') + + args '-library', project(':runtime').file('build/stdlib.kt.bc') + + args '-output', project(':runtime').file('build/start.kt.bc') + + jvmArgs '-ea', "-Djava.library.path=${project.buildDir}/nativelibs" + + dependsOn 'stdlib' + outputs.file(project(':runtime').file('build/start.kt.bc')) + + doFirst { + args '-runtime', project(':runtime').build.outputs.files.singleFile + } + environment 'LD_LIBRARY_PATH' : "${llvmDir}/lib:${project.buildDir}/nativelibs" +} + task run(type: JavaExec) { main 'org.jetbrains.kotlin.cli.bc.K2NativeKt' classpath configurations.cli_bc diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index c413fb6e47f..2f28613af01 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -13,6 +13,7 @@ abstract class KonanTest extends DefaultTask { def llvmLlc = llvmTool("llc") def runtimeBc = new File("${runtimeProject.buildDir.canonicalPath}/runtime.bc") def launcherBc = new File("${runtimeProject.buildDir.canonicalPath}/launcher.bc") + def startKtBc = new File("${runtimeProject.buildDir.canonicalPath}/start.kt.bc") def stdlibKtBc = new File("${runtimeProject.buildDir.canonicalPath}/stdlib.kt.bc") def mainC = 'main.c' String goldValue = null @@ -136,7 +137,7 @@ class UnitKonanTest extends KonanTest { class RunKonanTest extends KonanTest { void compileTest(File sourceS, File runtimeS, File libraryPath, File exe) { project.execClang { - commandLine "clang++", launcherBc.absolutePath, runtimeS.absolutePath, stdlibKtBc.absolutePath, sourceS.absolutePath, + commandLine "clang++", launcherBc.absolutePath, startKtBc.absolutePath, runtimeS.absolutePath, stdlibKtBc.absolutePath, sourceS.absolutePath, "-o", exe.absolutePath, linkDl(), linkM(), rdynamic(), '-xc' } } @@ -611,3 +612,8 @@ task args0(type: RunKonanTest) { source = "runtime/basic/args0.kt" } +task main_exception(type: RunKonanTest) { + goldValue = "Uncaught exception from kotlin main: Throwable\n" + source = "runtime/basic/main_exception.kt" +} + diff --git a/runtime/src/launcher/cpp/launcher.cpp b/runtime/src/launcher/cpp/launcher.cpp index 958a33ebe5a..ac71554b308 100644 --- a/runtime/src/launcher/cpp/launcher.cpp +++ b/runtime/src/launcher/cpp/launcher.cpp @@ -22,14 +22,14 @@ ArrayHeader* setupArgs(int argc, char** argv) { return args; } -extern "C" void konanMain(void*) asm("_kfun:main(Array)"); +extern "C" void konanStart(void*) asm("_kfun:start(Array)"); int main(int argc, char** argv) { InitMemory(); ArrayHeader* args = setupArgs(argc, argv); - konanMain(args); + konanStart(args); // Yes, we have to follow Java convention and return zero. return 0; diff --git a/runtime/src/launcher/kotlin/konan/start.kt b/runtime/src/launcher/kotlin/konan/start.kt new file mode 100644 index 00000000000..09e8e7574ff --- /dev/null +++ b/runtime/src/launcher/kotlin/konan/start.kt @@ -0,0 +1,16 @@ + +external fun main(args: Array) + +fun start(args: Array) { + try { + + // This is kotlin program main entry point + main(args) + + } catch (e: Throwable) { + // TODO: Remove .toString() when println is more capabe, + // and may be add some more info. + print("Uncaught exception from kotlin main: ") + println(e.toString()) + } +}