Skip to content

Commit 3f3abfd

Browse files
authored
Merge pull request swiftlang#20389 from atrick/fix-access-sink-2
Make AccessEnforcementOpts more conservative for builtins.
2 parents bc18397 + 2cc250c commit 3f3abfd

File tree

1 file changed

+59
-3
lines changed

1 file changed

+59
-3
lines changed

lib/SILOptimizer/Transforms/AccessEnforcementReleaseSinking.cpp

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,15 @@ static bool isBarrier(SILInstruction *inst) {
7474

7575
// Whitelist the safe builtin categories. Builtins should generally be
7676
// treated conservatively, because introducing a new builtin does not
77-
// require updating all passes to be aware of it. Avoid a default to ensure
78-
// that all categories are covered.
77+
// require updating all passes to be aware of it.
7978
switch (kind.getValue()) {
8079
case BuiltinValueKind::None:
8180
llvm_unreachable("Builtin must has a non-empty kind.");
81+
82+
// Unhandled categories don't generate a case. Instead, they result
83+
// in a build error: enumeration values not handled in switch.
84+
#define BUILTIN(Id, Name, Attrs)
85+
8286
#define BUILTIN_NO_BARRIER(Id) \
8387
case BuiltinValueKind::Id: \
8488
return false;
@@ -100,7 +104,59 @@ static bool isBarrier(SILInstruction *inst) {
100104
#define BUILTIN_RUNTIME_CALL(Id, Name, Attrs) \
101105
case BuiltinValueKind::Id: \
102106
return true; // A runtime call could be anything.
103-
#define BUILTIN_MISC_OPERATION(Id, Name, Attrs, Overload) BUILTIN_NO_BARRIER(Id)
107+
108+
// Handle BUILTIN_MISC_OPERATIONs individually.
109+
case BuiltinValueKind::Sizeof:
110+
case BuiltinValueKind::Strideof:
111+
case BuiltinValueKind::IsPOD:
112+
case BuiltinValueKind::IsBitwiseTakable:
113+
case BuiltinValueKind::IsSameMetatype:
114+
case BuiltinValueKind::Alignof:
115+
case BuiltinValueKind::OnFastPath:
116+
case BuiltinValueKind::ExtractElement:
117+
case BuiltinValueKind::InsertElement:
118+
case BuiltinValueKind::StaticReport:
119+
case BuiltinValueKind::AssertConf:
120+
case BuiltinValueKind::StringObjectOr:
121+
case BuiltinValueKind::UToSCheckedTrunc:
122+
case BuiltinValueKind::SToUCheckedTrunc:
123+
case BuiltinValueKind::SToSCheckedTrunc:
124+
case BuiltinValueKind::UToUCheckedTrunc:
125+
case BuiltinValueKind::SUCheckedConversion:
126+
case BuiltinValueKind::USCheckedConversion:
127+
case BuiltinValueKind::IntToFPWithOverflow:
128+
case BuiltinValueKind::ZeroInitializer:
129+
case BuiltinValueKind::Once:
130+
case BuiltinValueKind::OnceWithContext:
131+
case BuiltinValueKind::GetObjCTypeEncoding:
132+
case BuiltinValueKind::Swift3ImplicitObjCEntrypoint:
133+
case BuiltinValueKind::WillThrow:
134+
return false;
135+
136+
// Handle some rare builtins that may be sensitive to object lifetime
137+
// or deinit side effects conservatively.
138+
case BuiltinValueKind::AllocRaw:
139+
case BuiltinValueKind::DeallocRaw:
140+
case BuiltinValueKind::Fence:
141+
case BuiltinValueKind::AtomicLoad:
142+
case BuiltinValueKind::AtomicStore:
143+
case BuiltinValueKind::AtomicRMW:
144+
case BuiltinValueKind::Unreachable:
145+
case BuiltinValueKind::CmpXChg:
146+
case BuiltinValueKind::CondUnreachable:
147+
case BuiltinValueKind::DestroyArray:
148+
case BuiltinValueKind::CopyArray:
149+
case BuiltinValueKind::TakeArrayNoAlias:
150+
case BuiltinValueKind::TakeArrayFrontToBack:
151+
case BuiltinValueKind::TakeArrayBackToFront:
152+
case BuiltinValueKind::AssignCopyArrayNoAlias:
153+
case BuiltinValueKind::AssignCopyArrayFrontToBack:
154+
case BuiltinValueKind::AssignCopyArrayBackToFront:
155+
case BuiltinValueKind::AssignTakeArray:
156+
case BuiltinValueKind::UnsafeGuaranteed:
157+
case BuiltinValueKind::UnsafeGuaranteedEnd:
158+
return true;
159+
104160
#define BUILTIN_SANITIZER_OPERATION(Id, Name, Attrs) BUILTIN_NO_BARRIER(Id)
105161
#define BUILTIN_TYPE_CHECKER_OPERATION(Id, Name) BUILTIN_NO_BARRIER(Id)
106162
#define BUILTIN_TYPE_TRAIT_OPERATION(Id, Name) BUILTIN_NO_BARRIER(Id)

0 commit comments

Comments
 (0)