MS ABI: Implement /volatile:ms
The /volatile:ms semantics turn volatile loads and stores into atomic acquire and release operations. This distinction is important because volatile memory operations do not form a happens-before relationship with non-atomic memory. This means that a volatile store is not sufficient for implementing a mutex unlock routine. Differential Revision: http://reviews.llvm.org/D7580 llvm-svn: 229082
This commit is contained in:
@@ -212,7 +212,7 @@ void AggExprEmitter::EmitAggLoadOfLValue(const Expr *E) {
|
||||
LValue LV = CGF.EmitLValue(E);
|
||||
|
||||
// If the type of the l-value is atomic, then do an atomic load.
|
||||
if (LV.getType()->isAtomicType()) {
|
||||
if (LV.getType()->isAtomicType() || CGF.LValueIsSuitableForInlineAtomic(LV)) {
|
||||
CGF.EmitAtomicLoad(LV, E->getExprLoc(), Dest);
|
||||
return;
|
||||
}
|
||||
@@ -865,7 +865,8 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
||||
LValue LHS = CGF.EmitCheckedLValue(E->getLHS(), CodeGenFunction::TCK_Store);
|
||||
|
||||
// That copy is an atomic copy if the LHS is atomic.
|
||||
if (LHS.getType()->isAtomicType()) {
|
||||
if (LHS.getType()->isAtomicType() ||
|
||||
CGF.LValueIsSuitableForInlineAtomic(LHS)) {
|
||||
CGF.EmitAtomicStore(Dest.asRValue(), LHS, /*isInit*/ false);
|
||||
return;
|
||||
}
|
||||
@@ -882,7 +883,8 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
||||
|
||||
// If we have an atomic type, evaluate into the destination and then
|
||||
// do an atomic copy.
|
||||
if (LHS.getType()->isAtomicType()) {
|
||||
if (LHS.getType()->isAtomicType() ||
|
||||
CGF.LValueIsSuitableForInlineAtomic(LHS)) {
|
||||
EnsureDest(E->getRHS()->getType());
|
||||
Visit(E->getRHS());
|
||||
CGF.EmitAtomicStore(Dest.asRValue(), LHS, /*isInit*/ false);
|
||||
|
||||
Reference in New Issue
Block a user