Skip to content

Commit 748264c

Browse files
committed
Add a unprotectedStackAlloc builtin
It's like `Builtin.stackAlloc`, but doesn't set the `[stack_protection]` flag on its containing function.
1 parent 9888ffd commit 748264c

File tree

10 files changed

+18
-2
lines changed

10 files changed

+18
-2
lines changed

include/swift/AST/Builtins.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,10 @@ BUILTIN_MISC_OPERATION(DeallocRaw, "deallocRaw", "", Special)
629629
/// is not known at compile time, MaximumAlignment is assumed.
630630
BUILTIN_MISC_OPERATION(StackAlloc, "stackAlloc", "", Special)
631631

632+
/// Like `stackAlloc`, but doesn't set the `[stack_protection]` flag on its
633+
/// containing function.
634+
BUILTIN_MISC_OPERATION(UnprotectedStackAlloc, "unprotectedStackAlloc", "", Special)
635+
632636
/// StackDealloc has type (Builtin.RawPointer) -> ()
633637
///
634638
/// Parameters: address.

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building built
8282
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "MainActor executor building builtin", true)
8383
LANGUAGE_FEATURE(BuiltinCopy, 0, "Builtin.copy()", true)
8484
LANGUAGE_FEATURE(BuiltinStackAlloc, 0, "Builtin.stackAlloc", true)
85+
LANGUAGE_FEATURE(BuiltinUnprotectedStackAlloc, 0, "Builtin.unprotectedStackAlloc", true)
8586
LANGUAGE_FEATURE(BuiltinTaskRunInline, 0, "Builtin.taskRunInline", true)
8687
LANGUAGE_FEATURE(BuiltinUnprotectedAddressOf, 0, "Builtin.unprotectedAddressOf", true)
8788
SUPPRESSIBLE_LANGUAGE_FEATURE(SpecializeAttributeWithAvailability, 0, "@_specialize attribute with availability", true)

lib/AST/ASTPrinter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3020,6 +3020,10 @@ static bool usesFeatureBuiltinStackAlloc(Decl *decl) {
30203020
return false;
30213021
}
30223022

3023+
static bool usesFeatureBuiltinUnprotectedStackAlloc(Decl *decl) {
3024+
return false;
3025+
}
3026+
30233027
static bool usesFeatureBuiltinAssumeAlignment(Decl *decl) {
30243028
return false;
30253029
}

lib/AST/Builtins.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2707,6 +2707,7 @@ ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, Identifier Id) {
27072707
return getDeallocOperation(Context, Id);
27082708

27092709
case BuiltinValueKind::StackAlloc:
2710+
case BuiltinValueKind::UnprotectedStackAlloc:
27102711
return getStackAllocOperation(Context, Id);
27112712
case BuiltinValueKind::StackDealloc:
27122713
return getStackDeallocOperation(Context, Id);

lib/IRGen/IRGenSIL.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3237,7 +3237,8 @@ static Alignment getStackAllocationAlignment(IRGenSILFunction &IGF,
32373237
/// some other builtin.)
32383238
static bool emitStackAllocBuiltinCall(IRGenSILFunction &IGF,
32393239
swift::BuiltinInst *i) {
3240-
if (i->getBuiltinKind() == BuiltinValueKind::StackAlloc) {
3240+
if (i->getBuiltinKind() == BuiltinValueKind::StackAlloc ||
3241+
i->getBuiltinKind() == BuiltinValueKind::UnprotectedStackAlloc) {
32413242
// Stack-allocate a buffer with the specified size/alignment.
32423243
auto loc = i->getLoc().getSourceLoc();
32433244
auto size = getStackAllocationSize(

lib/SIL/IR/OperandOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,7 @@ BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, SRem)
783783
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GenericSRem)
784784
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, SSubOver)
785785
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, StackAlloc)
786+
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, UnprotectedStackAlloc)
786787
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, StackDealloc)
787788
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, SToSCheckedTrunc)
788789
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, SToUCheckedTrunc)

lib/SIL/IR/SILInstruction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,8 @@ bool SILInstruction::isAllocatingStack() const {
12431243
return PA->isOnStack();
12441244

12451245
if (auto *BI = dyn_cast<BuiltinInst>(this)) {
1246-
if (BI->getBuiltinKind() == BuiltinValueKind::StackAlloc) {
1246+
if (BI->getBuiltinKind() == BuiltinValueKind::StackAlloc ||
1247+
BI->getBuiltinKind() == BuiltinValueKind::UnprotectedStackAlloc) {
12471248
return true;
12481249
}
12491250
}

lib/SIL/IR/ValueOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ CONSTANT_OWNERSHIP_BUILTIN(None, AllocRaw)
498498
CONSTANT_OWNERSHIP_BUILTIN(None, AssertConf)
499499
CONSTANT_OWNERSHIP_BUILTIN(None, UToSCheckedTrunc)
500500
CONSTANT_OWNERSHIP_BUILTIN(None, StackAlloc)
501+
CONSTANT_OWNERSHIP_BUILTIN(None, UnprotectedStackAlloc)
501502
CONSTANT_OWNERSHIP_BUILTIN(None, StackDealloc)
502503
CONSTANT_OWNERSHIP_BUILTIN(None, SToSCheckedTrunc)
503504
CONSTANT_OWNERSHIP_BUILTIN(None, SToUCheckedTrunc)

lib/SIL/Utils/MemAccessUtils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,6 +2519,7 @@ static void visitBuiltinAddress(BuiltinInst *builtin,
25192519
case BuiltinValueKind::AllocRaw:
25202520
case BuiltinValueKind::DeallocRaw:
25212521
case BuiltinValueKind::StackAlloc:
2522+
case BuiltinValueKind::UnprotectedStackAlloc:
25222523
case BuiltinValueKind::StackDealloc:
25232524
case BuiltinValueKind::Fence:
25242525
case BuiltinValueKind::StaticReport:

lib/SILOptimizer/Transforms/AccessEnforcementReleaseSinking.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ static bool isBarrier(SILInstruction *inst) {
153153
case BuiltinValueKind::CreateTaskGroupWithFlags:
154154
case BuiltinValueKind::DestroyTaskGroup:
155155
case BuiltinValueKind::StackAlloc:
156+
case BuiltinValueKind::UnprotectedStackAlloc:
156157
case BuiltinValueKind::StackDealloc:
157158
case BuiltinValueKind::AssumeAlignment:
158159
return false;

0 commit comments

Comments
 (0)