22
22
// ===----------------------------------------------------------------------===//
23
23
24
24
#include " swift/AST/ASTContext.h"
25
+ #include " swift/AST/IRGenOptions.h"
25
26
#include " swift/AST/Types.h"
26
27
#include " swift/IRGen/Linking.h"
27
28
#include " swift/SIL/TypeLowering.h"
@@ -449,7 +450,13 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
449
450
Address dest = getArgAs (IGF, argv, type, " dest" );
450
451
Address src = getArgAs (IGF, argv, type, " src" );
451
452
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
452
- type.assignWithCopy (IGF, dest, src, concreteType, true );
453
+
454
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
455
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
456
+ typeLayoutEntry.assignWithCopy (IGF, dest, src);
457
+ } else {
458
+ type.assignWithCopy (IGF, dest, src, concreteType, true );
459
+ }
453
460
dest = IGF.Builder .CreateBitCast (dest, IGF.IGM .OpaquePtrTy );
454
461
IGF.Builder .CreateRet (dest.getAddress ());
455
462
return ;
@@ -459,7 +466,12 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
459
466
Address dest = getArgAs (IGF, argv, type, " dest" );
460
467
Address src = getArgAs (IGF, argv, type, " src" );
461
468
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
462
- type.assignWithTake (IGF, dest, src, concreteType, true );
469
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
470
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
471
+ typeLayoutEntry.assignWithTake (IGF, dest, src);
472
+ } else {
473
+ type.assignWithTake (IGF, dest, src, concreteType, true );
474
+ }
463
475
dest = IGF.Builder .CreateBitCast (dest, IGF.IGM .OpaquePtrTy );
464
476
IGF.Builder .CreateRet (dest.getAddress ());
465
477
return ;
@@ -468,7 +480,12 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
468
480
case ValueWitness::Destroy: {
469
481
Address object = getArgAs (IGF, argv, type, " object" );
470
482
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
471
- type.destroy (IGF, object, concreteType, true );
483
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
484
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
485
+ typeLayoutEntry.destroy (IGF, object);
486
+ } else {
487
+ type.destroy (IGF, object, concreteType, true );
488
+ }
472
489
IGF.Builder .CreateRetVoid ();
473
490
return ;
474
491
}
@@ -478,20 +495,30 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
478
495
Address src = getArgAsBuffer (IGF, argv, " src" );
479
496
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
480
497
481
- Address result =
482
- emitInitializeBufferWithCopyOfBuffer (IGF, dest, src, concreteType,
483
- type, packing);
484
- result = IGF.Builder .CreateBitCast (result, IGF.IGM .OpaquePtrTy );
485
- IGF.Builder .CreateRet (result.getAddress ());
498
+ llvm::Value *objectPtr = nullptr ;
499
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
500
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
501
+ objectPtr = typeLayoutEntry.initBufferWithCopyOfBuffer (IGF, dest, src);
502
+ } else {
503
+ Address result = emitInitializeBufferWithCopyOfBuffer (
504
+ IGF, dest, src, concreteType, type, packing);
505
+ result = IGF.Builder .CreateBitCast (result, IGF.IGM .OpaquePtrTy );
506
+ objectPtr = result.getAddress ();
507
+ }
508
+ IGF.Builder .CreateRet (objectPtr);
486
509
return ;
487
510
}
488
511
489
512
case ValueWitness::InitializeWithCopy: {
490
513
Address dest = getArgAs (IGF, argv, type, " dest" );
491
514
Address src = getArgAs (IGF, argv, type, " src" );
492
515
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
493
-
494
- type.initializeWithCopy (IGF, dest, src, concreteType, true );
516
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
517
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
518
+ typeLayoutEntry.initWithCopy (IGF, dest, src);
519
+ } else {
520
+ type.initializeWithCopy (IGF, dest, src, concreteType, true );
521
+ }
495
522
dest = IGF.Builder .CreateBitCast (dest, IGF.IGM .OpaquePtrTy );
496
523
IGF.Builder .CreateRet (dest.getAddress ());
497
524
return ;
@@ -502,7 +529,12 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
502
529
Address src = getArgAs (IGF, argv, type, " src" );
503
530
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
504
531
505
- type.initializeWithTake (IGF, dest, src, concreteType, true );
532
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
533
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
534
+ typeLayoutEntry.initWithTake (IGF, dest, src);
535
+ } else {
536
+ type.initializeWithTake (IGF, dest, src, concreteType, true );
537
+ }
506
538
dest = IGF.Builder .CreateBitCast (dest, IGF.IGM .OpaquePtrTy );
507
539
IGF.Builder .CreateRet (dest.getAddress ());
508
540
return ;
@@ -518,7 +550,14 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
518
550
value = IGF.Builder .CreateBitCast (value, enumTy);
519
551
auto enumAddr = type.getAddressForPointer (value);
520
552
521
- llvm::Value *result = strategy.emitGetEnumTag (IGF, concreteType, enumAddr);
553
+ llvm::Value *result;
554
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
555
+ const auto *enumTypeLayoutEntry = typeLayoutEntry.getAsEnum ();
556
+ if (enumTypeLayoutEntry && IGM.getOptions ().UseTypeLayoutValueHandling ) {
557
+ result = enumTypeLayoutEntry->getEnumTag (IGF, enumAddr);
558
+ } else {
559
+ result = strategy.emitGetEnumTag (IGF, concreteType, enumAddr);
560
+ }
522
561
IGF.Builder .CreateRet (result);
523
562
return ;
524
563
}
@@ -530,9 +569,15 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
530
569
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
531
570
532
571
if (!strategy.getElementsWithPayload ().empty ()) {
533
- strategy.destructiveProjectDataForLoad (
534
- IGF, concreteType,
535
- Address (value, type.getBestKnownAlignment ()));
572
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
573
+ const auto *enumTypeLayoutEntry = typeLayoutEntry.getAsEnum ();
574
+ if (enumTypeLayoutEntry && IGM.getOptions ().UseTypeLayoutValueHandling ) {
575
+ enumTypeLayoutEntry->destructiveProjectEnumData (
576
+ IGF, Address (value, type.getBestKnownAlignment ()));
577
+ } else {
578
+ strategy.destructiveProjectDataForLoad (
579
+ IGF, concreteType, Address (value, type.getBestKnownAlignment ()));
580
+ }
536
581
}
537
582
538
583
IGF.Builder .CreateRetVoid ();
@@ -550,10 +595,15 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
550
595
llvm::Value *tag = getArg (argv, " tag" );
551
596
552
597
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
553
-
554
- strategy.emitStoreTag (IGF, concreteType,
555
- Address (value, type.getBestKnownAlignment ()),
556
- tag);
598
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
599
+ const auto *enumTypeLayoutEntry = typeLayoutEntry.getAsEnum ();
600
+ if (enumTypeLayoutEntry && IGM.getOptions ().UseTypeLayoutValueHandling ) {
601
+ enumTypeLayoutEntry->destructiveInjectEnumTag (
602
+ IGF, tag, Address (value, type.getBestKnownAlignment ()));
603
+ } else {
604
+ strategy.emitStoreTag (IGF, concreteType,
605
+ Address (value, type.getBestKnownAlignment ()), tag);
606
+ }
557
607
558
608
IGF.Builder .CreateRetVoid ();
559
609
return ;
@@ -567,11 +617,18 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
567
617
llvm::Value *numEmptyCases = getArg (argv, " numEmptyCases" );
568
618
569
619
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
620
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
621
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
622
+ auto *idx = typeLayoutEntry.getEnumTagSinglePayload (
623
+ IGF, numEmptyCases, Address (value, type.getBestKnownAlignment ()));
624
+ IGF.Builder .CreateRet (idx);
625
+ } else {
626
+ llvm::Value *idx = type.getEnumTagSinglePayload (
627
+ IGF, numEmptyCases, Address (value, type.getBestKnownAlignment ()),
628
+ concreteType, true );
629
+ IGF.Builder .CreateRet (idx);
630
+ }
570
631
571
- llvm::Value *idx = type.getEnumTagSinglePayload (
572
- IGF, numEmptyCases, Address (value, type.getBestKnownAlignment ()),
573
- concreteType, true );
574
- IGF.Builder .CreateRet (idx);
575
632
return ;
576
633
}
577
634
@@ -584,10 +641,16 @@ static void buildValueWitnessFunction(IRGenModule &IGM,
584
641
llvm::Value *numEmptyCases = getArg (argv, " numEmptyCases" );
585
642
586
643
getArgAsLocalSelfTypeMetadata (IGF, argv, abstractType);
587
-
588
- type.storeEnumTagSinglePayload (IGF, whichCase, numEmptyCases,
589
- Address (value, type.getBestKnownAlignment ()),
590
- concreteType, true );
644
+ if (IGM.getOptions ().UseTypeLayoutValueHandling ) {
645
+ auto &typeLayoutEntry = IGM.getTypeLayoutEntry (concreteType);
646
+ typeLayoutEntry.storeEnumTagSinglePayload (
647
+ IGF, whichCase, numEmptyCases,
648
+ Address (value, type.getBestKnownAlignment ()));
649
+ } else {
650
+ type.storeEnumTagSinglePayload (
651
+ IGF, whichCase, numEmptyCases,
652
+ Address (value, type.getBestKnownAlignment ()), concreteType, true );
653
+ }
591
654
IGF.Builder .CreateRetVoid ();
592
655
return ;
593
656
}
0 commit comments