@@ -52,8 +52,10 @@ static void dtorTy(Block *, std::byte *Ptr, const Descriptor *) {
5252template <typename T>
5353static void ctorArrayTy (Block *, std::byte *Ptr, bool , bool , bool , bool , bool ,
5454 const Descriptor *D) {
55+ new (Ptr) InitMapPtr (std::nullopt );
56+
5557 if constexpr (needsCtor<T>()) {
56- Ptr += sizeof (InitMap * );
58+ Ptr += sizeof (InitMapPtr );
5759 for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
5860 new (&reinterpret_cast <T *>(Ptr)[I]) T ();
5961 }
@@ -62,8 +64,13 @@ static void ctorArrayTy(Block *, std::byte *Ptr, bool, bool, bool, bool, bool,
6264
6365template <typename T>
6466static void dtorArrayTy (Block *, std::byte *Ptr, const Descriptor *D) {
67+ InitMapPtr &IMP = *reinterpret_cast <InitMapPtr *>(Ptr);
68+
69+ if (IMP)
70+ IMP = std::nullopt ;
71+
6572 if constexpr (needsCtor<T>()) {
66- Ptr += sizeof (InitMap * );
73+ Ptr += sizeof (InitMapPtr );
6774 for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
6875 reinterpret_cast <T *>(Ptr)[I].~T ();
6976 }
@@ -232,6 +239,12 @@ static bool needsRecordDtor(const Record *R) {
232239
233240static BlockCtorFn getCtorPrim (PrimType T) {
234241 switch (T) {
242+ case PT_Float:
243+ return ctorTy<PrimConv<PT_Float>::T>;
244+ case PT_IntAP:
245+ return ctorTy<PrimConv<PT_IntAP>::T>;
246+ case PT_IntAPS:
247+ return ctorTy<PrimConv<PT_IntAPS>::T>;
235248 case PT_Ptr:
236249 return ctorTy<PrimConv<PT_Ptr>::T>;
237250 case PT_MemberPtr:
@@ -244,6 +257,12 @@ static BlockCtorFn getCtorPrim(PrimType T) {
244257
245258static BlockDtorFn getDtorPrim (PrimType T) {
246259 switch (T) {
260+ case PT_Float:
261+ return dtorTy<PrimConv<PT_Float>::T>;
262+ case PT_IntAP:
263+ return dtorTy<PrimConv<PT_IntAP>::T>;
264+ case PT_IntAPS:
265+ return dtorTy<PrimConv<PT_IntAPS>::T>;
247266 case PT_Ptr:
248267 return dtorTy<PrimConv<PT_Ptr>::T>;
249268 case PT_MemberPtr:
@@ -254,16 +273,14 @@ static BlockDtorFn getDtorPrim(PrimType T) {
254273 llvm_unreachable (" Unhandled PrimType" );
255274}
256275
257- static BlockDtorFn getDtorArrayPrim (PrimType T) {
258- switch (T) {
259- case PT_Ptr:
260- return dtorArrayTy<PrimConv<PT_Ptr>::T>;
261- case PT_MemberPtr:
262- return dtorArrayTy<PrimConv<PT_MemberPtr>::T>;
263- default :
264- return nullptr ;
265- }
266- llvm_unreachable (" Unhandled PrimType" );
276+ static BlockCtorFn getCtorArrayPrim (PrimType Type) {
277+ TYPE_SWITCH (Type, return ctorArrayTy<T>);
278+ llvm_unreachable (" unknown Expr" );
279+ }
280+
281+ static BlockDtorFn getDtorArrayPrim (PrimType Type) {
282+ TYPE_SWITCH (Type, return dtorArrayTy<T>);
283+ llvm_unreachable (" unknown Expr" );
267284}
268285
269286// / Primitives.
@@ -285,9 +302,10 @@ Descriptor::Descriptor(const DeclTy &D, PrimType Type, MetadataSize MD,
285302 bool IsMutable)
286303 : Source(D), ElemSize(primSize(Type)), Size(ElemSize * NumElems),
287304 MDSize(MD.value_or(0 )),
288- AllocSize(align(MDSize) + align(Size) + sizeof(InitMap * )), PrimT(Type),
305+ AllocSize(align(MDSize) + align(Size) + sizeof(InitMapPtr )), PrimT(Type),
289306 IsConst(IsConst), IsMutable(IsMutable), IsTemporary(IsTemporary),
290- IsArray(true ), DtorFn(getDtorArrayPrim(Type)) {
307+ IsArray(true ), CtorFn(getCtorArrayPrim(Type)),
308+ DtorFn(getDtorArrayPrim(Type)) {
291309 assert (Source && " Missing source" );
292310 assert (NumElems <= (MaxArrayElemBytes / ElemSize));
293311}
@@ -297,9 +315,10 @@ Descriptor::Descriptor(const DeclTy &D, PrimType Type, MetadataSize MD,
297315 bool IsTemporary, bool IsConst, UnknownSize)
298316 : Source(D), ElemSize(primSize(Type)), Size(UnknownSizeMark),
299317 MDSize(MD.value_or(0 )),
300- AllocSize(MDSize + sizeof (InitMap * ) + alignof(void *)), PrimT(Type),
318+ AllocSize(MDSize + sizeof (InitMapPtr ) + alignof(void *)), PrimT(Type),
301319 IsConst(IsConst), IsMutable(false ), IsTemporary(IsTemporary),
302- IsArray(true ), DtorFn(getDtorArrayPrim(Type)) {
320+ IsArray(true ), CtorFn(getCtorArrayPrim(Type)),
321+ DtorFn(getDtorArrayPrim(Type)) {
303322 assert (Source && " Missing source" );
304323}
305324
@@ -449,16 +468,15 @@ bool Descriptor::hasTrivialDtor() const {
449468
450469bool Descriptor::isUnion () const { return isRecord () && ElemRecord->isUnion (); }
451470
452- InitMap::InitMap (unsigned N) : UninitFields(N) {
453- std::memset (data (), 0 , numFields (N) * sizeof (T));
454- }
471+ InitMap::InitMap (unsigned N)
472+ : UninitFields(N), Data(std::make_unique<T[]>(numFields(N))) {}
455473
456474bool InitMap::initializeElement (unsigned I) {
457475 unsigned Bucket = I / PER_FIELD;
458476 T Mask = T (1 ) << (I % PER_FIELD);
459477 if (!(data ()[Bucket] & Mask)) {
460478 data ()[Bucket] |= Mask;
461- -- UninitFields;
479+ UninitFields -= 1 ;
462480 }
463481 return UninitFields == 0 ;
464482}
0 commit comments