@@ -51,6 +51,10 @@ LayoutConstraint getLayoutConstraint(Identifier ID, ASTContext &Ctx) {
5151 return LayoutConstraint::getLayoutConstraint (
5252 LayoutConstraintKind::BridgeObject, Ctx);
5353
54+ if (ID == Ctx.Id_TrivialStrideLayout )
55+ return LayoutConstraint::getLayoutConstraint (
56+ LayoutConstraintKind::TrivialStride, 0 , 0 , Ctx);
57+
5458 return LayoutConstraint::getLayoutConstraint (
5559 LayoutConstraintKind::UnknownLayout, Ctx);
5660}
@@ -79,6 +83,8 @@ StringRef LayoutConstraintInfo::getName(LayoutConstraintKind Kind, bool internal
7983 return " _Trivial" ;
8084 case LayoutConstraintKind::BridgeObject:
8185 return " _BridgeObject" ;
86+ case LayoutConstraintKind::TrivialStride:
87+ return " _TrivialStride" ;
8288 }
8389
8490 llvm_unreachable (" Unhandled LayoutConstraintKind in switch." );
@@ -112,8 +118,9 @@ bool LayoutConstraintInfo::isAddressOnlyTrivial(LayoutConstraintKind Kind) {
112118}
113119
114120bool LayoutConstraintInfo::isTrivial (LayoutConstraintKind Kind) {
115- return Kind > LayoutConstraintKind::UnknownLayout &&
116- Kind <= LayoutConstraintKind::Trivial;
121+ return (Kind > LayoutConstraintKind::UnknownLayout &&
122+ Kind <= LayoutConstraintKind::Trivial) ||
123+ Kind == LayoutConstraintKind::TrivialStride;
117124}
118125
119126bool LayoutConstraintInfo::isRefCountedObject (LayoutConstraintKind Kind) {
@@ -150,6 +157,10 @@ bool LayoutConstraintInfo::isBridgeObject(LayoutConstraintKind Kind) {
150157 return Kind == LayoutConstraintKind::BridgeObject;
151158}
152159
160+ bool LayoutConstraintInfo::isTrivialStride (LayoutConstraintKind Kind) {
161+ return Kind == LayoutConstraintKind::TrivialStride;
162+ }
163+
153164SourceRange LayoutConstraintLoc::getSourceRange () const { return getLoc (); }
154165
155166#define MERGE_LOOKUP (lhs, rhs ) \
@@ -180,55 +191,64 @@ static LayoutConstraintKind mergeTable[unsigned(E(LastLayout)) +
180191 E (/* TrivialOfAtMostSize */ TrivialOfAtMostSize), E (/* Trivial */ Trivial),
181192 E (/* Class */ Class), E (/* NativeClass */ NativeClass),
182193 E (/* RefCountedObject*/ RefCountedObject),
183- E (/* NativeRefCountedObject */ NativeRefCountedObject), MERGE_CONFLICT},
194+ E (/* NativeRefCountedObject */ NativeRefCountedObject), MERGE_CONFLICT,
195+ MERGE_CONFLICT},
184196
185197 // Initialize the row for TrivialOfExactSize.
186198 {E (/* UnknownLayout */ TrivialOfExactSize),
187199 E (/* TrivialOfExactSize */ TrivialOfExactSize), MERGE_CONFLICT,
188200 E (/* Trivial */ TrivialOfExactSize), MERGE_CONFLICT, MERGE_CONFLICT,
189- MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT},
201+ MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT },
190202
191203 // Initialize the row for TrivialOfAtMostSize.
192204 {E (/* UnknownLayout */ TrivialOfAtMostSize), MERGE_CONFLICT,
193205 E (/* TrivialOfAtMostSize */ TrivialOfAtMostSize),
194206 E (/* Trivial */ TrivialOfAtMostSize), MERGE_CONFLICT, MERGE_CONFLICT,
195- MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT},
207+ MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT },
196208
197209 // Initialize the row for Trivial.
198210 {E (/* UnknownLayout */ Trivial),
199211 E (/* TrivialOfExactSize */ TrivialOfExactSize),
200212 E (/* TrivialOfAtMostSize */ TrivialOfAtMostSize), E (/* Trivial */ Trivial),
201213 MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT,
202- MERGE_CONFLICT},
214+ MERGE_CONFLICT, MERGE_CONFLICT },
203215
204216 // Initialize the row for Class.
205217 {E (/* UnknownLayout*/ Class), MERGE_CONFLICT, MERGE_CONFLICT,
206218 MERGE_CONFLICT, E (/* Class */ Class), E (/* NativeClass */ NativeClass),
207219 E (/* RefCountedObject */ Class),
208- E (/* NativeRefCountedObject */ NativeClass), MERGE_CONFLICT},
220+ E (/* NativeRefCountedObject */ NativeClass), MERGE_CONFLICT,
221+ MERGE_CONFLICT},
209222
210223 // Initialize the row for NativeClass.
211224 {E (/* UnknownLayout */ NativeClass), MERGE_CONFLICT, MERGE_CONFLICT,
212225 MERGE_CONFLICT, E (/* Class */ NativeClass),
213226 E (/* NativeClass */ NativeClass), E (/* RefCountedObject */ NativeClass),
214- E (/* NativeRefCountedObject */ NativeClass), MERGE_CONFLICT},
227+ E (/* NativeRefCountedObject */ NativeClass), MERGE_CONFLICT,
228+ MERGE_CONFLICT},
215229
216230 // Initialize the row for RefCountedObject.
217231 {E (/* UnknownLayout */ RefCountedObject), MERGE_CONFLICT, MERGE_CONFLICT,
218232 MERGE_CONFLICT, E (/* Class */ Class), E (/* NativeClass */ NativeClass),
219233 E (/* RefCountedObject */ RefCountedObject),
220- E (/* NativeRefCountedObject */ NativeRefCountedObject), MERGE_CONFLICT},
234+ E (/* NativeRefCountedObject */ NativeRefCountedObject), MERGE_CONFLICT,
235+ MERGE_CONFLICT},
221236
222237 // Initialize the row for NativeRefCountedObject.
223238 {E (/* UnknownLayout */ NativeRefCountedObject), MERGE_CONFLICT,
224239 MERGE_CONFLICT, MERGE_CONFLICT, E (/* Class */ NativeClass),
225240 E (/* NativeClass */ NativeClass),
226241 E (/* RefCountedObject */ NativeRefCountedObject),
227- E (/* NativeRefCountedObject*/ NativeRefCountedObject), MERGE_CONFLICT},
242+ E (/* NativeRefCountedObject*/ NativeRefCountedObject), MERGE_CONFLICT,
243+ MERGE_CONFLICT},
228244
229245 {E (BridgeObject), MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT,
230246 MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT,
231- E (/* BridgeObject*/ BridgeObject)},
247+ E (/* BridgeObject*/ BridgeObject), MERGE_CONFLICT},
248+
249+ {E (TrivialStride), MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT,
250+ MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT, MERGE_CONFLICT,
251+ MERGE_CONFLICT, E (/* TrivialStride*/ TrivialStride)},
232252};
233253
234254#undef E
@@ -324,6 +344,7 @@ LayoutConstraint::merge(LayoutConstraint Other) {
324344LayoutConstraint
325345LayoutConstraint::getLayoutConstraint (LayoutConstraintKind Kind) {
326346 assert (!LayoutConstraintInfo::isKnownSizeTrivial (Kind));
347+ assert (!LayoutConstraintInfo::isTrivialStride (Kind));
327348 switch (Kind) {
328349 case LayoutConstraintKind::Trivial:
329350 return LayoutConstraint (&LayoutConstraintInfo::TrivialConstraintInfo);
@@ -343,6 +364,7 @@ LayoutConstraint::getLayoutConstraint(LayoutConstraintKind Kind) {
343364 return LayoutConstraint (&LayoutConstraintInfo::BridgeObjectConstraintInfo);
344365 case LayoutConstraintKind::TrivialOfAtMostSize:
345366 case LayoutConstraintKind::TrivialOfExactSize:
367+ case LayoutConstraintKind::TrivialStride:
346368 llvm_unreachable (" Wrong layout constraint kind" );
347369 }
348370 llvm_unreachable (" unhandled kind" );
0 commit comments