@@ -396,9 +396,10 @@ namespace {
396
396
}
397
397
398
398
void loadAsCopy (IRGenFunction &IGF, Address addr,
399
- Explosion &e) const override {
399
+ Explosion &e, Atomicity atomicity ) const override {
400
400
if (!getLoadableSingleton ()) return ;
401
- getLoadableSingleton ()->loadAsCopy (IGF, getSingletonAddress (IGF, addr),e);
401
+ getLoadableSingleton ()->loadAsCopy (IGF, getSingletonAddress (IGF, addr), e,
402
+ atomicity);
402
403
}
403
404
404
405
void loadForSwitch (IRGenFunction &IGF, Address addr, Explosion &e) const {
@@ -466,29 +467,32 @@ 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
- void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
483
- if (getSingleton () && !getSingleton ()->isPOD (ResilienceExpansion::Maximal))
486
+ void destroy (IRGenFunction &IGF, Address addr, SILType T,
487
+ Atomicity atomicity) const override {
488
+ if (getSingleton () &&
489
+ !getSingleton ()->isPOD (ResilienceExpansion::Maximal))
484
490
getSingleton ()->destroy (IGF, getSingletonAddress (IGF, addr),
485
- getSingletonType (IGF.IGM , T));
491
+ getSingletonType (IGF.IGM , T), atomicity );
486
492
}
487
493
488
- void packIntoEnumPayload (IRGenFunction &IGF,
489
- EnumPayload &payload,
490
- Explosion &in,
491
- unsigned offset) const override {
494
+ void packIntoEnumPayload (IRGenFunction &IGF, EnumPayload &payload,
495
+ Explosion &in, unsigned offset) const override {
492
496
if (getLoadableSingleton ())
493
497
return getLoadableSingleton ()->packIntoEnumPayload (IGF, payload,
494
498
in, offset);
@@ -830,8 +834,10 @@ namespace {
830
834
return IGF.Builder .CreateStructGEP (addr, 0 , Size (0 ));
831
835
}
832
836
833
- void emitScalarRetain (IRGenFunction &IGF, llvm::Value *value) const {}
834
- void emitScalarRelease (IRGenFunction &IGF, llvm::Value *value) const {}
837
+ void emitScalarRetain (IRGenFunction &IGF, llvm::Value *value,
838
+ Atomicity atomicity) const {}
839
+ void emitScalarRelease (IRGenFunction &IGF, llvm::Value *value,
840
+ Atomicity atomicity) const {}
835
841
void emitScalarFixLifetime (IRGenFunction &IGF, llvm::Value *value) const {}
836
842
837
843
void initializeWithTake (IRGenFunction &IGF, Address dest, Address src,
@@ -1190,12 +1196,12 @@ namespace {
1190
1196
loadForSwitch (IGF, addr, e);
1191
1197
}
1192
1198
1193
- void loadAsCopy (IRGenFunction &IGF, Address addr, Explosion &e)
1194
- const override {
1199
+ void loadAsCopy (IRGenFunction &IGF, Address addr, Explosion &e,
1200
+ Atomicity atomicity) const override {
1195
1201
assert (TIK >= Loadable);
1196
1202
Explosion tmp;
1197
1203
loadAsTake (IGF, addr, tmp);
1198
- copy (IGF, tmp, e);
1204
+ copy (IGF, tmp, e, atomicity );
1199
1205
}
1200
1206
1201
1207
void assign (IRGenFunction &IGF, Explosion &e, Address addr) const override {
@@ -1205,7 +1211,7 @@ namespace {
1205
1211
loadAsTake (IGF, addr, old);
1206
1212
initialize (IGF, e, addr);
1207
1213
if (!isPOD (ResilienceExpansion::Maximal))
1208
- consume (IGF, old);
1214
+ consume (IGF, old, Atomicity::Atomic );
1209
1215
}
1210
1216
1211
1217
void initialize (IRGenFunction &IGF, Explosion &e, Address addr)
@@ -2012,7 +2018,7 @@ namespace {
2012
2018
llvm::Value *ptr) const {
2013
2019
switch (CopyDestroyKind) {
2014
2020
case NullableRefcounted:
2015
- IGF.emitStrongRetain (ptr, Refcounting);
2021
+ IGF.emitStrongRetain (ptr, Refcounting, Atomicity::Atomic );
2016
2022
return ;
2017
2023
case POD:
2018
2024
case Normal:
@@ -2036,7 +2042,7 @@ namespace {
2036
2042
llvm::Value *ptr) const {
2037
2043
switch (CopyDestroyKind) {
2038
2044
case NullableRefcounted:
2039
- IGF.emitStrongRelease (ptr, Refcounting);
2045
+ IGF.emitStrongRelease (ptr, Refcounting, Atomicity::Atomic );
2040
2046
return ;
2041
2047
case POD:
2042
2048
case Normal:
@@ -2045,8 +2051,8 @@ namespace {
2045
2051
}
2046
2052
2047
2053
public:
2048
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
2049
- const override {
2054
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
2055
+ Atomicity atomicity) const override {
2050
2056
assert (TIK >= Loadable);
2051
2057
2052
2058
switch (CopyDestroyKind) {
@@ -2068,7 +2074,7 @@ namespace {
2068
2074
Explosion payloadCopy;
2069
2075
auto &loadableTI = getLoadablePayloadTypeInfo ();
2070
2076
loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2071
- loadableTI.copy (IGF, payloadValue, payloadCopy);
2077
+ loadableTI.copy (IGF, payloadValue, payloadCopy, Atomicity::Atomic );
2072
2078
payloadCopy.claimAll (); // FIXME: repack if not bit-identical
2073
2079
}
2074
2080
@@ -2093,7 +2099,8 @@ namespace {
2093
2099
}
2094
2100
}
2095
2101
2096
- void consume (IRGenFunction &IGF, Explosion &src) const override {
2102
+ void consume (IRGenFunction &IGF, Explosion &src,
2103
+ Atomicity atomicity) const override {
2097
2104
assert (TIK >= Loadable);
2098
2105
2099
2106
switch (CopyDestroyKind) {
@@ -2116,7 +2123,7 @@ namespace {
2116
2123
Explosion payloadValue;
2117
2124
auto &loadableTI = getLoadablePayloadTypeInfo ();
2118
2125
loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2119
- loadableTI.consume (IGF, payloadValue);
2126
+ loadableTI.consume (IGF, payloadValue, Atomicity::Atomic );
2120
2127
}
2121
2128
2122
2129
IGF.Builder .CreateBr (endBB);
@@ -2179,7 +2186,8 @@ namespace {
2179
2186
2180
2187
}
2181
2188
2182
- void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
2189
+ void destroy (IRGenFunction &IGF, Address addr, SILType T,
2190
+ Atomicity atomicity) const override {
2183
2191
switch (CopyDestroyKind) {
2184
2192
case POD:
2185
2193
return ;
@@ -2193,7 +2201,8 @@ namespace {
2193
2201
// If there is, project and destroy it.
2194
2202
Address payloadAddr = projectPayloadData (IGF, addr);
2195
2203
getPayloadTypeInfo ().destroy (IGF, payloadAddr,
2196
- getPayloadType (IGF.IGM , T));
2204
+ getPayloadType (IGF.IGM , T),
2205
+ Atomicity::Atomic);
2197
2206
2198
2207
IGF.Builder .CreateBr (endBB);
2199
2208
IGF.Builder .emitBlock (endBB);
@@ -2296,7 +2305,8 @@ namespace {
2296
2305
IGF.Builder .emitBlock (destNoSrcPayloadBB);
2297
2306
{
2298
2307
ConditionalDominanceScope destNoSrcCondition (IGF);
2299
- getPayloadTypeInfo ().destroy (IGF, destData, PayloadT);
2308
+ getPayloadTypeInfo ().destroy (IGF, destData, PayloadT,
2309
+ Atomicity::Atomic);
2300
2310
emitPrimitiveCopy (IGF, dest, src, T);
2301
2311
IGF.Builder .CreateBr (endBB);
2302
2312
}
@@ -2883,7 +2893,7 @@ namespace {
2883
2893
llvm::Value *ptr) const {
2884
2894
switch (CopyDestroyKind) {
2885
2895
case TaggedRefcounted:
2886
- IGF.emitStrongRetain (ptr, Refcounting);
2896
+ IGF.emitStrongRetain (ptr, Refcounting, Atomicity::Atomic );
2887
2897
return ;
2888
2898
case POD:
2889
2899
case BitwiseTakable:
@@ -2909,7 +2919,7 @@ namespace {
2909
2919
llvm::Value *ptr) const {
2910
2920
switch (CopyDestroyKind) {
2911
2921
case TaggedRefcounted:
2912
- IGF.emitStrongRelease (ptr, Refcounting);
2922
+ IGF.emitStrongRelease (ptr, Refcounting, Atomicity::Atomic );
2913
2923
return ;
2914
2924
case POD:
2915
2925
case BitwiseTakable:
@@ -3618,8 +3628,8 @@ namespace {
3618
3628
emitNoPayloadInjection (IGF, out, emptyI - ElementsWithNoPayload.begin ());
3619
3629
}
3620
3630
3621
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
3622
- const override {
3631
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
3632
+ Atomicity atomicity) const override {
3623
3633
assert (TIK >= Loadable);
3624
3634
3625
3635
switch (CopyDestroyKind) {
@@ -3638,7 +3648,7 @@ namespace {
3638
3648
projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
3639
3649
3640
3650
Explosion tmp;
3641
- lti.copy (IGF, value, tmp);
3651
+ lti.copy (IGF, value, tmp, Atomicity::Atomic );
3642
3652
tmp.claimAll (); // FIXME: repack if not bit-identical
3643
3653
});
3644
3654
@@ -3671,7 +3681,8 @@ namespace {
3671
3681
3672
3682
}
3673
3683
3674
- void consume (IRGenFunction &IGF, Explosion &src) const override {
3684
+ void consume (IRGenFunction &IGF, Explosion &src,
3685
+ Atomicity atomicity) const override {
3675
3686
assert (TIK >= Loadable);
3676
3687
3677
3688
switch (CopyDestroyKind) {
@@ -3689,7 +3700,7 @@ namespace {
3689
3700
Explosion value;
3690
3701
projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
3691
3702
3692
- lti.consume (IGF, value);
3703
+ lti.consume (IGF, value, Atomicity::Atomic );
3693
3704
});
3694
3705
return ;
3695
3706
}
@@ -3766,11 +3777,11 @@ namespace {
3766
3777
if (isTake)
3767
3778
loadAsTake (IGF, src, tmpSrc);
3768
3779
else
3769
- loadAsCopy (IGF, src, tmpSrc);
3780
+ loadAsCopy (IGF, src, tmpSrc, Atomicity::Atomic );
3770
3781
3771
3782
loadAsTake (IGF, dest, tmpOld);
3772
3783
initialize (IGF, tmpSrc, dest);
3773
- consume (IGF, tmpOld);
3784
+ consume (IGF, tmpOld, Atomicity::Atomic );
3774
3785
return ;
3775
3786
}
3776
3787
@@ -3785,7 +3796,7 @@ namespace {
3785
3796
ConditionalDominanceScope condition (IGF);
3786
3797
3787
3798
// Destroy the old value.
3788
- destroy (IGF, dest, T);
3799
+ destroy (IGF, dest, T, Atomicity::Atomic );
3789
3800
3790
3801
// Reinitialize with the new value.
3791
3802
emitIndirectInitialize (IGF, dest, src, T, isTake);
@@ -3822,7 +3833,7 @@ namespace {
3822
3833
if (isTake)
3823
3834
loadAsTake (IGF, src, tmpSrc);
3824
3835
else
3825
- loadAsCopy (IGF, src, tmpSrc);
3836
+ loadAsCopy (IGF, src, tmpSrc, Atomicity::Atomic );
3826
3837
initialize (IGF, tmpSrc, dest);
3827
3838
return ;
3828
3839
}
@@ -3923,8 +3934,8 @@ namespace {
3923
3934
emitIndirectInitialize (IGF, dest, src, T, IsTake);
3924
3935
}
3925
3936
3926
- void destroy (IRGenFunction &IGF, Address addr, SILType T)
3927
- const override {
3937
+ void destroy (IRGenFunction &IGF, Address addr, SILType T,
3938
+ Atomicity atomicity) const override {
3928
3939
switch (CopyDestroyKind) {
3929
3940
case POD:
3930
3941
return ;
@@ -3937,7 +3948,7 @@ namespace {
3937
3948
if (TI->isLoadable ()) {
3938
3949
Explosion tmp;
3939
3950
loadAsTake (IGF, addr, tmp);
3940
- consume (IGF, tmp);
3951
+ consume (IGF, tmp, Atomicity::Atomic );
3941
3952
return ;
3942
3953
}
3943
3954
@@ -3951,7 +3962,7 @@ namespace {
3951
3962
Address dataAddr = IGF.Builder .CreateBitCast (addr,
3952
3963
elt.ti ->getStorageType ()->getPointerTo ());
3953
3964
SILType payloadT = T.getEnumElementType (elt.decl , *IGF.IGM .SILMod );
3954
- elt.ti ->destroy (IGF, dataAddr, payloadT);
3965
+ elt.ti ->destroy (IGF, dataAddr, payloadT, Atomicity::Atomic );
3955
3966
});
3956
3967
return ;
3957
3968
}
@@ -4440,8 +4451,8 @@ namespace {
4440
4451
dest, src);
4441
4452
}
4442
4453
4443
- void destroy (IRGenFunction &IGF, Address addr, SILType T)
4444
- const override {
4454
+ void destroy (IRGenFunction &IGF, Address addr, SILType T,
4455
+ Atomicity atomicity) const override {
4445
4456
emitDestroyCall (IGF, T, addr);
4446
4457
}
4447
4458
@@ -4505,8 +4516,8 @@ namespace {
4505
4516
llvm_unreachable (" resilient enums are always indirect" );
4506
4517
}
4507
4518
4508
- void loadAsCopy (IRGenFunction &IGF, Address addr,
4509
- Explosion &e ) const override {
4519
+ void loadAsCopy (IRGenFunction &IGF, Address addr, Explosion &e,
4520
+ Atomicity atomicity ) const override {
4510
4521
llvm_unreachable (" resilient enums are always indirect" );
4511
4522
}
4512
4523
@@ -4530,12 +4541,13 @@ namespace {
4530
4541
llvm_unreachable (" resilient enums are always indirect" );
4531
4542
}
4532
4543
4533
- void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest)
4534
- const override {
4544
+ void copy (IRGenFunction &IGF, Explosion &src, Explosion &dest,
4545
+ Atomicity atomicity) const override {
4535
4546
llvm_unreachable (" resilient enums are always indirect" );
4536
4547
}
4537
4548
4538
- void consume (IRGenFunction &IGF, Explosion &src) const override {
4549
+ void consume (IRGenFunction &IGF, Explosion &src,
4550
+ Atomicity atomicity) const override {
4539
4551
llvm_unreachable (" resilient enums are always indirect" );
4540
4552
}
4541
4553
@@ -4788,8 +4800,9 @@ namespace {
4788
4800
void getSchema (ExplosionSchema &s) const override {
4789
4801
return Strategy.getSchema (s);
4790
4802
}
4791
- void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
4792
- return Strategy.destroy (IGF, addr, T);
4803
+ void destroy (IRGenFunction &IGF, Address addr, SILType T,
4804
+ Atomicity atomicity) const override {
4805
+ return Strategy.destroy (IGF, addr, T, atomicity);
4793
4806
}
4794
4807
void initializeFromParams (IRGenFunction &IGF, Explosion ¶ms,
4795
4808
Address dest, SILType T) const override {
@@ -4876,8 +4889,8 @@ namespace {
4876
4889
return Strategy.getExplosionSize ();
4877
4890
}
4878
4891
void loadAsCopy (IRGenFunction &IGF, Address addr,
4879
- Explosion &e) const override {
4880
- return Strategy.loadAsCopy (IGF, addr, e);
4892
+ Explosion &e, Atomicity atomicity ) const override {
4893
+ return Strategy.loadAsCopy (IGF, addr, e, atomicity );
4881
4894
}
4882
4895
void loadAsTake (IRGenFunction &IGF, Address addr,
4883
4896
Explosion &e) const override {
@@ -4896,11 +4909,12 @@ namespace {
4896
4909
return Strategy.reexplode (IGF, src, dest);
4897
4910
}
4898
4911
void copy (IRGenFunction &IGF, Explosion &src,
4899
- Explosion &dest) const override {
4900
- return Strategy.copy (IGF, src, dest);
4912
+ Explosion &dest, Atomicity atomicity ) const override {
4913
+ return Strategy.copy (IGF, src, dest, atomicity );
4901
4914
}
4902
- void consume (IRGenFunction &IGF, Explosion &src) const override {
4903
- return Strategy.consume (IGF, src);
4915
+ void consume (IRGenFunction &IGF, Explosion &src,
4916
+ Atomicity atomicity) const override {
4917
+ return Strategy.consume (IGF, src, atomicity);
4904
4918
}
4905
4919
void fixLifetime (IRGenFunction &IGF, Explosion &src) const override {
4906
4920
return Strategy.fixLifetime (IGF, src);
0 commit comments