@@ -110,6 +110,12 @@ enum IsAddressableForDependencies_t : bool {
110
110
IsAddressableForDependencies = true ,
111
111
};
112
112
113
+ // / Is a lowered SIL type a struct with `@_rawLayout` or contains such a struct?
114
+ enum HasRawLayout_t : bool {
115
+ DoesNotHaveRawLayout = false ,
116
+ HasRawLayout = true
117
+ };
118
+
113
119
class SILTypeProperties {
114
120
// These are chosen so that bitwise-or merges the flags properly.
115
121
//
@@ -125,6 +131,7 @@ class SILTypeProperties {
125
131
LexicalFlag = 1 << 7 ,
126
132
HasPackFlag = 1 << 8 ,
127
133
AddressableForDependenciesFlag = 1 << 9 ,
134
+ HasRawLayoutFlag = 1 << 10 ,
128
135
};
129
136
// clang-format on
130
137
@@ -142,7 +149,8 @@ class SILTypeProperties {
142
149
IsNotTypeExpansionSensitive,
143
150
HasRawPointer_t hasRawPointer = DoesNotHaveRawPointer,
144
151
IsLexical_t isLexical = IsNotLexical, HasPack_t hasPack = HasNoPack,
145
- IsAddressableForDependencies_t isAFD = IsNotAddressableForDependencies)
152
+ IsAddressableForDependencies_t isAFD = IsNotAddressableForDependencies,
153
+ HasRawLayout_t hasRawLayout = DoesNotHaveRawLayout)
146
154
: Flags((isTrivial ? 0U : NonTrivialFlag) |
147
155
(isFixedABI ? 0U : NonFixedABIFlag) |
148
156
(isAddressOnly ? AddressOnlyFlag : 0U ) |
@@ -151,7 +159,8 @@ class SILTypeProperties {
151
159
(hasRawPointer ? HasRawPointerFlag : 0U ) |
152
160
(isLexical ? LexicalFlag : 0U ) |
153
161
(hasPack ? HasPackFlag : 0U ) |
154
- (isAFD ? AddressableForDependenciesFlag : 0U )) {}
162
+ (isAFD ? AddressableForDependenciesFlag : 0U ) |
163
+ (hasRawLayout ? HasRawLayoutFlag : 0U )) {}
155
164
156
165
constexpr bool operator ==(SILTypeProperties p) const {
157
166
return Flags == p.Flags ;
@@ -180,7 +189,7 @@ class SILTypeProperties {
180
189
static constexpr SILTypeProperties forOpaque () {
181
190
return {IsNotTrivial, IsNotFixedABI, IsAddressOnly, IsNotResilient,
182
191
IsNotTypeExpansionSensitive, HasRawPointer, IsLexical,
183
- HasNoPack, IsAddressableForDependencies};
192
+ HasNoPack, IsAddressableForDependencies, HasRawLayout };
184
193
}
185
194
186
195
static constexpr SILTypeProperties forResilient () {
@@ -228,6 +237,9 @@ class SILTypeProperties {
228
237
return IsAddressableForDependencies_t (
229
238
(Flags & AddressableForDependenciesFlag) != 0 );
230
239
}
240
+ HasRawLayout_t isOrContainsRawLayout () const {
241
+ return HasRawLayout_t ((Flags & HasRawLayoutFlag) != 0 );
242
+ }
231
243
232
244
void setNonTrivial () { Flags |= NonTrivialFlag; }
233
245
void setIsOrContainsRawPointer () { Flags |= HasRawPointerFlag; }
@@ -247,6 +259,9 @@ class SILTypeProperties {
247
259
void setAddressableForDependencies () {
248
260
Flags |= AddressableForDependenciesFlag;
249
261
}
262
+ void setHasRawLayout () {
263
+ Flags |= HasRawLayoutFlag;
264
+ }
250
265
};
251
266
252
267
} // end namespace swift
0 commit comments