Skip to content

Commit f58c722

Browse files
authored
Merge pull request #20416 from jckarter/more-bridgeobject-xi
Give more extra inhabitants to BridgeObject.
2 parents 7685c70 + ff7afcd commit f58c722

File tree

9 files changed

+54
-70
lines changed

9 files changed

+54
-70
lines changed

lib/IRGen/GenObjC.cpp

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -262,39 +262,6 @@ namespace {
262262
ReferenceCounting getReferenceCounting() const {
263263
return ReferenceCounting::Bridge;
264264
}
265-
266-
// BridgeObject exposes only null as an extra inhabitant for enum layout.
267-
// Other representations are reserved for future use by the stdlib.
268-
269-
bool mayHaveExtraInhabitants(IRGenModule &IGM) const override {
270-
return true;
271-
}
272-
unsigned getFixedExtraInhabitantCount(IRGenModule &IGM) const override {
273-
return 1;
274-
}
275-
APInt getFixedExtraInhabitantValue(IRGenModule &IGM,
276-
unsigned bits,
277-
unsigned index) const override {
278-
return APInt(bits, 0);
279-
}
280-
llvm::Value *getExtraInhabitantIndex(IRGenFunction &IGF, Address src,
281-
SILType T,
282-
bool isOutlined) const override {
283-
src = IGF.Builder.CreateBitCast(src, IGF.IGM.SizeTy->getPointerTo());
284-
auto val = IGF.Builder.CreateLoad(src);
285-
auto isNonzero = IGF.Builder.CreateICmpNE(val,
286-
llvm::ConstantInt::get(IGF.IGM.SizeTy, 0));
287-
// We either have extra inhabitant 0 or no extra inhabitant (-1).
288-
// Conveniently, this is just a sext i1 -> i32 away.
289-
return IGF.Builder.CreateSExt(isNonzero, IGF.IGM.Int32Ty);
290-
}
291-
void storeExtraInhabitant(IRGenFunction &IGF, llvm::Value *index,
292-
Address dest, SILType T, bool isOutlined)
293-
const override {
294-
// There's only one extra inhabitant, 0.
295-
dest = IGF.Builder.CreateBitCast(dest, IGF.IGM.SizeTy->getPointerTo());
296-
IGF.Builder.CreateStore(llvm::ConstantInt::get(IGF.IGM.SizeTy, 0), dest);
297-
}
298265
};
299266
} // end anonymous namespace
300267

stdlib/public/runtime/MetadataImpl.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -407,24 +407,13 @@ struct UnknownObjectRetainableBox
407407
/// A box implementation class for BridgeObject.
408408
struct BridgeObjectBox :
409409
RetainableBoxBase<BridgeObjectBox, void*> {
410-
// TODO: Enable the nil extra inhabitant.
411-
static constexpr unsigned numExtraInhabitants = 1;
412-
413410
static void *retain(void *obj) {
414411
return swift_bridgeObjectRetain(obj);
415412
}
416413

417414
static void release(void *obj) {
418415
swift_bridgeObjectRelease(obj);
419416
}
420-
421-
static void storeExtraInhabitant(void **dest, int index) {
422-
*dest = nullptr;
423-
}
424-
425-
static int getExtraInhabitantIndex(void* const *src) {
426-
return *src == nullptr ? 0 : -1;
427-
}
428417
};
429418

430419
/// A box implementation class for unmanaged, pointer-aligned pointers.

test/Interpreter/struct_extra_inhabitants.swift

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,36 @@ typealias GenericPairWithPointerSecond_AnyObject
113113
var tests = TestSuite("extra inhabitants of structs")
114114

115115
@inline(never)
116-
func expectHasExtraInhabitant<T>(_: T.Type, nil: T?,
116+
func expectHasAtLeastThreeExtraInhabitants<T>(_: T.Type,
117+
nil theNil: T???,
118+
someNil: T???,
119+
someSomeNil: T???,
120+
file: String = #file, line: UInt = #line) {
121+
expectEqual(MemoryLayout<T>.size, MemoryLayout<T???>.size,
122+
"\(T.self) has at least three extra inhabitants",
123+
file: file, line: line)
124+
125+
expectNil(theNil,
126+
"\(T.self) extra inhabitant should agree in generic and concrete " +
127+
"context")
128+
129+
expectNil(someNil!,
130+
"\(T.self) extra inhabitant should agree in generic and concrete " +
131+
"context")
132+
133+
expectNil(someSomeNil!!,
134+
"\(T.self) extra inhabitant should agree in generic and concrete " +
135+
"context")
136+
}
137+
138+
@inline(never)
139+
func expectHasExtraInhabitant<T>(_: T.Type, nil theNil: T?,
117140
file: String = #file, line: UInt = #line) {
118141
expectEqual(MemoryLayout<T>.size, MemoryLayout<T?>.size,
119142
"\(T.self) has extra inhabitant",
120143
file: file, line: line)
121144

122-
expectNil(Optional<T>.none,
145+
expectNil(theNil,
123146
"\(T.self) extra inhabitant should agree in generic and concrete " +
124147
"context")
125148
}
@@ -167,5 +190,10 @@ tests.test("types that have extra inhabitants") {
167190
expectHasExtraInhabitant(GenericFullHouse<UnsafeRawPointer, UnsafeRawPointer>.self, nil: nil)
168191
}
169192

193+
tests.test("types that have more than one extra inhabitant") {
194+
expectHasAtLeastThreeExtraInhabitants(StringAlike64.self, nil: nil, someNil: .some(nil), someSomeNil: .some(.some(nil)))
195+
expectHasAtLeastThreeExtraInhabitants(StringAlike32.self, nil: nil, someNil: .some(nil), someSomeNil: .some(.some(nil)))
196+
}
197+
170198
runAllTests()
171199

validation-test/Reflection/reflect_Array.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ reflect(object: obj)
2828
// CHECK-64: Type info:
2929
// CHECK-64: (class_instance size=24 alignment=8 stride=24 num_extra_inhabitants=0 bitwise_takable=1
3030
// CHECK-64: (field name=t offset=16
31-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
31+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
3232
// (unstable implementation details omitted)
3333

3434
// CHECK-32: Reflecting an object.
@@ -39,7 +39,7 @@ reflect(object: obj)
3939
// CHECK-32: Type info:
4040
// CHECK-32: (class_instance size=12 alignment=4 stride=12 num_extra_inhabitants=0 bitwise_takable=1
4141
// CHECK-32: (field name=t offset=8
42-
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
42+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
4343
// (unstable implementation details omitted)
4444

4545
doneReflecting()

validation-test/Reflection/reflect_Character.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ reflect(object: obj)
2727
// CHECK-64-LABEL: Type info:
2828
// CHECK-64: (class_instance size=32 alignment=8 stride=32 num_extra_inhabitants=0 bitwise_takable=1
2929
// CHECK-64-NEXT: (field name=t offset=16
30-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
30+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
3131
// CHECK-64-NEXT: (field name=_str offset=0
32-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
32+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
3333
// CHECK-64-NEXT: (field name=_guts offset=0
34-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
34+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
3535
// CHECK-64-NEXT: (field name=_object offset=0
36-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
36+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
3737
// CHECK-64-NEXT: (field name=_countAndFlags offset=0
3838
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
3939
// CHECK-64-NEXT: (field name=_storage offset=0
4040
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
4141
// CHECK-64-NEXT: (field name=_value offset=0
4242
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1))))))
4343
// CHECK-64-NEXT: (field name=_object offset=8
44-
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1)))))))))))
44+
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1)))))))))))
4545

4646
// CHECK-32: Reflecting an object.
4747
// CHECK-32: Type reference:

validation-test/Reflection/reflect_Dictionary.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ reflect(object: obj)
2828
// CHECK-64: Type info:
2929
// CHECK-64: (class_instance size=24 alignment=8 stride=24 num_extra_inhabitants=0 bitwise_takable=1
3030
// CHECK-64: (field name=t offset=16
31-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
31+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
3232
// (unstable implementation details omitted)
3333

3434
// CHECK-32: Reflecting an object.
@@ -39,7 +39,7 @@ reflect(object: obj)
3939
// CHECK-32: Type info:
4040
// CHECK-32: (class_instance size=12 alignment=4 stride=12 num_extra_inhabitants=0 bitwise_takable=1
4141
// CHECK-32: (field name=t offset=8
42-
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
42+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
4343
// (unstable implementation details omitted)
4444

4545
doneReflecting()

validation-test/Reflection/reflect_Set.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ reflect(object: obj)
2828
// CHECK-64: Type info:
2929
// CHECK-64: (class_instance size=24 alignment=8 stride=24 num_extra_inhabitants=0 bitwise_takable=1
3030
// CHECK-64: (field name=t offset=16
31-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
31+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
3232
// (unstable implementation details omitted)
3333

3434
// CHECK-32: Reflecting an object.
@@ -39,7 +39,7 @@ reflect(object: obj)
3939
// CHECK-32: Type info:
4040
// CHECK-32: (class_instance size=12 alignment=4 stride=12 num_extra_inhabitants=0 bitwise_takable=1
4141
// CHECK-32: (field name=t offset=8
42-
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
42+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
4343
// (unstable implementation details omitted)
4444

4545
doneReflecting()

validation-test/Reflection/reflect_String.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ reflect(object: obj)
2828
// CHECK-64: Type info:
2929
// CHECK-64-NEXT: (class_instance size=32 alignment=8 stride=32 num_extra_inhabitants=0 bitwise_takable=1
3030
// CHECK-64-NEXT: (field name=t offset=16
31-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
31+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
3232
// (unstable implementation details omitted)
3333

3434
// CHECK-32: Reflecting an object.

validation-test/Reflection/reflect_multiple_types.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,32 +117,32 @@ reflect(object: obj)
117117
// CHECK-64-LABEL: Type info:
118118
// CHECK-64-NEXT: (class_instance size=185 alignment=8 stride=192 num_extra_inhabitants=0 bitwise_takable=1
119119
// CHECK-64-NEXT: (field name=t00 offset=16
120-
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
120+
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
121121
// (unstable implementation details omitted)
122122
// CHECK-64: (field name=t01 offset=24
123123
// CHECK-64-NEXT: (struct size=1 alignment=1 stride=1 num_extra_inhabitants=254 bitwise_takable=1
124124
// CHECK-64-NEXT: (field name=_value offset=0
125125
// CHECK-64-NEXT: (builtin size=1 alignment=1 stride=1 num_extra_inhabitants=254 bitwise_takable=1))))
126126

127127
// CHECK-64-NEXT: (field name=t02 offset=32
128-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
128+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
129129
// CHECK-64-NEXT: (field name=_str offset=0
130-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
130+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
131131
// CHECK-64-NEXT: (field name=_guts offset=0
132-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
132+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
133133
// CHECK-64-NEXT: (field name=_object offset=0
134-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
134+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
135135
// CHECK-64-NEXT: (field name=_countAndFlags offset=0
136136
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
137137
// CHECK-64-NEXT: (field name=_storage offset=0
138138
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
139139
// CHECK-64-NEXT: (field name=_value offset=0
140140
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1))))))
141141
// CHECK-64-NEXT: (field name=_object offset=8
142-
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1))))))))))
142+
// CHECK-64-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1))))))))))
143143

144144
// CHECK-64-NEXT: (field name=t03 offset=48
145-
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
145+
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
146146
// (unstable implementation details omitted)
147147
// CHECK-64: (field name=t04 offset=56
148148
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
@@ -181,12 +181,12 @@ reflect(object: obj)
181181
// CHECK-64-NEXT: (field name=t14 offset=128
182182
// CHECK-64-NEXT: (reference kind=strong refcounting=unknown))
183183
// CHECK-64-NEXT: (field name=t15 offset=136
184-
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1 bitwise_takable=1
184+
// CHECK-64-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647 bitwise_takable=1
185185

186186
// (unstable implementation details omitted)
187187

188188
// CHECK-64: (field name=t16 offset=144
189-
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=1 bitwise_takable=1
189+
// CHECK-64-NEXT: (struct size=16 alignment=8 stride=16 num_extra_inhabitants=2147483647 bitwise_takable=1
190190
// (unstable implementation details omitted)
191191

192192
// CHECK-64: (field name=t17 offset=160
@@ -218,7 +218,7 @@ reflect(object: obj)
218218
// CHECK-32: Type info:
219219
// CHECK-32-NEXT: (class_instance size=121 alignment=8 stride=128 num_extra_inhabitants=0 bitwise_takable=1
220220
// CHECK-32-NEXT: (field name=t00 offset=8
221-
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
221+
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
222222
// (unstable implementation details omitted)
223223
// CHECK-32: (field name=t01 offset=12
224224
// CHECK-32-NEXT: (struct size=1 alignment=1 stride=1 num_extra_inhabitants=254 bitwise_takable=1
@@ -229,7 +229,7 @@ reflect(object: obj)
229229
// CHECK-32-NEXT: (field name=_str offset=0
230230
// (unstable implementation details omitted)
231231
// CHECK-32: (field name=t03 offset=28
232-
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
232+
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
233233
// (unstable implementation details omitted)
234234
// CHECK-32: (field name=t04 offset=32
235235
// CHECK-32-NEXT: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0 bitwise_takable=1
@@ -268,7 +268,7 @@ reflect(object: obj)
268268
// CHECK-32-NEXT: (field name=t14 offset=80
269269
// CHECK-32-NEXT: (reference kind=strong refcounting=unknown))
270270
// CHECK-32-NEXT: (field name=t15 offset=84
271-
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1 bitwise_takable=1
271+
// CHECK-32-NEXT: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096 bitwise_takable=1
272272
// (unstable implementation details omitted)
273273
// CHECK-32: (field name=t16 offset=88
274274
// CHECK-32-NEXT: (struct size=12 alignment=4 stride=12 num_extra_inhabitants=128 bitwise_takable=1

0 commit comments

Comments
 (0)