forked from OSchip/llvm-project
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
This commit is contained in:
parent
baa18ee63e
commit
a773db7d76
|
@ -74,6 +74,8 @@ llvm::FloatABI::ABIType getFloatABIForCalls();
|
|||
|
||||
llvm::FPOpFusion::FPOpFusionMode getFuseFPOps();
|
||||
|
||||
SwiftAsyncFramePointerMode getSwiftAsyncFramePointer();
|
||||
|
||||
bool getDontPlaceZerosInBSS();
|
||||
|
||||
bool getEnableGuaranteedTailCallOpt();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue