Skip to content

Commit 2e5b982

Browse files
Merge pull request #12745 from aschwaighofer/runtime_swift_deallocUninitializedObject
runtime: Add and use swift_deallocUninitializedObject for uninitialized objects
2 parents 6af5d3c + 7a7d329 commit 2e5b982

File tree

7 files changed

+57
-10
lines changed

7 files changed

+57
-10
lines changed

docs/Runtime.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Rename with a non-`stdlib` naming scheme.
7878
000000000001cd30 T _swift_deallocBox
7979
000000000001d490 T _swift_deallocClassInstance
8080
000000000001cd60 T _swift_deallocObject
81+
000000000001cd60 T _swift_deallocUninitializedObject
8182
000000000001d4c0 T _swift_deallocPartialClassInstance
8283
000000000001d400 T _swift_rootObjCDealloc
8384
000000000001c960 T _swift_slowAlloc

include/swift/Runtime/HeapObject.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,22 @@ void swift_deallocObject(HeapObject *object, size_t allocatedSize,
423423
size_t allocatedAlignMask)
424424
SWIFT_CC(RegisterPreservingCC);
425425

426+
/// Deallocate an uninitialized object with a strong reference count of +1.
427+
///
428+
/// It must have been returned by swift_allocObject, but otherwise the object is
429+
/// in an unknown state.
430+
///
431+
/// \param object - never null
432+
/// \param allocatedSize - the allocated size of the object from the
433+
/// program's perspective, i.e. the value
434+
/// \param allocatedAlignMask - the alignment requirement that was passed
435+
/// to allocObject
436+
///
437+
SWIFT_RT_ENTRY_VISIBILITY
438+
void swift_deallocUninitializedObject(HeapObject *object, size_t allocatedSize,
439+
size_t allocatedAlignMask)
440+
SWIFT_CC(RegisterPreservingCC);
441+
426442
/// Deallocate the given memory.
427443
///
428444
/// It must have been returned by swift_allocObject, possibly used as an

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ FUNCTION(DeallocObject, swift_deallocObject, RegisterPreservingCC,
111111
ARGS(RefCountedPtrTy, SizeTy, SizeTy),
112112
ATTRS(NoUnwind))
113113

114+
// void swift_deallocUninitializedObject(HeapObject *obj, size_t size, size_t alignMask);
115+
FUNCTION(DeallocUninitializedObject, swift_deallocUninitializedObject,
116+
RegisterPreservingCC,
117+
RETURNS(VoidTy),
118+
ARGS(RefCountedPtrTy, SizeTy, SizeTy),
119+
ATTRS(NoUnwind))
120+
114121
// void swift_deallocClassInstance(HeapObject *obj, size_t size, size_t alignMask);
115122
FUNCTION(DeallocClassInstance, swift_deallocClassInstance, DefaultCC,
116123
RETURNS(VoidTy),

lib/IRGen/GenHeap.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,14 @@ void irgen::emitDeallocateHeapObject(IRGenFunction &IGF,
168168
{object, size, alignMask});
169169
}
170170

171+
void emitDeallocateUninitializedHeapObject(IRGenFunction &IGF,
172+
llvm::Value *object,
173+
llvm::Value *size,
174+
llvm::Value *alignMask) {
175+
IGF.Builder.CreateCall(IGF.IGM.getDeallocUninitializedObjectFn(),
176+
{object, size, alignMask});
177+
}
178+
171179
void irgen::emitDeallocateClassInstance(IRGenFunction &IGF,
172180
llvm::Value *object,
173181
llvm::Value *size,
@@ -1541,8 +1549,7 @@ class FixedBoxTypeInfoBase : public BoxTypeInfo {
15411549
auto size = layout.emitSize(IGF.IGM);
15421550
auto alignMask = layout.emitAlignMask(IGF.IGM);
15431551

1544-
IGF.emitNativeSetDeallocating(box);
1545-
emitDeallocateHeapObject(IGF, box, size, alignMask);
1552+
emitDeallocateUninitializedHeapObject(IGF, box, size, alignMask);
15461553
}
15471554

15481555
Address

stdlib/public/runtime/HeapObject.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -776,10 +776,15 @@ static inline void memset_pattern8(void *b, const void *pattern8, size_t len) {
776776
}
777777
#endif
778778

779-
void swift::swift_deallocObject(HeapObject *object, size_t allocatedSize,
780-
size_t allocatedAlignMask)
781-
SWIFT_CC(RegisterPreservingCC_IMPL) {
779+
static inline void swift_deallocObjectImpl(HeapObject *object,
780+
size_t allocatedSize,
781+
size_t allocatedAlignMask,
782+
bool isDeiniting) {
782783
assert(isAlignmentMask(allocatedAlignMask));
784+
if (!isDeiniting) {
785+
assert(object->refCounts.isUniquelyReferenced());
786+
object->refCounts.decrementFromOneNonAtomic();
787+
}
783788
assert(object->refCounts.isDeiniting());
784789
SWIFT_RT_TRACK_INVOCATION(object, swift_deallocObject);
785790
#ifdef SWIFT_RUNTIME_CLOBBER_FREED_OBJECTS
@@ -873,6 +878,17 @@ void swift::swift_deallocObject(HeapObject *object, size_t allocatedSize,
873878
}
874879
}
875880

881+
void swift::swift_deallocObject(HeapObject *object, size_t allocatedSize,
882+
size_t allocatedAlignMask) {
883+
swift_deallocObjectImpl(object, allocatedSize, allocatedAlignMask, true);
884+
}
885+
886+
void swift::swift_deallocUninitializedObject(HeapObject *object,
887+
size_t allocatedSize,
888+
size_t allocatedAlignMask) {
889+
swift_deallocObjectImpl(object, allocatedSize, allocatedAlignMask, false);
890+
}
891+
876892
WeakReference *swift::swift_weakInit(WeakReference *ref, HeapObject *value) {
877893
ref->nativeInit(value);
878894
return ref;

test/IRGen/alloc_box.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ func f() -> Bool? { return nil }
1010

1111
// CHECK-LABEL: @_T09alloc_boxyycfU_
1212
// CHECK: <label>:8:
13-
// CHECK: call void @swift_setDeallocating
14-
// CHECK: call void @swift_rt_swift_deallocObject
13+
// CHECK-NOT: call void @swift_setDeallocating
14+
// CHECK: call void @swift_rt_swift_deallocUninitializedObject
1515

test/IRGen/typed_boxes.sil

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ entry:
1515
// CHECK-64: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], [[POD_8_8_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1
1616
// CHECK: [[BOX_DATA_1:%.*]] = bitcast [8 x i8]* [[BOX_DATA]] to i64*
1717
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>, 0
18-
// CHECK: call void @swift_rt_swift_deallocObject(%swift.refcounted* [[BOX]], [[WORD]] 24, [[WORD]] 7)
18+
// CHECK: call void @swift_rt_swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] 24, [[WORD]] 7)
1919
dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.Int64>
2020
return undef : $()
2121
}
@@ -31,7 +31,7 @@ entry:
3131
// CHECK-64: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_8_8_LAYOUT]], [[POD_8_8_LAYOUT]]* [[BOX_RAW]], i32 0, i32 1
3232
// CHECK: [[BOX_DATA_1:%.*]] = bitcast [8 x i8]* [[BOX_DATA]] to double*
3333
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64>, 0
34-
// CHECK: call void @swift_rt_swift_deallocObject(%swift.refcounted* [[BOX]], [[WORD]] 24, [[WORD]] 7)
34+
// CHECK: call void @swift_rt_swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] 24, [[WORD]] 7)
3535
dealloc_box %a : $<τ_0_0> { var τ_0_0 } <Builtin.FPIEEE64>
3636
return undef : $()
3737
}
@@ -51,7 +51,7 @@ entry:
5151
// CHECK: [[BOX_DATA:%.*]] = getelementptr inbounds [[POD_32_32_LAYOUT]], [[POD_32_32_LAYOUT]]* [[BOX_RAW]], i32 0, i32 2
5252
// CHECK: [[BOX_DATA_1:%.*]] = bitcast [32 x i8]* [[BOX_DATA]] to %T11typed_boxes11OverAlignedV*
5353
%b = project_box %a : $<τ_0_0> { var τ_0_0 } <OverAligned>, 0
54-
// CHECK: call void @swift_rt_swift_deallocObject(%swift.refcounted* [[BOX]], [[WORD]] 64, [[WORD]] 31)
54+
// CHECK: call void @swift_rt_swift_deallocUninitializedObject(%swift.refcounted* [[BOX]], [[WORD]] 64, [[WORD]] 31)
5555
dealloc_box %a : $<τ_0_0> { var τ_0_0 } <OverAligned>
5656
return undef : $()
5757
}

0 commit comments

Comments
 (0)