summaryrefslogtreecommitdiff
path: root/src/wasm-traversal.h
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2017-07-10 09:47:21 -0700
committerGitHub <noreply@github.com>2017-07-10 09:47:21 -0700
commitbcb29e59c92347eebcd138034a4f4c06d042670a (patch)
treece51ac4020bacd34c748693d85d70616bf340714 /src/wasm-traversal.h
parent4995132cfaf575e430a7d0e95257b677286171c3 (diff)
downloadbinaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.tar.gz
binaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.tar.bz2
binaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.zip
Add IR, parsing, printing, and binary for atomic cmpxchg (#1083)
Diffstat (limited to 'src/wasm-traversal.h')
-rw-r--r--src/wasm-traversal.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index 11332b5c3..f56bfca96 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -50,6 +50,7 @@ struct Visitor {
ReturnType visitLoad(Load* curr) {}
ReturnType visitStore(Store* curr) {}
ReturnType visitAtomicRMW(AtomicRMW* curr) {return ReturnType();} //Stub impl so not every pass has to implement this yet.
+ ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) {return ReturnType();} //Stub impl so not every pass has to implement this yet.
ReturnType visitConst(Const* curr) {}
ReturnType visitUnary(Unary* curr) {}
ReturnType visitBinary(Binary* curr) {}
@@ -92,6 +93,7 @@ struct Visitor {
case Expression::Id::LoadId: DELEGATE(Load);
case Expression::Id::StoreId: DELEGATE(Store);
case Expression::Id::AtomicRMWId: DELEGATE(AtomicRMW);
+ case Expression::Id::AtomicCmpxchgId: DELEGATE(AtomicCmpxchg);
case Expression::Id::ConstId: DELEGATE(Const);
case Expression::Id::UnaryId: DELEGATE(Unary);
case Expression::Id::BinaryId: DELEGATE(Binary);
@@ -133,6 +135,7 @@ struct UnifiedExpressionVisitor : public Visitor<SubType> {
ReturnType visitLoad(Load* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
ReturnType visitStore(Store* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
ReturnType visitAtomicRMW(AtomicRMW* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
+ ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
ReturnType visitConst(Const* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
ReturnType visitUnary(Unary* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
ReturnType visitBinary(Binary* curr) { return static_cast<SubType*>(this)->visitExpression(curr); }
@@ -310,6 +313,7 @@ struct Walker : public VisitorType {
static void doVisitLoad(SubType* self, Expression** currp) { self->visitLoad((*currp)->cast<Load>()); }
static void doVisitStore(SubType* self, Expression** currp) { self->visitStore((*currp)->cast<Store>()); }
static void doVisitAtomicRMW(SubType* self, Expression** currp) { self->visitAtomicRMW((*currp)->cast<AtomicRMW>()); }
+ static void doVisitAtomicCmpxchg(SubType* self, Expression** currp){ self->visitAtomicCmpxchg((*currp)->cast<AtomicCmpxchg>()); }
static void doVisitConst(SubType* self, Expression** currp) { self->visitConst((*currp)->cast<Const>()); }
static void doVisitUnary(SubType* self, Expression** currp) { self->visitUnary((*currp)->cast<Unary>()); }
static void doVisitBinary(SubType* self, Expression** currp) { self->visitBinary((*currp)->cast<Binary>()); }
@@ -438,6 +442,13 @@ struct PostWalker : public Walker<SubType, VisitorType> {
self->pushTask(SubType::scan, &curr->cast<AtomicRMW>()->ptr);
break;
}
+ case Expression::Id::AtomicCmpxchgId: {
+ self->pushTask(SubType::doVisitAtomicCmpxchg, currp);
+ self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->replacement);
+ self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->expected);
+ self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->ptr);
+ break;
+ }
case Expression::Id::ConstId: {
self->pushTask(SubType::doVisitConst, currp);
break;