diff options
author | Doug Gregor <dgregor@apple.com> | 2021-09-15 13:35:08 -0700 |
---|---|---|
committer | Arnold Schwaighofer <aschwaighofer@apple.com> | 2021-09-16 06:57:45 -0700 |
commit | a773db7d76222ccf4365979e01dd582fd2b5b3df (patch) | |
tree | 7091b4cd91761e1212b209f176e6239068638926 | |
parent | baa18ee63e83ee534a5844e6219665ce42b57707 (diff) | |
download | llvm-a773db7d76222ccf4365979e01dd582fd2b5b3df.zip llvm-a773db7d76222ccf4365979e01dd582fd2b5b3df.tar.gz llvm-a773db7d76222ccf4365979e01dd582fd2b5b3df.tar.bz2 |
Add a command-line flag to control the Swift extended async frame info.
Introduce a new command-line flag `-swift-async-fp={auto|always|never}`
that controls how code generation sets the Swift extended async frame
info bit. There are three possibilities:
* `auto`: which determines how to set the bit based on deployment target, either
statically or dynamically via `swift_async_extendedFramePointerFlags`.
* `always`: the default, always set the bit statically, regardless of deployment
target.
* `never`: never set the bit, regardless of deployment target.
Patch by Doug Gregor <dgregor@apple.com>
Reviewed By: doug.gregor
Differential Revision: https://reviews.llvm.org/D109392
-rw-r--r-- | llvm/include/llvm/CodeGen/CommandFlags.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Target/TargetOptions.h | 16 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CommandFlags.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 32 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 34 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll | 17 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll | 12 |
7 files changed, 99 insertions, 29 deletions
diff --git a/llvm/include/llvm/CodeGen/CommandFlags.h b/llvm/include/llvm/CodeGen/CommandFlags.h index 7ae951e..b0f1438 100644 --- a/llvm/include/llvm/CodeGen/CommandFlags.h +++ b/llvm/include/llvm/CodeGen/CommandFlags.h @@ -74,6 +74,8 @@ llvm::FloatABI::ABIType getFloatABIForCalls(); llvm::FPOpFusion::FPOpFusionMode getFuseFPOps(); +SwiftAsyncFramePointerMode getSwiftAsyncFramePointer(); + bool getDontPlaceZerosInBSS(); bool getEnableGuaranteedTailCallOpt(); diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h index a50da11..7f57108 100644 --- a/llvm/include/llvm/Target/TargetOptions.h +++ b/llvm/include/llvm/Target/TargetOptions.h @@ -110,6 +110,17 @@ namespace llvm { DisableWithDiag // Disable the abort but emit a diagnostic on failure. }; + /// Indicates when and how the Swift async frame pointer bit should be set. + enum class SwiftAsyncFramePointerMode { + /// Determine whether to set the bit statically or dynamically based + /// on the deployment target. + DeploymentBased, + /// Always set the bit. + Always, + /// Never set the bit. + Never, + }; + class TargetOptions { public: TargetOptions() @@ -219,6 +230,11 @@ namespace llvm { /// selection fails to lower/select an instruction. GlobalISelAbortMode GlobalISelAbort = GlobalISelAbortMode::Enable; + /// Control when and how the Swift async frame pointer bit should + /// be set. + SwiftAsyncFramePointerMode SwiftAsyncFramePointer = + SwiftAsyncFramePointerMode::Always; + /// UseInitArray - Use .init_array instead of .ctors for static /// constructors. unsigned UseInitArray : 1; diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp index c30e1c3..8f31630 100644 --- a/llvm/lib/CodeGen/CommandFlags.cpp +++ b/llvm/lib/CodeGen/CommandFlags.cpp @@ -65,6 +65,7 @@ CGOPT(DenormalMode::DenormalModeKind, DenormalFP32Math) CGOPT(bool, EnableHonorSignDependentRoundingFPMath) CGOPT(FloatABI::ABIType, FloatABIForCalls) CGOPT(FPOpFusion::FPOpFusionMode, FuseFPOps) +CGOPT(SwiftAsyncFramePointerMode, SwiftAsyncFramePointer) CGOPT(bool, DontPlaceZerosInBSS) CGOPT(bool, EnableGuaranteedTailCallOpt) CGOPT(bool, DisableTailCalls) @@ -278,6 +279,18 @@ codegen::RegisterCodeGenFlags::RegisterCodeGenFlags() { "Only fuse FP ops when the result won't be affected."))); CGBINDOPT(FuseFPOps); + static cl::opt<SwiftAsyncFramePointerMode> SwiftAsyncFramePointer( + "swift-async-fp", + cl::desc("Determine when the Swift async frame pointer should be set"), + cl::init(SwiftAsyncFramePointerMode::Always), + cl::values(clEnumValN(SwiftAsyncFramePointerMode::DeploymentBased, "auto", + "Determine based on deployment target"), + clEnumValN(SwiftAsyncFramePointerMode::Always, "always", + "Always set the bit"), + clEnumValN(SwiftAsyncFramePointerMode::Never, "never", + "Never set the bit"))); + CGBINDOPT(SwiftAsyncFramePointer); + static cl::opt<bool> DontPlaceZerosInBSS( "nozero-initialized-in-bss", cl::desc("Don't place zero-initialized symbols into bss section"), @@ -539,7 +552,7 @@ codegen::InitTargetOptionsFromCodeGenFlags(const Triple &TheTriple) { Options.ThreadModel = getThreadModel(); Options.EABIVersion = getEABIVersion(); Options.DebuggerTuning = getDebuggerTuningOpt(); - + Options.SwiftAsyncFramePointer = getSwiftAsyncFramePointer(); return Options; } diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index 02421b8..9883f63 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -1158,22 +1158,32 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF, // ORR is sufficient, it is assumed a Swift kernel would initialize the TBI // bits so that is still true. if (HasFP && AFI->hasSwiftAsyncContext()) { - if (Subtarget.swiftAsyncContextIsDynamicallySet()) { - // The special symbol below is absolute and has a *value* that can be - // combined with the frame pointer to signal an extended frame. - BuildMI(MBB, MBBI, DL, TII->get(AArch64::LOADgot), AArch64::X16) - .addExternalSymbol("swift_async_extendedFramePointerFlags", - AArch64II::MO_GOT); - BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), AArch64::FP) - .addUse(AArch64::FP) - .addUse(AArch64::X16) - .addImm(Subtarget.isTargetILP32() ? 32 : 0); - } else { + switch (MF.getTarget().Options.SwiftAsyncFramePointer) { + case SwiftAsyncFramePointerMode::DeploymentBased: + if (Subtarget.swiftAsyncContextIsDynamicallySet()) { + // The special symbol below is absolute and has a *value* that can be + // combined with the frame pointer to signal an extended frame. + BuildMI(MBB, MBBI, DL, TII->get(AArch64::LOADgot), AArch64::X16) + .addExternalSymbol("swift_async_extendedFramePointerFlags", + AArch64II::MO_GOT); + BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), AArch64::FP) + .addUse(AArch64::FP) + .addUse(AArch64::X16) + .addImm(Subtarget.isTargetILP32() ? 32 : 0); + break; + } + LLVM_FALLTHROUGH; + + case SwiftAsyncFramePointerMode::Always: // ORR x29, x29, #0x1000_0000_0000_0000 BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXri), AArch64::FP) .addUse(AArch64::FP) .addImm(0x1100) .setMIFlag(MachineInstr::FrameSetup); + break; + + case SwiftAsyncFramePointerMode::Never: + break; } } diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 15d5f8b..56a4ebe 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -1364,22 +1364,32 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF, unsigned StackProbeSize = STI.getTargetLowering()->getStackProbeSize(MF); if (HasFP && X86FI->hasSwiftAsyncContext()) { - if (STI.swiftAsyncContextIsDynamicallySet()) { - // The special symbol below is absolute and has a *value* suitable to be - // combined with the frame pointer directly. - BuildMI(MBB, MBBI, DL, TII.get(X86::OR64rm), MachineFramePtr) - .addUse(MachineFramePtr) - .addUse(X86::RIP) - .addImm(1) - .addUse(X86::NoRegister) - .addExternalSymbol("swift_async_extendedFramePointerFlags", - X86II::MO_GOTPCREL) - .addUse(X86::NoRegister); - } else { + switch (MF.getTarget().Options.SwiftAsyncFramePointer) { + case SwiftAsyncFramePointerMode::DeploymentBased: + if (STI.swiftAsyncContextIsDynamicallySet()) { + // The special symbol below is absolute and has a *value* suitable to be + // combined with the frame pointer directly. + BuildMI(MBB, MBBI, DL, TII.get(X86::OR64rm), MachineFramePtr) + .addUse(MachineFramePtr) + .addUse(X86::RIP) + .addImm(1) + .addUse(X86::NoRegister) + .addExternalSymbol("swift_async_extendedFramePointerFlags", + X86II::MO_GOTPCREL) + .addUse(X86::NoRegister); + break; + } + LLVM_FALLTHROUGH; + + case SwiftAsyncFramePointerMode::Always: BuildMI(MBB, MBBI, DL, TII.get(X86::BTS64ri8), MachineFramePtr) .addUse(MachineFramePtr) .addImm(60) .setMIFlag(MachineInstr::FrameSetup); + break; + + case SwiftAsyncFramePointerMode::Never: + break; } } diff --git a/llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll b/llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll index 6b17b49..b6be40f 100644 --- a/llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll +++ b/llvm/test/CodeGen/AArch64/swift-dynamic-async-frame.ll @@ -1,15 +1,24 @@ ; RUN: llc -mtriple arm64-apple-ios15.0.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC -; RUN: llc -mtriple arm64-apple-ios14.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC +; RUN: llc -mtriple arm64-apple-ios15.0.0 -swift-async-fp=auto %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple arm64-apple-ios15.0.0 -swift-async-fp=never %s -o - | FileCheck %s --check-prefix=CHECK-NEVER +; RUN: llc -mtriple arm64-apple-ios14.9.0 -swift-async-fp=always %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple arm64-apple-ios14.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple arm64-apple-ios14.9.0 -swift-async-fp=auto %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC ; RUN: llc -mtriple arm64-apple-tvos15.0.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC -; RUN: llc -mtriple arm64-apple-tvos14.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC +; RUN: llc -mtriple arm64-apple-tvos14.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC ; RUN: llc -mtriple arm64-apple-macosx12.0.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC -; RUN: llc -mtriple arm64-apple-macosx11.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC +; RUN: llc -mtriple arm64-apple-macosx11.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC ; RUN: llc -mtriple arm64_32-apple-watchos8.0.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC -; RUN: llc -mtriple arm64_32-apple-watchos7.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC-32 +; RUN: llc -mtriple arm64_32-apple-watchos7.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple arm64_32-apple-watchos7.9.0 -swift-async-fp=auto %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC-32 ; CHECK-STATIC-LABEL: foo: ; CHECK-STATIC: orr x29, x29, #0x1000000000000000 +; CHECK-NEVER-LABEL: foo: +; CHECK-NEVER-NOT: orr x29, x29, #0x1000000000000000 +; CHECK-NEVER-NOT: _swift_async_extendedFramePointerFlags + ; CHECK-DYNAMIC-LABEL: foo: ; CHECK-DYNAMIC: adrp x16, _swift_async_extendedFramePointerFlags@GOTPAGE ; CHECK-DYNAMIC: ldr x16, [x16, _swift_async_extendedFramePointerFlags@GOTPAGEOFF] diff --git a/llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll b/llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll index 8719aee..439b57e 100644 --- a/llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll +++ b/llvm/test/CodeGen/X86/swift-dynamic-async-frame.ll @@ -1,5 +1,11 @@ ; RUN: llc -mtriple x86_64-apple-macosx12.0.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC -; RUN: llc -mtriple x86_64-apple-macosx11.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC +; RUN: llc -mtriple x86_64-apple-macosx12.0.0 -swift-async-fp=always %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple x86_64-apple-macosx12.0.0 -swift-async-fp=auto %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple x86_64-apple-macosx11.9.0 -swift-async-fp=always %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple x86_64-apple-macosx11.9.0 %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple x86_64-apple-macosx11.9.0 -swift-async-fp=auto %s -o - | FileCheck %s --check-prefix=CHECK-DYNAMIC +; RUN: llc -mtriple x86_64-apple-macosx11.9.0 -swift-async-fp=always %s -o - | FileCheck %s --check-prefix=CHECK-STATIC +; RUN: llc -mtriple x86_64-apple-macosx11.9.0 -swift-async-fp=never %s -o - | FileCheck %s --check-prefix=CHECK-NEVER ; CHECK-STATIC-LABEL: foo: ; CHECK-STATIC: btsq $60, %rbp @@ -7,6 +13,10 @@ ; CHECK-DYNAMIC-LABEL: foo: ; CHECK-DYNAMIC: orq _swift_async_extendedFramePointerFlags@GOTPCREL(%rip), %rbp +; CHECK-NEVER-LABEL: foo: +; CHECK-NEVER-NOT: btsq $60, %rbp +; CHECK-NEVER-NOT: _swift_async_extendedFramePointerFlags + define void @foo(i8* swiftasync) "frame-pointer"="all" { ret void } |