@@ -40,10 +40,16 @@ enum class LayoutConstraintKind : unsigned char {
40
40
TrivialOfAtMostSize,
41
41
// It is a layout constraint representing a trivial type of an unknown size.
42
42
Trivial,
43
+ // It is a layout constraint representing a reference counted class instance.
44
+ Class,
45
+ // It is a layout constraint representing a reference counted native class
46
+ // instance.
47
+ NativeClass,
43
48
// It is a layout constraint representing a reference counted object.
44
49
RefCountedObject,
45
50
// It is a layout constraint representing a native reference counted object.
46
51
NativeRefCountedObject,
52
+ LastLayout = NativeRefCountedObject,
47
53
};
48
54
49
55
// / This is a class representing the layout constraint.
@@ -108,6 +114,22 @@ class LayoutConstraintInfo : public llvm::FoldingSetNode {
108
114
return isNativeRefCountedObject (Kind);
109
115
}
110
116
117
+ bool isClass () const {
118
+ return isClass (Kind);
119
+ }
120
+
121
+ bool isNativeClass () const {
122
+ return isNativeClass (Kind);
123
+ }
124
+
125
+ bool isRefCounted () const {
126
+ return isRefCounted (Kind);
127
+ }
128
+
129
+ bool isNativeRefCounted () const {
130
+ return isNativeRefCounted (Kind);
131
+ }
132
+
111
133
unsigned getTrivialSizeInBytes () const {
112
134
assert (isKnownSizeTrivial ());
113
135
return (SizeInBits + 7 ) / 8 ;
@@ -170,6 +192,16 @@ class LayoutConstraintInfo : public llvm::FoldingSetNode {
170
192
171
193
static bool isNativeRefCountedObject (LayoutConstraintKind Kind);
172
194
195
+ static bool isAnyRefCountedObject (LayoutConstraintKind Kind);
196
+
197
+ static bool isClass (LayoutConstraintKind Kind);
198
+
199
+ static bool isNativeClass (LayoutConstraintKind Kind);
200
+
201
+ static bool isRefCounted (LayoutConstraintKind Kind);
202
+
203
+ static bool isNativeRefCounted (LayoutConstraintKind Kind);
204
+
173
205
// / Uniquing for the LayoutConstraintInfo.
174
206
void Profile (llvm::FoldingSetNodeID &ID) {
175
207
Profile (ID, Kind, SizeInBits, Alignment);
@@ -189,6 +221,14 @@ class LayoutConstraintInfo : public llvm::FoldingSetNode {
189
221
void *operator new (size_t bytes, const ASTContext &ctx,
190
222
AllocationArena arena, unsigned alignment = 8 );
191
223
void *operator new (size_t Bytes, void *Mem) throw () { return Mem; }
224
+
225
+ // Representation of the non-parametrized layouts.
226
+ static LayoutConstraintInfo UnknownLayoutConstraintInfo;
227
+ static LayoutConstraintInfo RefCountedObjectConstraintInfo;
228
+ static LayoutConstraintInfo NativeRefCountedObjectConstraintInfo;
229
+ static LayoutConstraintInfo ClassConstraintInfo;
230
+ static LayoutConstraintInfo NativeClassConstraintInfo;
231
+ static LayoutConstraintInfo TrivialConstraintInfo;
192
232
};
193
233
194
234
// / A wrapper class containing a reference to the actual LayoutConstraintInfo
@@ -204,19 +244,25 @@ class LayoutConstraint {
204
244
static LayoutConstraint getLayoutConstraint (LayoutConstraintKind Kind,
205
245
ASTContext &C);
206
246
247
+ static LayoutConstraint getLayoutConstraint (LayoutConstraintKind Kind);
248
+
207
249
static LayoutConstraint getLayoutConstraint (LayoutConstraintKind Kind,
208
250
unsigned SizeInBits,
209
251
unsigned Alignment,
210
252
ASTContext &C);
211
253
212
- static LayoutConstraint getUnknownLayout (ASTContext &C );
254
+ static LayoutConstraint getUnknownLayout ();
213
255
214
256
LayoutConstraintInfo *getPointer () const { return Ptr; }
215
257
216
258
bool isNull () const { return Ptr == 0 ; }
217
259
218
260
LayoutConstraintInfo *operator ->() const { return Ptr; }
219
261
262
+ // / Merge these two constraints and return a more specific one
263
+ // / or fail if they’re incompatible and return an unknown constraint.
264
+ LayoutConstraint merge (LayoutConstraint Other);
265
+
220
266
explicit operator bool () const { return Ptr != 0 ; }
221
267
222
268
void dump () const ;
0 commit comments