@@ -74,11 +74,15 @@ static bool isBarrier(SILInstruction *inst) {
74
74
75
75
// Whitelist the safe builtin categories. Builtins should generally be
76
76
// 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.
79
78
switch (kind.getValue ()) {
80
79
case BuiltinValueKind::None:
81
80
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
+
82
86
#define BUILTIN_NO_BARRIER (Id ) \
83
87
case BuiltinValueKind::Id: \
84
88
return false ;
@@ -100,7 +104,59 @@ static bool isBarrier(SILInstruction *inst) {
100
104
#define BUILTIN_RUNTIME_CALL (Id, Name, Attrs ) \
101
105
case BuiltinValueKind::Id: \
102
106
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
+
104
160
#define BUILTIN_SANITIZER_OPERATION (Id, Name, Attrs ) BUILTIN_NO_BARRIER(Id)
105
161
#define BUILTIN_TYPE_CHECKER_OPERATION (Id, Name ) BUILTIN_NO_BARRIER(Id)
106
162
#define BUILTIN_TYPE_TRAIT_OPERATION (Id, Name ) BUILTIN_NO_BARRIER(Id)
0 commit comments