diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Expr.cpp | 21 | ||||
-rw-r--r-- | lib/Serialization/ASTReaderStmt.cpp | 21 | ||||
-rw-r--r-- | lib/Serialization/ASTWriterStmt.cpp | 10 |
3 files changed, 29 insertions, 23 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 1947e61d12..2bb79a0a4a 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -3841,6 +3841,7 @@ AtomicExpr::AtomicExpr(SourceLocation BLoc, Expr **args, unsigned nexpr, false, false, false, false), NumSubExprs(nexpr), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) { + assert(nexpr == getNumSubExprs(op) && "wrong number of subexpressions"); for (unsigned i = 0; i < nexpr; i++) { if (args[i]->isTypeDependent()) ExprBits.TypeDependent = true; @@ -3854,3 +3855,23 @@ AtomicExpr::AtomicExpr(SourceLocation BLoc, Expr **args, unsigned nexpr, SubExprs[i] = args[i]; } } + +unsigned AtomicExpr::getNumSubExprs(AtomicOp Op) { + switch (Op) { + case Init: + case Load: + return 2; + case Store: + case Xchg: + case Add: + case Sub: + case And: + case Or: + case Xor: + return 3; + case CmpXchgStrong: + case CmpXchgWeak: + return 5; + } + llvm_unreachable("unknown atomic op"); +} diff --git a/lib/Serialization/ASTReaderStmt.cpp b/lib/Serialization/ASTReaderStmt.cpp index 1c9817b955..2eeb090af0 100644 --- a/lib/Serialization/ASTReaderStmt.cpp +++ b/lib/Serialization/ASTReaderStmt.cpp @@ -790,21 +790,12 @@ void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { VisitExpr(E); - E->setOp(AtomicExpr::AtomicOp(Record[Idx++])); - E->setPtr(Reader.ReadSubExpr()); - E->setOrder(Reader.ReadSubExpr()); - E->setNumSubExprs(2); - if (E->getOp() != AtomicExpr::Load) { - E->setVal1(Reader.ReadSubExpr()); - E->setNumSubExprs(3); - } - if (E->isCmpXChg()) { - E->setOrderFail(Reader.ReadSubExpr()); - E->setVal2(Reader.ReadSubExpr()); - E->setNumSubExprs(5); - } - E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); - E->setRParenLoc(ReadSourceLocation(Record, Idx)); + E->Op = AtomicExpr::AtomicOp(Record[Idx++]); + E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); + for (unsigned I = 0; I != E->NumSubExprs; ++I) + E->SubExprs[I] = Reader.ReadSubExpr(); + E->BuiltinLoc = ReadSourceLocation(Record, Idx); + E->RParenLoc = ReadSourceLocation(Record, Idx); } //===----------------------------------------------------------------------===// diff --git a/lib/Serialization/ASTWriterStmt.cpp b/lib/Serialization/ASTWriterStmt.cpp index eac7e1fb73..827caa026a 100644 --- a/lib/Serialization/ASTWriterStmt.cpp +++ b/lib/Serialization/ASTWriterStmt.cpp @@ -751,14 +751,8 @@ void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) { void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) { VisitExpr(E); Record.push_back(E->getOp()); - Writer.AddStmt(E->getPtr()); - Writer.AddStmt(E->getOrder()); - if (E->getOp() != AtomicExpr::Load) - Writer.AddStmt(E->getVal1()); - if (E->isCmpXChg()) { - Writer.AddStmt(E->getOrderFail()); - Writer.AddStmt(E->getVal2()); - } + for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) + Writer.AddStmt(E->getSubExprs()[I]); Writer.AddSourceLocation(E->getBuiltinLoc(), Record); Writer.AddSourceLocation(E->getRParenLoc(), Record); Code = serialization::EXPR_ATOMIC; |