From 23c1c3c2938888b21e092c338949d489b1c6238d Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Mon, 15 Jul 2019 12:05:13 +0700 Subject: [PATCH] [targets] Pick target CPU in LLVM optimization pipeline based on runtime.bc --- .../backend/konan/OptimizationPipeline.kt | 26 +++++++++++++------ konan/konan.properties | 4 +-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt index 1faa63cd258..9486a9a1c10 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt @@ -41,25 +41,35 @@ private class LlvmPipelineConfiguration(context: Context) { val targetTriple: String = context.llvm.targetTriple - val cpuArchitecture: String = when (target) { - KonanTarget.IOS_ARM32 -> "armv7" - KonanTarget.IOS_ARM64 -> "arm64" + // Most of these values are copied from corresponding runtime.bc + // Which is using "generic" target CPU for many case. + // This approach is suboptimal because target-cpu="generic" limits + // the set of used cpu features. + // TODO: refactor KonanTarget so that we can explicitly specify + // target cpu or arch+features combination in a single place. + val cpuModel: String = when (target) { + KonanTarget.IOS_ARM32 -> "generic" + KonanTarget.IOS_ARM64 -> "cyclone" KonanTarget.IOS_X64 -> "core2" KonanTarget.LINUX_X64 -> "x86-64" KonanTarget.MINGW_X86 -> "pentium4" KonanTarget.MINGW_X64 -> "x86-64" KonanTarget.MACOS_X64 -> "core2" KonanTarget.LINUX_ARM32_HFP -> "arm1136jf-s" - KonanTarget.LINUX_ARM64 -> "cortex-a57" - KonanTarget.ANDROID_ARM32 -> "armv7" - KonanTarget.ANDROID_ARM64 -> "arm64" + KonanTarget.LINUX_ARM64 -> "generic" + KonanTarget.ANDROID_ARM32 -> "arm7tdmi" + KonanTarget.ANDROID_ARM64 -> "cortex-a57" KonanTarget.LINUX_MIPS32 -> "mips32r2" KonanTarget.LINUX_MIPSEL32 -> "mips32r2" KonanTarget.WASM32, is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.") } - val cpuFeatures: String = "" + val cpuFeatures: String = when (target) { + KonanTarget.LINUX_ARM32_HFP -> "+dsp,+strict-align,+vfp2,-crypto,-d16,-fp-armv8,-fp-only-sp,-fp16,-neon,-thumb-mode,-vfp3,-vfp4" + KonanTarget.ANDROID_ARM32 -> "+soft-float,+strict-align,-crypto,-neon,-thumb-mode" + else -> "" + } val customInlineThreshold: Int? = when { context.shouldOptimize() -> 100 @@ -122,7 +132,7 @@ internal fun runLlvmOptimizationPipeline(context: Context) { val targetMachine = LLVMCreateTargetMachine( target.value, config.targetTriple, - config.cpuArchitecture, + config.cpuModel, config.cpuFeatures, config.codegenOptimizationLevel, config.relocMode, diff --git a/konan/konan.properties b/konan/konan.properties index 5ef859c3e9f..153ec7f6469 100644 --- a/konan/konan.properties +++ b/konan/konan.properties @@ -365,7 +365,7 @@ dependencies.mingw_x64-android_arm32 = \ quadruple.android_arm32 = arm-linux-androideabi entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main -clangFlags.android_arm32 = -cc1 -emit-obj -disable-llvm-optzns -x ir -femulated-tls -mrelocation-model pic +clangFlags.android_arm32 = -cc1 -target-cpu arm7tdmi -emit-obj -disable-llvm-optzns -x ir -femulated-tls -mrelocation-model pic clangOptFlags.android_arm32 = -O3 -ffunction-sections linkerNoDebugFlags.android_arm32 = -Wl,-S clangNooptFlags.android_arm32 = -O1 @@ -395,7 +395,7 @@ dependencies.mingw_x64-android_arm64 = \ quadruple.android_arm64 = aarch64-linux-android entrySelector.android_arm64 = -Wl,--defsym -Wl,main=Konan_main -clangFlags.android_arm64 = -cc1 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic +clangFlags.android_arm64 = -cc1 -target-cpu cortex-a57 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic targetSysRoot.android_arm64 = target-sysroot-21-android_arm64 linkerKonanFlags.android_arm64 = -lm -latomic -lstdc++ -landroid linkerNoDebugFlags.android_arm64 = -Wl,-S