@@ -243,11 +243,6 @@ namespace {
243
243
// / Materialize an atomic r-value in atomic-layout memory.
244
244
Address materializeRValue (RValue rvalue) const ;
245
245
246
- // / \brief Translates LLVM atomic ordering to GNU atomic ordering for
247
- // / libcalls.
248
- static AtomicExpr::AtomicOrderingKind
249
- translateAtomicOrdering (const llvm::AtomicOrdering AO);
250
-
251
246
// / \brief Creates temp alloca for intermediate operations on atomic value.
252
247
Address CreateTempAlloca () const ;
253
248
private:
@@ -292,25 +287,6 @@ namespace {
292
287
};
293
288
}
294
289
295
- AtomicExpr::AtomicOrderingKind
296
- AtomicInfo::translateAtomicOrdering (const llvm::AtomicOrdering AO) {
297
- switch (AO) {
298
- case llvm::AtomicOrdering::Unordered:
299
- case llvm::AtomicOrdering::NotAtomic:
300
- case llvm::AtomicOrdering::Monotonic:
301
- return AtomicExpr::AO_ABI_memory_order_relaxed;
302
- case llvm::AtomicOrdering::Acquire:
303
- return AtomicExpr::AO_ABI_memory_order_acquire;
304
- case llvm::AtomicOrdering::Release:
305
- return AtomicExpr::AO_ABI_memory_order_release;
306
- case llvm::AtomicOrdering::AcquireRelease:
307
- return AtomicExpr::AO_ABI_memory_order_acq_rel;
308
- case llvm::AtomicOrdering::SequentiallyConsistent:
309
- return AtomicExpr::AO_ABI_memory_order_seq_cst;
310
- }
311
- llvm_unreachable (" Unhandled AtomicOrdering" );
312
- }
313
-
314
290
Address AtomicInfo::CreateTempAlloca () const {
315
291
Address TempAlloca = CGF.CreateMemTemp (
316
292
(LVal.isBitField () && ValueSizeInBits > AtomicSizeInBits) ? ValueTy
@@ -427,34 +403,39 @@ static void emitAtomicCmpXchg(CodeGenFunction &CGF, AtomicExpr *E, bool IsWeak,
427
403
// / instructions to cope with the provided (but possibly only dynamically known)
428
404
// / FailureOrder.
429
405
static void emitAtomicCmpXchgFailureSet (CodeGenFunction &CGF, AtomicExpr *E,
430
- bool IsWeak, Address Dest,
431
- Address Ptr , Address Val1,
432
- Address Val2,
406
+ bool IsWeak, Address Dest, Address Ptr ,
407
+ Address Val1, Address Val2,
433
408
llvm::Value *FailureOrderVal,
434
409
uint64_t Size ,
435
410
llvm::AtomicOrdering SuccessOrder) {
436
411
llvm::AtomicOrdering FailureOrder;
437
412
if (llvm::ConstantInt *FO = dyn_cast<llvm::ConstantInt>(FailureOrderVal)) {
438
- switch ( FO->getSExtValue ()) {
439
- default :
413
+ auto FOS = FO->getSExtValue ();
414
+ if (! llvm::isValidAtomicOrderingCABI (FOS))
440
415
FailureOrder = llvm::AtomicOrdering::Monotonic;
441
- break ;
442
- case AtomicExpr::AO_ABI_memory_order_consume:
443
- case AtomicExpr::AO_ABI_memory_order_acquire:
444
- FailureOrder = llvm::AtomicOrdering::Acquire;
445
- break ;
446
- case AtomicExpr::AO_ABI_memory_order_seq_cst:
447
- FailureOrder = llvm::AtomicOrdering::SequentiallyConsistent;
448
- break ;
449
- }
416
+ else
417
+ switch ((llvm::AtomicOrderingCABI)FOS) {
418
+ case llvm::AtomicOrderingCABI::relaxed:
419
+ case llvm::AtomicOrderingCABI::release:
420
+ case llvm::AtomicOrderingCABI::acq_rel:
421
+ FailureOrder = llvm::AtomicOrdering::Monotonic;
422
+ break ;
423
+ case llvm::AtomicOrderingCABI::consume:
424
+ case llvm::AtomicOrderingCABI::acquire:
425
+ FailureOrder = llvm::AtomicOrdering::Acquire;
426
+ break ;
427
+ case llvm::AtomicOrderingCABI::seq_cst:
428
+ FailureOrder = llvm::AtomicOrdering::SequentiallyConsistent;
429
+ break ;
430
+ }
450
431
if (isStrongerThan (FailureOrder, SuccessOrder)) {
451
432
// Don't assert on undefined behavior "failure argument shall be no
452
433
// stronger than the success argument".
453
434
FailureOrder =
454
- llvm::AtomicCmpXchgInst::getStrongestFailureOrdering (SuccessOrder);
435
+ llvm::AtomicCmpXchgInst::getStrongestFailureOrdering (SuccessOrder);
455
436
}
456
- emitAtomicCmpXchg (CGF, E, IsWeak, Dest, Ptr , Val1, Val2, Size ,
457
- SuccessOrder, FailureOrder);
437
+ emitAtomicCmpXchg (CGF, E, IsWeak, Dest, Ptr , Val1, Val2, Size , SuccessOrder,
438
+ FailureOrder);
458
439
return ;
459
440
}
460
441
@@ -487,17 +468,17 @@ static void emitAtomicCmpXchgFailureSet(CodeGenFunction &CGF, AtomicExpr *E,
487
468
emitAtomicCmpXchg (CGF, E, IsWeak, Dest, Ptr , Val1, Val2,
488
469
Size , SuccessOrder, llvm::AtomicOrdering::Acquire);
489
470
CGF.Builder .CreateBr (ContBB);
490
- SI->addCase (CGF.Builder .getInt32 (AtomicExpr::AO_ABI_memory_order_consume ),
471
+ SI->addCase (CGF.Builder .getInt32 (( int )llvm::AtomicOrderingCABI::consume ),
491
472
AcquireBB);
492
- SI->addCase (CGF.Builder .getInt32 (AtomicExpr::AO_ABI_memory_order_acquire ),
473
+ SI->addCase (CGF.Builder .getInt32 (( int )llvm::AtomicOrderingCABI::acquire ),
493
474
AcquireBB);
494
475
}
495
476
if (SeqCstBB) {
496
477
CGF.Builder .SetInsertPoint (SeqCstBB);
497
478
emitAtomicCmpXchg (CGF, E, IsWeak, Dest, Ptr , Val1, Val2, Size , SuccessOrder,
498
479
llvm::AtomicOrdering::SequentiallyConsistent);
499
480
CGF.Builder .CreateBr (ContBB);
500
- SI->addCase (CGF.Builder .getInt32 (AtomicExpr::AO_ABI_memory_order_seq_cst ),
481
+ SI->addCase (CGF.Builder .getInt32 (( int )llvm::AtomicOrderingCABI::seq_cst ),
501
482
SeqCstBB);
502
483
}
503
484
@@ -1044,40 +1025,39 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
1044
1025
E->getOp () == AtomicExpr::AO__atomic_load_n;
1045
1026
1046
1027
if (isa<llvm::ConstantInt>(Order)) {
1047
- int ord = cast<llvm::ConstantInt>(Order)->getZExtValue ();
1048
- switch (ord) {
1049
- case AtomicExpr::AO_ABI_memory_order_relaxed:
1050
- EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1051
- Size , llvm::AtomicOrdering::Monotonic);
1052
- break ;
1053
- case AtomicExpr::AO_ABI_memory_order_consume:
1054
- case AtomicExpr::AO_ABI_memory_order_acquire:
1055
- if (IsStore)
1056
- break ; // Avoid crashing on code with undefined behavior
1057
- EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1058
- Size , llvm::AtomicOrdering::Acquire);
1059
- break ;
1060
- case AtomicExpr::AO_ABI_memory_order_release:
1061
- if (IsLoad)
1062
- break ; // Avoid crashing on code with undefined behavior
1063
- EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1064
- Size , llvm::AtomicOrdering::Release);
1065
- break ;
1066
- case AtomicExpr::AO_ABI_memory_order_acq_rel:
1067
- if (IsLoad || IsStore)
1068
- break ; // Avoid crashing on code with undefined behavior
1069
- EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1070
- Size , llvm::AtomicOrdering::AcquireRelease);
1071
- break ;
1072
- case AtomicExpr::AO_ABI_memory_order_seq_cst:
1073
- EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1074
- Size , llvm::AtomicOrdering::SequentiallyConsistent);
1075
- break ;
1076
- default : // invalid order
1077
- // We should not ever get here normally, but it's hard to
1078
- // enforce that in general.
1079
- break ;
1080
- }
1028
+ auto ord = cast<llvm::ConstantInt>(Order)->getZExtValue ();
1029
+ // We should not ever get to a case where the ordering isn't a valid C ABI
1030
+ // value, but it's hard to enforce that in general.
1031
+ if (llvm::isValidAtomicOrderingCABI (ord))
1032
+ switch ((llvm::AtomicOrderingCABI)ord) {
1033
+ case llvm::AtomicOrderingCABI::relaxed:
1034
+ EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail, Size ,
1035
+ llvm::AtomicOrdering::Monotonic);
1036
+ break ;
1037
+ case llvm::AtomicOrderingCABI::consume:
1038
+ case llvm::AtomicOrderingCABI::acquire:
1039
+ if (IsStore)
1040
+ break ; // Avoid crashing on code with undefined behavior
1041
+ EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail, Size ,
1042
+ llvm::AtomicOrdering::Acquire);
1043
+ break ;
1044
+ case llvm::AtomicOrderingCABI::release:
1045
+ if (IsLoad)
1046
+ break ; // Avoid crashing on code with undefined behavior
1047
+ EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail, Size ,
1048
+ llvm::AtomicOrdering::Release);
1049
+ break ;
1050
+ case llvm::AtomicOrderingCABI::acq_rel:
1051
+ if (IsLoad || IsStore)
1052
+ break ; // Avoid crashing on code with undefined behavior
1053
+ EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail, Size ,
1054
+ llvm::AtomicOrdering::AcquireRelease);
1055
+ break ;
1056
+ case llvm::AtomicOrderingCABI::seq_cst:
1057
+ EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail, Size ,
1058
+ llvm::AtomicOrdering::SequentiallyConsistent);
1059
+ break ;
1060
+ }
1081
1061
if (RValTy->isVoidType ())
1082
1062
return RValue::get (nullptr );
1083
1063
@@ -1119,32 +1099,32 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
1119
1099
EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1120
1100
Size , llvm::AtomicOrdering::Acquire);
1121
1101
Builder.CreateBr (ContBB);
1122
- SI->addCase (Builder.getInt32 (AtomicExpr::AO_ABI_memory_order_consume ),
1102
+ SI->addCase (Builder.getInt32 (( int )llvm::AtomicOrderingCABI::consume ),
1123
1103
AcquireBB);
1124
- SI->addCase (Builder.getInt32 (AtomicExpr::AO_ABI_memory_order_acquire ),
1104
+ SI->addCase (Builder.getInt32 (( int )llvm::AtomicOrderingCABI::acquire ),
1125
1105
AcquireBB);
1126
1106
}
1127
1107
if (!IsLoad) {
1128
1108
Builder.SetInsertPoint (ReleaseBB);
1129
1109
EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1130
1110
Size , llvm::AtomicOrdering::Release);
1131
1111
Builder.CreateBr (ContBB);
1132
- SI->addCase (Builder.getInt32 (AtomicExpr::AO_ABI_memory_order_release ),
1112
+ SI->addCase (Builder.getInt32 (( int )llvm::AtomicOrderingCABI::release ),
1133
1113
ReleaseBB);
1134
1114
}
1135
1115
if (!IsLoad && !IsStore) {
1136
1116
Builder.SetInsertPoint (AcqRelBB);
1137
1117
EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1138
1118
Size , llvm::AtomicOrdering::AcquireRelease);
1139
1119
Builder.CreateBr (ContBB);
1140
- SI->addCase (Builder.getInt32 (AtomicExpr::AO_ABI_memory_order_acq_rel ),
1120
+ SI->addCase (Builder.getInt32 (( int )llvm::AtomicOrderingCABI::acq_rel ),
1141
1121
AcqRelBB);
1142
1122
}
1143
1123
Builder.SetInsertPoint (SeqCstBB);
1144
1124
EmitAtomicOp (*this , E, Dest, Ptr , Val1, Val2, IsWeak, OrderFail,
1145
1125
Size , llvm::AtomicOrdering::SequentiallyConsistent);
1146
1126
Builder.CreateBr (ContBB);
1147
- SI->addCase (Builder.getInt32 (AtomicExpr::AO_ABI_memory_order_seq_cst ),
1127
+ SI->addCase (Builder.getInt32 (( int )llvm::AtomicOrderingCABI::seq_cst ),
1148
1128
SeqCstBB);
1149
1129
1150
1130
// Cleanup and return
@@ -1264,9 +1244,9 @@ void AtomicInfo::EmitAtomicLoadLibcall(llvm::Value *AddForLoaded,
1264
1244
CGF.getContext ().VoidPtrTy );
1265
1245
Args.add (RValue::get (CGF.EmitCastToVoidPtr (AddForLoaded)),
1266
1246
CGF.getContext ().VoidPtrTy );
1267
- Args.add (RValue::get (
1268
- llvm::ConstantInt::get (CGF.IntTy , translateAtomicOrdering (AO))),
1269
- CGF.getContext ().IntTy );
1247
+ Args.add (
1248
+ RValue::get ( llvm::ConstantInt::get (CGF.IntTy , ( int ) llvm::toCABI (AO))),
1249
+ CGF.getContext ().IntTy );
1270
1250
emitAtomicLibcall (CGF, " __atomic_load" , CGF.getContext ().VoidTy , Args);
1271
1251
}
1272
1252
@@ -1482,11 +1462,11 @@ AtomicInfo::EmitAtomicCompareExchangeLibcall(llvm::Value *ExpectedAddr,
1482
1462
CGF.getContext ().VoidPtrTy );
1483
1463
Args.add (RValue::get (CGF.EmitCastToVoidPtr (DesiredAddr)),
1484
1464
CGF.getContext ().VoidPtrTy );
1485
- Args.add (RValue::get (llvm::ConstantInt::get (
1486
- CGF.IntTy , translateAtomicOrdering (Success))),
1465
+ Args.add (RValue::get (
1466
+ llvm::ConstantInt::get ( CGF.IntTy , ( int ) llvm::toCABI (Success))),
1487
1467
CGF.getContext ().IntTy );
1488
- Args.add (RValue::get (llvm::ConstantInt::get (
1489
- CGF.IntTy , translateAtomicOrdering (Failure))),
1468
+ Args.add (RValue::get (
1469
+ llvm::ConstantInt::get ( CGF.IntTy , ( int ) llvm::toCABI (Failure))),
1490
1470
CGF.getContext ().IntTy );
1491
1471
auto SuccessFailureRVal = emitAtomicLibcall (CGF, " __atomic_compare_exchange" ,
1492
1472
CGF.getContext ().BoolTy , Args);
@@ -1793,9 +1773,9 @@ void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
1793
1773
getContext ().VoidPtrTy );
1794
1774
args.add (RValue::get (EmitCastToVoidPtr (srcAddr.getPointer ())),
1795
1775
getContext ().VoidPtrTy );
1796
- args.add (RValue::get ( llvm::ConstantInt::get (
1797
- IntTy, AtomicInfo::translateAtomicOrdering (AO))),
1798
- getContext ().IntTy );
1776
+ args.add (
1777
+ RValue::get ( llvm::ConstantInt::get ( IntTy, ( int ) llvm::toCABI (AO))),
1778
+ getContext ().IntTy );
1799
1779
emitAtomicLibcall (*this , " __atomic_store" , getContext ().VoidTy , args);
1800
1780
return ;
1801
1781
}
0 commit comments