@@ -398,7 +398,8 @@ namespace {
398
398
void loadAsCopy (IRGenFunction &IGF, Address addr,
399
399
Explosion &e) const override {
400
400
if (!getLoadableSingleton ()) return ;
401
- getLoadableSingleton ()->loadAsCopy (IGF, getSingletonAddress (IGF, addr),e);
401
+ getLoadableSingleton ()->loadAsCopy (IGF, getSingletonAddress (IGF, addr),
402
+ e);
402
403
}
403
404
404
405
void loadForSwitch (IRGenFunction &IGF, Address addr, Explosion &e) const {
@@ -466,29 +467,31 @@ namespace {
466
467
if (getLoadableSingleton ()) getLoadableSingleton ()->reexplode (IGF, src, dest);
467
468
}
468
469
469
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
470
- const override {
471
- if (getLoadableSingleton ()) getLoadableSingleton ()->copy (IGF, src, dest);
470
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
471
+ Atomicity atomicity) const override {
472
+ if (getLoadableSingleton ())
473
+ getLoadableSingleton ()->copy (IGF, src, dest, atomicity);
472
474
}
473
475
474
- void consume (IRGenFunction &IGF, Explosion &src) const override {
475
- if (getLoadableSingleton ()) getLoadableSingleton ()->consume (IGF, src);
476
+ void consume (IRGenFunction &IGF, Explosion &src,
477
+ Atomicity atomicity) const override {
478
+ if (getLoadableSingleton ())
479
+ getLoadableSingleton ()->consume (IGF, src, atomicity);
476
480
}
477
481
478
482
void fixLifetime (IRGenFunction &IGF, Explosion &src) const override {
479
483
if (getLoadableSingleton ()) getLoadableSingleton ()->fixLifetime (IGF, src);
480
484
}
481
485
482
486
void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
483
- if (getSingleton () && !getSingleton ()->isPOD (ResilienceExpansion::Maximal))
487
+ if (getSingleton () &&
488
+ !getSingleton ()->isPOD (ResilienceExpansion::Maximal))
484
489
getSingleton ()->destroy (IGF, getSingletonAddress (IGF, addr),
485
490
getSingletonType (IGF.IGM , T));
486
491
}
487
492
488
- void packIntoEnumPayload (IRGenFunction &IGF,
489
- EnumPayload &payload,
490
- Explosion &in,
491
- unsigned offset) const override {
493
+ void packIntoEnumPayload (IRGenFunction &IGF, EnumPayload &payload,
494
+ Explosion &in, unsigned offset) const override {
492
495
if (getLoadableSingleton ())
493
496
return getLoadableSingleton ()->packIntoEnumPayload (IGF, payload,
494
497
in, offset);
@@ -830,8 +833,10 @@ namespace {
830
833
return IGF.Builder .CreateStructGEP (addr, 0 , Size (0 ));
831
834
}
832
835
833
- void emitScalarRetain (IRGenFunction &IGF, llvm::Value *value) const {}
834
- void emitScalarRelease (IRGenFunction &IGF, llvm::Value *value) const {}
836
+ void emitScalarRetain (IRGenFunction &IGF, llvm::Value *value,
837
+ Atomicity atomicity) const {}
838
+ void emitScalarRelease (IRGenFunction &IGF, llvm::Value *value,
839
+ Atomicity atomicity) const {}
835
840
void emitScalarFixLifetime (IRGenFunction &IGF, llvm::Value *value) const {}
836
841
837
842
void initializeWithTake (IRGenFunction &IGF, Address dest, Address src,
@@ -1190,12 +1195,12 @@ namespace {
1190
1195
loadForSwitch (IGF, addr, e);
1191
1196
}
1192
1197
1193
- void loadAsCopy (IRGenFunction &IGF, Address addr, Explosion &e)
1194
- const override {
1198
+ void loadAsCopy (IRGenFunction &IGF, Address addr,
1199
+ Explosion &e) const override {
1195
1200
assert (TIK >= Loadable);
1196
1201
Explosion tmp;
1197
1202
loadAsTake (IGF, addr, tmp);
1198
- copy (IGF, tmp, e);
1203
+ copy (IGF, tmp, e, Atomicity::Atomic );
1199
1204
}
1200
1205
1201
1206
void assign (IRGenFunction &IGF, Explosion &e, Address addr) const override {
@@ -1205,7 +1210,7 @@ namespace {
1205
1210
loadAsTake (IGF, addr, old);
1206
1211
initialize (IGF, e, addr);
1207
1212
if (!isPOD (ResilienceExpansion::Maximal))
1208
- consume (IGF, old);
1213
+ consume (IGF, old, Atomicity::Atomic );
1209
1214
}
1210
1215
1211
1216
void initialize (IRGenFunction &IGF, Explosion &e, Address addr)
@@ -2012,7 +2017,7 @@ namespace {
2012
2017
llvm::Value *ptr) const {
2013
2018
switch (CopyDestroyKind) {
2014
2019
case NullableRefcounted:
2015
- IGF.emitStrongRetain (ptr, Refcounting);
2020
+ IGF.emitStrongRetain (ptr, Refcounting, Atomicity::Atomic );
2016
2021
return ;
2017
2022
case POD:
2018
2023
case Normal:
@@ -2036,7 +2041,7 @@ namespace {
2036
2041
llvm::Value *ptr) const {
2037
2042
switch (CopyDestroyKind) {
2038
2043
case NullableRefcounted:
2039
- IGF.emitStrongRelease (ptr, Refcounting);
2044
+ IGF.emitStrongRelease (ptr, Refcounting, Atomicity::Atomic );
2040
2045
return ;
2041
2046
case POD:
2042
2047
case Normal:
@@ -2045,8 +2050,8 @@ namespace {
2045
2050
}
2046
2051
2047
2052
public:
2048
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
2049
- const override {
2053
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
2054
+ Atomicity atomicity) const override {
2050
2055
assert (TIK >= Loadable);
2051
2056
2052
2057
switch (CopyDestroyKind) {
@@ -2068,7 +2073,7 @@ namespace {
2068
2073
Explosion payloadCopy;
2069
2074
auto &loadableTI = getLoadablePayloadTypeInfo ();
2070
2075
loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2071
- loadableTI.copy (IGF, payloadValue, payloadCopy);
2076
+ loadableTI.copy (IGF, payloadValue, payloadCopy, Atomicity::Atomic );
2072
2077
payloadCopy.claimAll (); // FIXME: repack if not bit-identical
2073
2078
}
2074
2079
@@ -2093,7 +2098,8 @@ namespace {
2093
2098
}
2094
2099
}
2095
2100
2096
- void consume (IRGenFunction &IGF, Explosion &src) const override {
2101
+ void consume (IRGenFunction &IGF, Explosion &src,
2102
+ Atomicity atomicity) const override {
2097
2103
assert (TIK >= Loadable);
2098
2104
2099
2105
switch (CopyDestroyKind) {
@@ -2116,7 +2122,7 @@ namespace {
2116
2122
Explosion payloadValue;
2117
2123
auto &loadableTI = getLoadablePayloadTypeInfo ();
2118
2124
loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2119
- loadableTI.consume (IGF, payloadValue);
2125
+ loadableTI.consume (IGF, payloadValue, Atomicity::Atomic );
2120
2126
}
2121
2127
2122
2128
IGF.Builder .CreateBr (endBB);
@@ -2883,7 +2889,7 @@ namespace {
2883
2889
llvm::Value *ptr) const {
2884
2890
switch (CopyDestroyKind) {
2885
2891
case TaggedRefcounted:
2886
- IGF.emitStrongRetain (ptr, Refcounting);
2892
+ IGF.emitStrongRetain (ptr, Refcounting, Atomicity::Atomic );
2887
2893
return ;
2888
2894
case POD:
2889
2895
case BitwiseTakable:
@@ -2909,7 +2915,7 @@ namespace {
2909
2915
llvm::Value *ptr) const {
2910
2916
switch (CopyDestroyKind) {
2911
2917
case TaggedRefcounted:
2912
- IGF.emitStrongRelease (ptr, Refcounting);
2918
+ IGF.emitStrongRelease (ptr, Refcounting, Atomicity::Atomic );
2913
2919
return ;
2914
2920
case POD:
2915
2921
case BitwiseTakable:
@@ -3618,8 +3624,8 @@ namespace {
3618
3624
emitNoPayloadInjection (IGF, out, emptyI - ElementsWithNoPayload.begin ());
3619
3625
}
3620
3626
3621
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
3622
- const override {
3627
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
3628
+ Atomicity atomicity) const override {
3623
3629
assert (TIK >= Loadable);
3624
3630
3625
3631
switch (CopyDestroyKind) {
@@ -3638,7 +3644,7 @@ namespace {
3638
3644
projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
3639
3645
3640
3646
Explosion tmp;
3641
- lti.copy (IGF, value, tmp);
3647
+ lti.copy (IGF, value, tmp, Atomicity::Atomic );
3642
3648
tmp.claimAll (); // FIXME: repack if not bit-identical
3643
3649
});
3644
3650
@@ -3671,7 +3677,8 @@ namespace {
3671
3677
3672
3678
}
3673
3679
3674
- void consume (IRGenFunction &IGF, Explosion &src) const override {
3680
+ void consume (IRGenFunction &IGF, Explosion &src,
3681
+ Atomicity atomicity) const override {
3675
3682
assert (TIK >= Loadable);
3676
3683
3677
3684
switch (CopyDestroyKind) {
@@ -3689,7 +3696,7 @@ namespace {
3689
3696
Explosion value;
3690
3697
projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
3691
3698
3692
- lti.consume (IGF, value);
3699
+ lti.consume (IGF, value, Atomicity::Atomic );
3693
3700
});
3694
3701
return ;
3695
3702
}
@@ -3770,7 +3777,7 @@ namespace {
3770
3777
3771
3778
loadAsTake (IGF, dest, tmpOld);
3772
3779
initialize (IGF, tmpSrc, dest);
3773
- consume (IGF, tmpOld);
3780
+ consume (IGF, tmpOld, Atomicity::Atomic );
3774
3781
return ;
3775
3782
}
3776
3783
@@ -3923,8 +3930,7 @@ namespace {
3923
3930
emitIndirectInitialize (IGF, dest, src, T, IsTake);
3924
3931
}
3925
3932
3926
- void destroy (IRGenFunction &IGF, Address addr, SILType T)
3927
- const override {
3933
+ void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
3928
3934
switch (CopyDestroyKind) {
3929
3935
case POD:
3930
3936
return ;
@@ -3937,7 +3943,7 @@ namespace {
3937
3943
if (TI->isLoadable ()) {
3938
3944
Explosion tmp;
3939
3945
loadAsTake (IGF, addr, tmp);
3940
- consume (IGF, tmp);
3946
+ consume (IGF, tmp, Atomicity::Atomic );
3941
3947
return ;
3942
3948
}
3943
3949
@@ -4440,8 +4446,7 @@ namespace {
4440
4446
dest, src);
4441
4447
}
4442
4448
4443
- void destroy (IRGenFunction &IGF, Address addr, SILType T)
4444
- const override {
4449
+ void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
4445
4450
emitDestroyCall (IGF, T, addr);
4446
4451
}
4447
4452
@@ -4506,7 +4511,7 @@ namespace {
4506
4511
}
4507
4512
4508
4513
void loadAsCopy (IRGenFunction &IGF, Address addr,
4509
- Explosion &e) const override {
4514
+ Explosion &e) const override {
4510
4515
llvm_unreachable (" resilient enums are always indirect" );
4511
4516
}
4512
4517
@@ -4530,12 +4535,13 @@ namespace {
4530
4535
llvm_unreachable (" resilient enums are always indirect" );
4531
4536
}
4532
4537
4533
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
4534
- const override {
4538
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
4539
+ Atomicity atomicity) const override {
4535
4540
llvm_unreachable (" resilient enums are always indirect" );
4536
4541
}
4537
4542
4538
- void consume (IRGenFunction &IGF, Explosion &src) const override {
4543
+ void consume (IRGenFunction &IGF, Explosion &src,
4544
+ Atomicity atomicity) const override {
4539
4545
llvm_unreachable (" resilient enums are always indirect" );
4540
4546
}
4541
4547
@@ -4896,11 +4902,12 @@ namespace {
4896
4902
return Strategy.reexplode (IGF, src, dest);
4897
4903
}
4898
4904
void copy (IRGenFunction &IGF, Explosion &src,
4899
- Explosion &dest) const override {
4900
- return Strategy.copy (IGF, src, dest);
4905
+ Explosion &dest, Atomicity atomicity ) const override {
4906
+ return Strategy.copy (IGF, src, dest, atomicity );
4901
4907
}
4902
- void consume (IRGenFunction &IGF, Explosion &src) const override {
4903
- return Strategy.consume (IGF, src);
4908
+ void consume (IRGenFunction &IGF, Explosion &src,
4909
+ Atomicity atomicity) const override {
4910
+ return Strategy.consume (IGF, src, atomicity);
4904
4911
}
4905
4912
void fixLifetime (IRGenFunction &IGF, Explosion &src) const override {
4906
4913
return Strategy.fixLifetime (IGF, src);
0 commit comments