[linker] more enhancments (idea inspections)

This commit is contained in:
Vasily Levchenko
2017-07-12 11:19:31 +03:00
committed by vvlevchenko
parent 96d5341852
commit 1d532729a8
@@ -31,7 +31,6 @@ typealias ExecutableFile = String
internal abstract class PlatformFlags(val distribution: Distribution) { internal abstract class PlatformFlags(val distribution: Distribution) {
val properties = distribution.properties val properties = distribution.properties
val hostSuffix = distribution.hostTargetSuffix
val target = distribution.target val target = distribution.target
open val llvmLtoNooptFlags open val llvmLtoNooptFlags
@@ -115,24 +114,21 @@ internal open class MacOSBasedPlatform(distribution: Distribution)
} }
} }
open fun dsymutilCommand(executable: ExecutableFile): List<String> { open fun dsymutilCommand(executable: ExecutableFile): List<String> = listOf(dsymutil, executable)
return listOf(dsymutil, executable)
}
open fun dsymutilDryRunVerboseCommand(executable: ExecutableFile): List<String> { open fun dsymutilDryRunVerboseCommand(executable: ExecutableFile): List<String> =
return listOf(dsymutil, "-dump-debug-map" ,executable) listOf(dsymutil, "-dump-debug-map" ,executable)
}
} }
internal open class LinuxBasedPlatform(distribution: Distribution) internal open class LinuxBasedPlatform(distribution: Distribution)
: PlatformFlags(distribution) { : PlatformFlags(distribution) {
val targetSysRoot = distribution.targetSysRoot private val targetSysRoot = distribution.targetSysRoot
val llvmLib = distribution.llvmLib private val llvmLib = distribution.llvmLib
val libGcc = "$targetSysRoot/${propertyTargetString("libGcc")!!}" private val libGcc = "$targetSysRoot/${propertyTargetString("libGcc")!!}"
val linker = "${distribution.targetToolchain}/bin/ld.gold" private val linker = "${distribution.targetToolchain}/bin/ld.gold"
val pluginOptimizationFlags = propertyTargetList("pluginOptimizationFlags") private val pluginOptimizationFlags = propertyTargetList("pluginOptimizationFlags")
val specificLibs private val specificLibs
= propertyTargetList("abiSpecificLibraries").map{it -> "-L${targetSysRoot}/$it"} = propertyTargetList("abiSpecificLibraries").map{it -> "-L${targetSysRoot}/$it"}
override fun linkCommand(objectFiles: List<ObjectFile>, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List<String> { override fun linkCommand(objectFiles: List<ObjectFile>, executable: ExecutableFile, optimize: Boolean, debug: Boolean): List<String> {
@@ -164,7 +160,7 @@ internal open class LinuxBasedPlatform(distribution: Distribution)
internal open class MingwPlatform(distribution: Distribution) internal open class MingwPlatform(distribution: Distribution)
: PlatformFlags(distribution) { : PlatformFlags(distribution) {
val linker = "${distribution.targetToolchain}/bin/clang++" private val linker = "${distribution.targetToolchain}/bin/clang++"
override val useCompilerDriverAsLinker: Boolean get() = true override val useCompilerDriverAsLinker: Boolean get() = true
@@ -186,7 +182,7 @@ internal class LinkStage(val context: Context) {
private val distribution = context.config.distribution private val distribution = context.config.distribution
val platform = when (context.config.targetManager.target) { private val platform = when (context.config.targetManager.target) {
KonanTarget.LINUX, KonanTarget.RASPBERRYPI -> KonanTarget.LINUX, KonanTarget.RASPBERRYPI ->
LinuxBasedPlatform(distribution) LinuxBasedPlatform(distribution)
KonanTarget.MACBOOK, KonanTarget.IPHONE, KonanTarget.IPHONE_SIM -> KonanTarget.MACBOOK, KonanTarget.IPHONE, KonanTarget.IPHONE_SIM ->
@@ -199,13 +195,13 @@ internal class LinkStage(val context: Context) {
error("Unexpected target platform: ${context.config.targetManager.target}") error("Unexpected target platform: ${context.config.targetManager.target}")
} }
val optimize = config.get(KonanConfigKeys.OPTIMIZATION) ?: false private val optimize = config.get(KonanConfigKeys.OPTIMIZATION) ?: false
val debug = config.get(KonanConfigKeys.DEBUG) ?: false private val debug = config.get(KonanConfigKeys.DEBUG) ?: false
val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false private val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false
val emitted = context.bitcodeFileName private val emitted = context.bitcodeFileName
val libraries = context.config.libraries private val libraries = context.config.libraries
fun llvmLto(files: List<BitcodeFile>): ObjectFile { private fun llvmLto(files: List<BitcodeFile>): ObjectFile {
val tmpCombined = createTempFile("combined", ".o") val tmpCombined = createTempFile("combined", ".o")
tmpCombined.deleteOnExit() tmpCombined.deleteOnExit()
val combined = tmpCombined.absolutePath val combined = tmpCombined.absolutePath
@@ -224,7 +220,7 @@ internal class LinkStage(val context: Context) {
return combined return combined
} }
fun asLinkerArgs(args: List<String>): List<String> { private fun asLinkerArgs(args: List<String>): List<String> {
if (platform.useCompilerDriverAsLinker) { if (platform.useCompilerDriverAsLinker) {
return args return args
} }
@@ -248,12 +244,12 @@ internal class LinkStage(val context: Context) {
// only seems to be working with dynamic libraries. // only seems to be working with dynamic libraries.
// So we stick to "-alias _main _konan_main" on Mac. // So we stick to "-alias _main _konan_main" on Mac.
// And just do the same on Linux. // And just do the same on Linux.
val entryPointSelector: List<String> private val entryPointSelector: List<String>
get() = if (nomain) emptyList() else platform.entrySelector get() = if (nomain) emptyList() else platform.entrySelector
fun link(objectFiles: List<ObjectFile>, libraryProvidedLinkerFlags: List<String>): ExecutableFile { private fun link(objectFiles: List<ObjectFile>, libraryProvidedLinkerFlags: List<String>): ExecutableFile {
val executable = context.config.outputFile val executable = context.config.outputFile
val linkCommand = platform.linkCommand(objectFiles, executable, optimize, config.getBoolean(KonanConfigKeys.DEBUG)) + val linkCommand = platform.linkCommand(objectFiles, executable, optimize, debug) +
distribution.libffi + distribution.libffi +
asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) + asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) +
entryPointSelector + entryPointSelector +
@@ -270,7 +266,7 @@ internal class LinkStage(val context: Context) {
return executable return executable
} }
fun executeCommand(vararg command: String): Int { private fun executeCommand(vararg command: String): Int {
context.log{""} context.log{""}
context.log{command.asList<String>().joinToString(" ")} context.log{command.asList<String>().joinToString(" ")}
@@ -305,7 +301,7 @@ internal class LinkStage(val context: Context) {
return exitCode return exitCode
} }
fun runTool(vararg command: String) { private fun runTool(vararg command: String) {
val code = executeCommand(*command) val code = executeCommand(*command)
if (code != 0) error("The ${command[0]} command returned non-zero exit code: $code.") if (code != 0) error("The ${command[0]} command returned non-zero exit code: $code.")
} }