@@ -445,15 +445,16 @@ static void emitPackExpansionMetadataPack(IRGenFunction &IGF, Address pack,
445
445
});
446
446
}
447
447
448
- StackAddress
449
- irgen::emitTypeMetadataPack (IRGenFunction &IGF,
450
- CanPackType packType,
448
+ std::pair<StackAddress, llvm::Value *>
449
+ irgen::emitTypeMetadataPack (IRGenFunction &IGF, CanPackType packType,
451
450
DynamicMetadataRequest request) {
452
451
auto *shape = IGF.emitPackShapeExpression (packType);
453
452
454
453
if (auto *constantInt = dyn_cast<llvm::ConstantInt>(shape)) {
455
454
assert (packType->getNumElements () == constantInt->getValue ());
456
- return StackAddress (emitFixedSizeMetadataPackRef (IGF, packType, request));
455
+ auto pack =
456
+ StackAddress (emitFixedSizeMetadataPackRef (IGF, packType, request));
457
+ return {pack, constantInt};
457
458
}
458
459
459
460
assert (packType->containsPackExpansionType ());
@@ -488,7 +489,13 @@ irgen::emitTypeMetadataPack(IRGenFunction &IGF,
488
489
489
490
visitPackExplosion (IGF, packType, visitFn);
490
491
491
- return pack;
492
+ return {pack, shape};
493
+ }
494
+
495
+ static Optional<unsigned > countForShape (llvm::Value *shape) {
496
+ if (auto *constant = dyn_cast<llvm::ConstantInt>(shape))
497
+ return constant->getValue ().getZExtValue ();
498
+ return llvm::None;
492
499
}
493
500
494
501
MetadataResponse
@@ -497,7 +504,10 @@ irgen::emitTypeMetadataPackRef(IRGenFunction &IGF, CanPackType packType,
497
504
if (auto result = tryGetLocalPackTypeMetadata (IGF, packType, request))
498
505
return result;
499
506
500
- auto pack = emitTypeMetadataPack (IGF, packType, request);
507
+ StackAddress pack;
508
+ llvm::Value *shape;
509
+ std::tie (pack, shape) = emitTypeMetadataPack (IGF, packType, request);
510
+
501
511
auto *metadata = pack.getAddress ().getAddress ();
502
512
metadata = IGF.Builder .CreatePointerCast (
503
513
metadata, IGF.IGM .TypeMetadataPtrTy ->getPointerTo ());
@@ -573,15 +583,16 @@ static void emitPackExpansionWitnessTablePack(
573
583
});
574
584
}
575
585
576
- StackAddress irgen::emitWitnessTablePack (IRGenFunction &IGF,
577
- CanPackType packType,
578
- PackConformance *packConformance) {
586
+ std::pair< StackAddress, llvm::Value *>
587
+ irgen::emitWitnessTablePack (IRGenFunction &IGF, CanPackType packType,
588
+ PackConformance *packConformance) {
579
589
auto *shape = IGF.emitPackShapeExpression (packType);
580
590
581
591
if (auto *constantInt = dyn_cast<llvm::ConstantInt>(shape)) {
582
592
assert (packType->getNumElements () == constantInt->getValue ());
583
- return StackAddress (
593
+ auto pack = StackAddress (
584
594
emitFixedSizeWitnessTablePack (IGF, packType, packConformance));
595
+ return {pack, constantInt};
585
596
}
586
597
587
598
assert (packType->containsPackExpansionType ());
@@ -618,16 +629,16 @@ StackAddress irgen::emitWitnessTablePack(IRGenFunction &IGF,
618
629
619
630
visitPackExplosion (IGF, packType, visitFn);
620
631
621
- return pack;
632
+ return { pack, shape} ;
622
633
}
623
634
624
635
void irgen::cleanupWitnessTablePack (IRGenFunction &IGF, StackAddress pack,
625
- Optional< unsigned > elementCount ) {
636
+ llvm::Value *shape ) {
626
637
if (pack.getExtraInfo ()) {
627
638
IGF.emitDeallocateDynamicAlloca (pack);
628
- } else {
639
+ } else if ( auto count = countForShape (shape)) {
629
640
IGF.Builder .CreateLifetimeEnd (pack.getAddress (),
630
- IGF.IGM .getPointerSize () * (*elementCount ));
641
+ IGF.IGM .getPointerSize () * (count. value () ));
631
642
}
632
643
}
633
644
@@ -650,7 +661,9 @@ llvm::Value *irgen::emitWitnessTablePackRef(IRGenFunction &IGF,
650
661
if (auto *wtable = tryGetLocalPackTypeData (IGF, packType, localDataKind))
651
662
return wtable;
652
663
653
- auto pack = emitWitnessTablePack (IGF, packType, conformance);
664
+ StackAddress pack;
665
+ llvm::Value *shape;
666
+ std::tie (pack, shape) = emitWitnessTablePack (IGF, packType, conformance);
654
667
655
668
auto *result = pack.getAddress ().getAddress ();
656
669
result = IGF.Builder .CreatePointerCast (
@@ -1018,14 +1031,13 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
1018
1031
}
1019
1032
}
1020
1033
1021
- void irgen::cleanupTypeMetadataPack (IRGenFunction &IGF,
1022
- StackAddress pack,
1023
- Optional<unsigned > elementCount) {
1034
+ void irgen::cleanupTypeMetadataPack (IRGenFunction &IGF, StackAddress pack,
1035
+ llvm::Value *shape) {
1024
1036
if (pack.getExtraInfo ()) {
1025
1037
IGF.emitDeallocateDynamicAlloca (pack);
1026
- } else {
1038
+ } else if ( auto count = countForShape (shape)) {
1027
1039
IGF.Builder .CreateLifetimeEnd (pack.getAddress (),
1028
- IGF.IGM .getPointerSize () * (*elementCount ));
1040
+ IGF.IGM .getPointerSize () * (*count ));
1029
1041
}
1030
1042
}
1031
1043
0 commit comments