From 7ef5cbb52a4272e1c8facdc59335ed93081dd802 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Tue, 13 Jun 2017 11:19:22 +0300 Subject: [PATCH] [stage][link][debug] always produce code with debug info. --- backend.native/build.gradle | 52 +++++----- .../kotlin/backend/konan/LinkStage.kt | 96 +++++++++++-------- backend.native/konan.properties | 7 ++ build.gradle | 6 +- 4 files changed, 91 insertions(+), 70 deletions(-) diff --git a/backend.native/build.gradle b/backend.native/build.gradle index 72ff2007f9c..f3e89f8b56f 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -144,7 +144,7 @@ build.dependsOn 'compilerClasses','cli_bcClasses','bc_frontendClasses' // These are just a couple of aliases -task stdlib(dependsOn: "${host}Stdlib") +task stdlib(dependsOn: "${host}Stdlib") task start(dependsOn: "${host}Start") // These files are built before the 'dist' is complete, @@ -152,23 +152,27 @@ task start(dependsOn: "${host}Start") // -runtime, -properties, -library and -Djava.library.path targetList.each { target -> + def konanJvmArgs = ["-ea", + "-Dkonan.home=${project.parent.file('dist')}", + "-Djava.library.path=${project.buildDir}/nativelibs", + "-Dfile.encoding=UTF-8"] + + def konanArgs = ['-nopack', '-nostdlib','-ea', '-g', + '-target', target, + '-runtime', project(':runtime').file("build/${target}/runtime.bc"), + '-properties', rootProject.konanPropertiesFile.canonicalPath, + *project.globalBuildArgs] + task("${target}Stdlib", type: JavaExec) { main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' classpath = project.configurations.cli_bc - jvmArgs "-ea", - "-Dkonan.home=${project.parent.file('dist')}", - "-Djava.library.path=${project.buildDir}/nativelibs", - "-Dfile.encoding=UTF-8" - args('-output', project(':runtime').file("build/${target}Stdlib"), - '-nopack', '-nostdlib','-ea', - '-produce', 'library', '-target', target, - '-runtime', project(':runtime').file("build/${target}/runtime.bc"), - '-properties', project(':backend.native').file('konan.properties'), - project(':runtime').file('src/main/kotlin'), - project(':Interop:Runtime').file('src/main/kotlin'), - project(':Interop:Runtime').file('src/native/kotlin'), - *project.globalBuildArgs) - + jvmArgs.addAll(konanJvmArgs) + args = [*konanArgs, + '-output', project(':runtime').file("build/${target}Stdlib"), + '-produce', 'library', + project(':Interop:Runtime').file('src/main/kotlin'), + project(':Interop:Runtime').file('src/native/kotlin'), + project(':runtime').file('src/main/kotlin')] inputs.dir(project(':runtime').file('src/main/kotlin')) inputs.dir(project(':Interop:Runtime').file('src/main/kotlin')) inputs.dir(project(':Interop:Runtime').file('src/native/kotlin')) @@ -176,23 +180,15 @@ targetList.each { target -> dependsOn ":runtime:${target}Runtime" } -} -targetList.each { target -> task("${target}Start", type: JavaExec) { main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' classpath = project.configurations.cli_bc - jvmArgs "-ea", - "-Dkonan.home=${project.parent.file('dist')}", - "-Djava.library.path=${project.buildDir}/nativelibs" - args('-output', project(':runtime').file("build/${target}Start"), - '-nopack', '-nostdlib', '-ea', - '-produce', 'bitcode', '-target', target, - '-library', project(':runtime').file("build/${target}Stdlib"), - '-runtime', project(':runtime').file("build/${target}/runtime.bc"), - '-properties', rootProject.konanPropertiesFile.canonicalPath, - project(':runtime').file('src/launcher/kotlin'), - *project.globalBuildArgs) + jvmArgs(*jvmArgs) + args = [*konanArgs, '-produce', 'bitcode', + '-output', project(':runtime').file("build/${target}Start"), + '-library', project(':runtime').file("build/${target}Stdlib"), + project(':runtime').file('src/launcher/kotlin')] inputs.dir(project(':runtime').file('src/launcher/kotlin')) outputs.file(project(':runtime').file("build/${target}Start")) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt index e0f17cc5359..f3c0d1f1615 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt @@ -44,11 +44,13 @@ internal abstract class PlatformFlags(val distribution: Distribution) { = propertyTargetList("linkerOptimizationFlags") open val linkerKonanFlags = propertyTargetList("linkerKonanFlags") + open val linkerDebugFlags + = propertyTargetList("linkerDebugFlags") open val useCompilerDriverAsLinker: Boolean get() = false // TODO: refactor. abstract fun linkCommand(objectFiles: List, - executable: ExecutableFile, optimize: Boolean): List + executable: ExecutableFile, optimize: Boolean, debug: Boolean): List open fun linkCommandSuffix(): List = emptyList() @@ -71,11 +73,17 @@ internal open class AndroidPlatform(distribution: Distribution) override val useCompilerDriverAsLinker: Boolean get() = true - override fun linkCommand(objectFiles: List, executable: String, optimize: Boolean): List { - return mutableListOf(clang, "-o", executable, "-fPIC", "-shared") + - objectFiles + - (if (optimize) linkerOptimizationFlags else emptyList()) + - linkerKonanFlags + override fun linkCommand(objectFiles: List, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List { + return mutableListOf(clang).apply{ + add("-o") + add(executable) + add("-fPIC") + add("-shared") + addAll(objectFiles) + if (optimize) addAll(linkerOptimizationFlags) + if (!debug) addAll(linkerDebugFlags) + addAll(linkerKonanFlags) + } } } @@ -92,15 +100,19 @@ internal open class MacOSBasedPlatform(distribution: Distribution) propertyTargetString("osVersionMin") + ".0") } - override fun linkCommand(objectFiles: List, executable: String, optimize: Boolean): List { - return mutableListOf(linker, "-demangle") + - listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO) + - listOf("-dynamic", "-arch", propertyTargetString("arch")) + - osVersionMin + - listOf("-syslibroot", distribution.targetSysRoot, "-o", executable) + - objectFiles + - (if (optimize) linkerOptimizationFlags else emptyList()) + - linkerKonanFlags + listOf("-lSystem") + override fun linkCommand(objectFiles: List, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List { + return mutableListOf(linker).apply { + add("-demangle") + addAll(listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO)) + addAll(listOf("-dynamic", "-arch", propertyTargetString("arch"))) + addAll(osVersionMin) + addAll(listOf("-syslibroot", distribution.targetSysRoot, "-o", executable)) + addAll(objectFiles) + if (optimize) addAll(linkerOptimizationFlags) + if (!debug) addAll(linkerDebugFlags) + addAll(linkerKonanFlags) + add("-lSystem") + } } open fun dsymutilCommand(executable: ExecutableFile): List { @@ -123,26 +135,29 @@ internal open class LinuxBasedPlatform(distribution: Distribution) val specificLibs = propertyTargetList("abiSpecificLibraries").map{it -> "-L${targetSysRoot}/$it"} - override fun linkCommand(objectFiles: List, executable: String, optimize: Boolean): List { + override fun linkCommand(objectFiles: List, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List { // TODO: Can we extract more to the konan.properties? - return mutableListOf(linker, - "--sysroot=${targetSysRoot}", - "-export-dynamic", "-z", "relro", "--hash-style=gnu", - "--build-id", "--eh-frame-hdr", // "-m", "elf_x86_64", - "-dynamic-linker", propertyTargetString("dynamicLinker"), - "-o", executable, - "${targetSysRoot}/usr/lib64/crt1.o", "${targetSysRoot}/usr/lib64/crti.o", "${libGcc}/crtbegin.o", - "-L${llvmLib}", "-L${libGcc}") + - specificLibs + - listOf("-L${targetSysRoot}/../lib", "-L${targetSysRoot}/lib", "-L${targetSysRoot}/usr/lib") + - (if (optimize) listOf("-plugin", "$llvmLib/LLVMgold.so") + pluginOptimizationFlags else emptyList()) + - objectFiles + - (if (optimize) linkerOptimizationFlags else emptyList()) + - linkerKonanFlags + - listOf("-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", - "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", - "${libGcc}/crtend.o", - "${targetSysRoot}/usr/lib64/crtn.o") + return mutableListOf(linker).apply { + addAll(listOf("--sysroot=${targetSysRoot}", + "-export-dynamic", "-z", "relro", "--hash-style=gnu", + "--build-id", "--eh-frame-hdr", // "-m", "elf_x86_64", + "-dynamic-linker", propertyTargetString("dynamicLinker"), + "-o", executable, + "${targetSysRoot}/usr/lib64/crt1.o", + "${targetSysRoot}/usr/lib64/crti.o", "${libGcc}/crtbegin.o", + "-L${llvmLib}", "-L${libGcc}")) + addAll(specificLibs) + addAll(listOf("-L${targetSysRoot}/../lib", "-L${targetSysRoot}/lib", "-L${targetSysRoot}/usr/lib")) + if (optimize) addAll(listOf("-plugin", "$llvmLib/LLVMgold.so") + pluginOptimizationFlags) + addAll(objectFiles) + if (optimize) addAll(linkerOptimizationFlags) + if (!debug) addAll(linkerDebugFlags) + addAll(linkerKonanFlags) + addAll(listOf("-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", + "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", + "${libGcc}/crtend.o", + "${targetSysRoot}/usr/lib64/crtn.o")) + } } } @@ -153,10 +168,13 @@ internal open class MingwPlatform(distribution: Distribution) override val useCompilerDriverAsLinker: Boolean get() = true - override fun linkCommand(objectFiles: List, executable: String, optimize: Boolean): List { - return listOf(linker, "-o", executable) + - objectFiles + - (if (optimize) linkerOptimizationFlags else emptyList()) + override fun linkCommand(objectFiles: List, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List { + return mutableListOf(linker).apply { + addAll(listOf("-o", executable)) + addAll(objectFiles) + if (optimize) addAll(linkerOptimizationFlags) + if (!debug) addAll(linkerDebugFlags) + } } override fun linkCommandSuffix() = linkerKonanFlags @@ -234,7 +252,7 @@ internal class LinkStage(val context: Context) { fun link(objectFiles: List): ExecutableFile { val executable = config.get(KonanConfigKeys.OUTPUT_FILE)!! - val linkCommand = platform.linkCommand(objectFiles, executable, optimize) + + val linkCommand = platform.linkCommand(objectFiles, executable, optimize, config.getBoolean(KonanConfigKeys.DEBUG)) + distribution.libffi + asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) + entryPointSelector + diff --git a/backend.native/konan.properties b/backend.native/konan.properties index 0cf01dda713..83fb3e4323a 100644 --- a/backend.native/konan.properties +++ b/backend.native/konan.properties @@ -30,6 +30,7 @@ llvmLtoOptFlags.osx = -O3 -function-sections llvmLtoNooptFlags.osx = -O1 linkerKonanFlags.osx = -lc++ linkerOptimizationFlags.osx = -dead_strip +linkerDebugFlags.osx = -S osVersionMinFlagLd.osx = -macosx_version_min osVersionMinFlagClang.osx = -mmacosx-version-min osVersionMin.osx = 10.11 @@ -51,6 +52,7 @@ targetSysRoot.ios = target-sysroot-2-darwin-ios libffiDir.ios = libffi-3.2.1-2-darwin-ios llvmLtoFlags.ios = -exported-symbol=_Konan_main llvmLtoOptFlags.ios = -O3 -function-sections +linkerDebugFlags.ios = -S llvmLtoNooptFlags.ios = -O1 linkerKonanFlags.ios = -lc++ linkerOptimizationFlags.ios = -dead_strip @@ -74,6 +76,7 @@ llvmLtoOptFlags.ios_sim = -O3 -function-sections llvmLtoNooptFlags.ios_sim = -O1 linkerKonanFlags.ios_sim = -lc++ linkerOptimizationFlags.ios_sim = -dead_strip +linkerDebugFlags.ios_sim = -S osVersionMinFlagLd.ios_sim = -ios_simulator_version_min osVersionMinFlagClang.ios_sim = -mios-simulator-version-min osVersionMin.ios_sim = 8.0 @@ -94,6 +97,7 @@ llvmLtoNooptFlags.linux = -O1 llvmLlcFlags.linux = -march=x86-64 linkerKonanFlags.linux = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lpthread linkerOptimizationFlags.linux = --gc-sections +linkerDebugFlags.linux = -S pluginOptimizationFlags.linux = -plugin-opt=mcpu=x86-64 -plugin-opt=O3 dynamicLinker.linux = /lib64/ld-linux-x86-64.so.2 entrySelector.linux = --defsym main=Konan_main @@ -151,6 +155,7 @@ quadruple.android_arm32 = arm-linux-androideabi entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main llvmLtoFlags.android_arm32 = -exported-symbol=Konan_main -emulated-tls -relocation-model=pic llvmLtoOptFlags.android_arm32 = -O3 -function-sections +linkerDebugFlags.android_arm32 = -S llvmLtoNooptFlags.android_arm32 = -O1 targetSysRoot.android_arm32 = target-sysroot-21-android_arm32 libffiDir.android_arm32 = libffi-3.2.1-2-android_arm32 @@ -177,6 +182,7 @@ llvmLtoFlags.android_arm64 = -exported-symbol=Konan_main -emulated-tls -relocati targetSysRoot.android_arm64 = target-sysroot-21-android_arm64 libffiDir.android_arm64 = libffi-3.2.1-2-android_arm64 linkerKonanFlags.android_arm64 = -lm -latomic -lstdc++ -landroid +linkerDebugFlags.android_arm64 = -S # Windows x86-64, based on mingw-w64. llvmVersion.mingw = 3.9.1 @@ -189,6 +195,7 @@ libffiDir.mingw = libffi-3.2.1-mingw-w64-x86-64 llvmLtoFlags.mingw = -exported-symbol=Konan_main llvmLtoOptFlags.mingw = -O3 -function-sections llvmLtoNooptFlags.mingw = -O1 +linkerDebugFlags.mingw = -Wl,-S linkerKonanFlags.mingw = -static-libgcc -static-libstdc++ \ -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic linkerOptimizationFlags.mingw = -Wl,--gc-sections diff --git a/build.gradle b/build.gradle index 4f814ea1818..e8aa249eef6 100644 --- a/build.gradle +++ b/build.gradle @@ -344,9 +344,9 @@ task crossDistRuntime(type: Copy) { targetList.each { target -> task("${target}CrossDistRuntime", type: Copy) { - dependsOn ":runtime:${target}Runtime" - dependsOn ":backend.native:${target}Stdlib" - dependsOn ":backend.native:${target}Start" + dependsOn ":runtime:${target}Runtime" + dependsOn ":backend.native:${target}Stdlib" + dependsOn ":backend.native:${target}Start" destinationDir file('dist')