NFC: make AtomicOrdering an enum class
Summary: In the context of http://wg21.link/lwg2445 C++ uses the concept of 'stronger' ordering but doesn't define it properly. This should be fixed in C++17 barring a small question that's still open. The code currently plays fast and loose with the AtomicOrdering enum. Using an enum class is one step towards tightening things. I later also want to tighten related enums, such as clang's AtomicOrderingKind (which should be shared with LLVM as a 'C++ ABI' enum). This change touches a few lines of code which can be improved later, I'd like to keep it as NFC for now as it's already quite complex. I have related changes for clang. As a follow-up I'll add: bool operator<(AtomicOrdering, AtomicOrdering) = delete; bool operator>(AtomicOrdering, AtomicOrdering) = delete; bool operator<=(AtomicOrdering, AtomicOrdering) = delete; bool operator>=(AtomicOrdering, AtomicOrdering) = delete; This is separate so that clang and LLVM changes don't need to be in sync. Reviewers: jyknight, reames Subscribers: jyknight, llvm-commits Differential Revision: http://reviews.llvm.org/D18775 llvm-svn: 265602
This commit is contained in:
@@ -808,14 +808,14 @@ static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val) {
|
||||
|
||||
static AtomicOrdering getDecodedOrdering(unsigned Val) {
|
||||
switch (Val) {
|
||||
case bitc::ORDERING_NOTATOMIC: return NotAtomic;
|
||||
case bitc::ORDERING_UNORDERED: return Unordered;
|
||||
case bitc::ORDERING_MONOTONIC: return Monotonic;
|
||||
case bitc::ORDERING_ACQUIRE: return Acquire;
|
||||
case bitc::ORDERING_RELEASE: return Release;
|
||||
case bitc::ORDERING_ACQREL: return AcquireRelease;
|
||||
case bitc::ORDERING_NOTATOMIC: return AtomicOrdering::NotAtomic;
|
||||
case bitc::ORDERING_UNORDERED: return AtomicOrdering::Unordered;
|
||||
case bitc::ORDERING_MONOTONIC: return AtomicOrdering::Monotonic;
|
||||
case bitc::ORDERING_ACQUIRE: return AtomicOrdering::Acquire;
|
||||
case bitc::ORDERING_RELEASE: return AtomicOrdering::Release;
|
||||
case bitc::ORDERING_ACQREL: return AtomicOrdering::AcquireRelease;
|
||||
default: // Map unknown orderings to sequentially-consistent.
|
||||
case bitc::ORDERING_SEQCST: return SequentiallyConsistent;
|
||||
case bitc::ORDERING_SEQCST: return AtomicOrdering::SequentiallyConsistent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4936,10 +4936,11 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
Ty = cast<PointerType>(Op->getType())->getElementType();
|
||||
|
||||
AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]);
|
||||
if (Ordering == NotAtomic || Ordering == Release ||
|
||||
Ordering == AcquireRelease)
|
||||
if (Ordering == AtomicOrdering::NotAtomic ||
|
||||
Ordering == AtomicOrdering::Release ||
|
||||
Ordering == AtomicOrdering::AcquireRelease)
|
||||
return error("Invalid record");
|
||||
if (Ordering != NotAtomic && Record[OpNum] == 0)
|
||||
if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
|
||||
return error("Invalid record");
|
||||
SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]);
|
||||
|
||||
@@ -4992,11 +4993,12 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
typeCheckLoadStoreInst(Val->getType(), Ptr->getType()))
|
||||
return EC;
|
||||
AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]);
|
||||
if (Ordering == NotAtomic || Ordering == Acquire ||
|
||||
Ordering == AcquireRelease)
|
||||
if (Ordering == AtomicOrdering::NotAtomic ||
|
||||
Ordering == AtomicOrdering::Acquire ||
|
||||
Ordering == AtomicOrdering::AcquireRelease)
|
||||
return error("Invalid record");
|
||||
SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]);
|
||||
if (Ordering != NotAtomic && Record[OpNum] == 0)
|
||||
if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
|
||||
return error("Invalid record");
|
||||
|
||||
unsigned Align;
|
||||
@@ -5022,7 +5024,8 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
Record.size() < OpNum + 3 || Record.size() > OpNum + 5)
|
||||
return error("Invalid record");
|
||||
AtomicOrdering SuccessOrdering = getDecodedOrdering(Record[OpNum + 1]);
|
||||
if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered)
|
||||
if (SuccessOrdering == AtomicOrdering::NotAtomic ||
|
||||
SuccessOrdering == AtomicOrdering::Unordered)
|
||||
return error("Invalid record");
|
||||
SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 2]);
|
||||
|
||||
@@ -5067,7 +5070,8 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
Operation > AtomicRMWInst::LAST_BINOP)
|
||||
return error("Invalid record");
|
||||
AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]);
|
||||
if (Ordering == NotAtomic || Ordering == Unordered)
|
||||
if (Ordering == AtomicOrdering::NotAtomic ||
|
||||
Ordering == AtomicOrdering::Unordered)
|
||||
return error("Invalid record");
|
||||
SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]);
|
||||
I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope);
|
||||
@@ -5079,8 +5083,9 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
if (2 != Record.size())
|
||||
return error("Invalid record");
|
||||
AtomicOrdering Ordering = getDecodedOrdering(Record[0]);
|
||||
if (Ordering == NotAtomic || Ordering == Unordered ||
|
||||
Ordering == Monotonic)
|
||||
if (Ordering == AtomicOrdering::NotAtomic ||
|
||||
Ordering == AtomicOrdering::Unordered ||
|
||||
Ordering == AtomicOrdering::Monotonic)
|
||||
return error("Invalid record");
|
||||
SynchronizationScope SynchScope = getDecodedSynchScope(Record[1]);
|
||||
I = new FenceInst(Context, Ordering, SynchScope);
|
||||
|
||||
Reference in New Issue
Block a user