From a4b9e2502c325b86b37719be12ecebc2e2f40503 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 30 Mar 2021 10:48:14 +0300 Subject: [PATCH] Native: don't use frame pointer in leaf functions on ARM64 targets Clang 8 and Clang 11 both have this optimization, but it was moved from LLVM to Clang: https://github.com/llvm/llvm-project/compare/c5b890e922432bd80a5e3c6d82994ef4cdc41900...a0aa58dad53f2e5e90a9b7079ec31bf7c3144fc7 So Kotlin/Native compiler now has to enable this optimization explicitly. --- .../backend/konan/llvm/LlvmAttributes.kt | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmAttributes.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmAttributes.kt index eadb28b3bf4..4cd156f89d8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmAttributes.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmAttributes.kt @@ -11,7 +11,9 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.types.isNothing import org.jetbrains.kotlin.ir.util.isThrowable +import org.jetbrains.kotlin.konan.target.Architecture import org.jetbrains.kotlin.konan.target.Family +import org.jetbrains.kotlin.konan.target.KonanTarget internal fun addLlvmFunctionWithDefaultAttributes( context: Context, @@ -29,7 +31,7 @@ internal fun addLlvmFunctionWithDefaultAttributes( private fun addDefaultLlvmFunctionAttributes(context: Context, llvmFunction: LLVMValueRef) { if (shouldEnforceFramePointer(context)) { // Note: this is default for clang on at least on iOS and macOS. - enforceFramePointer(llvmFunction) + enforceFramePointer(llvmFunction, context) } } @@ -66,6 +68,21 @@ private fun shouldEnforceFramePointer(context: Context): Boolean { } } -private fun enforceFramePointer(llvmFunction: LLVMValueRef) { - LLVMAddTargetDependentFunctionAttr(llvmFunction, "frame-pointer", "all") +private fun enforceFramePointer(llvmFunction: LLVMValueRef, context: Context) { + val target = context.config.target + + // Matches Clang behaviour. + val omitLeafFp = when { + target == KonanTarget.WATCHOS_ARM64 -> false + target.architecture == Architecture.ARM64 -> true + else -> false + } + + val fpKind = if (omitLeafFp) { + "non-leaf" + } else { + "all" + } + + LLVMAddTargetDependentFunctionAttr(llvmFunction, "frame-pointer", fpKind) }