diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 26 | ||||
-rw-r--r-- | src/binaryen-c.h | 8 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 29 | ||||
-rw-r--r-- | src/ir/ExpressionAnalyzer.cpp | 2 | ||||
-rw-r--r-- | src/ir/ExpressionManipulator.cpp | 4 | ||||
-rw-r--r-- | src/ir/ReFinalize.cpp | 2 | ||||
-rw-r--r-- | src/ir/effects.h | 4 | ||||
-rw-r--r-- | src/ir/utils.h | 4 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 12 | ||||
-rw-r--r-- | src/passes/DeadCodeElimination.cpp | 2 | ||||
-rw-r--r-- | src/passes/Precompute.cpp | 2 | ||||
-rw-r--r-- | src/passes/Print.cpp | 10 | ||||
-rw-r--r-- | src/passes/RemoveUnusedModuleElements.cpp | 2 | ||||
-rw-r--r-- | src/tools/fuzzing.h | 2 | ||||
-rw-r--r-- | src/wasm-binary.h | 4 | ||||
-rw-r--r-- | src/wasm-builder.h | 14 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 6 | ||||
-rw-r--r-- | src/wasm-module-building.h | 20 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 2 | ||||
-rw-r--r-- | src/wasm-stack.h | 10 | ||||
-rw-r--r-- | src/wasm-traversal.h | 20 | ||||
-rw-r--r-- | src/wasm.h | 10 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 14 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 6 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 10 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 6 |
26 files changed, 113 insertions, 118 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 71cd92da4..72544d5d7 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -261,7 +261,7 @@ BinaryenExpressionId BinaryenUnreachableId(void) { return Expression::Id::Unreac BinaryenExpressionId BinaryenAtomicCmpxchgId(void) { return Expression::Id::AtomicCmpxchgId; } BinaryenExpressionId BinaryenAtomicRMWId(void) { return Expression::Id::AtomicRMWId; } BinaryenExpressionId BinaryenAtomicWaitId(void) { return Expression::Id::AtomicWaitId; } -BinaryenExpressionId BinaryenAtomicWakeId(void) { return Expression::Id::AtomicWakeId; } +BinaryenExpressionId BinaryenAtomicNotifyId(void) { return Expression::Id::AtomicNotifyId; } BinaryenExpressionId BinaryenSIMDExtractId(void) { return Expression::Id::SIMDExtractId; } BinaryenExpressionId BinaryenSIMDReplaceId(void) { return Expression::Id::SIMDReplaceId; } BinaryenExpressionId BinaryenSIMDShuffleId(void) { return Expression::Id::SIMDShuffleId; } @@ -1022,11 +1022,11 @@ BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpre return static_cast<Expression*>(ret); } -BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount) { - auto* ret = Builder(*((Module*)module)).makeAtomicWake((Expression*)ptr, (Expression*)wakeCount, 0); +BinaryenExpressionRef BinaryenAtomicNotify(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef notifyCount) { + auto* ret = Builder(*((Module*)module)).makeAtomicNotify((Expression*)ptr, (Expression*)notifyCount, 0); if (tracing) { - traceExpression(ret, "BinaryenAtomicWake", ptr, wakeCount); + traceExpression(ret, "BinaryenAtomicNotify", ptr, notifyCount); } return static_cast<Expression*>(ret); @@ -1849,24 +1849,24 @@ BinaryenType BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr) { assert(expression->is<AtomicWait>()); return static_cast<AtomicWait*>(expression)->expectedType; } -// AtomicWake -BinaryenExpressionRef BinaryenAtomicWakeGetPtr(BinaryenExpressionRef expr) { +// AtomicNotify +BinaryenExpressionRef BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr) { if (tracing) { - std::cout << " BinaryenAtomicWakeGetPtr(expressions[" << expressions[expr] << "]);\n"; + std::cout << " BinaryenAtomicNotifyGetPtr(expressions[" << expressions[expr] << "]);\n"; } auto* expression = (Expression*)expr; - assert(expression->is<AtomicWake>()); - return static_cast<AtomicWake*>(expression)->ptr; + assert(expression->is<AtomicNotify>()); + return static_cast<AtomicNotify*>(expression)->ptr; } -BinaryenExpressionRef BinaryenAtomicWakeGetWakeCount(BinaryenExpressionRef expr) { +BinaryenExpressionRef BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr) { if (tracing) { - std::cout << " BinaryenAtomicWakeGetWakeCount(expressions[" << expressions[expr] << "]);\n"; + std::cout << " BinaryenAtomicNotifyGetNotifyCount(expressions[" << expressions[expr] << "]);\n"; } auto* expression = (Expression*)expr; - assert(expression->is<AtomicWake>()); - return static_cast<AtomicWake*>(expression)->wakeCount; + assert(expression->is<AtomicNotify>()); + return static_cast<AtomicNotify*>(expression)->notifyCount; } // SIMDExtract BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr) { diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 787bfb242..5bc95e0f8 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -116,7 +116,7 @@ BinaryenExpressionId BinaryenUnreachableId(void); BinaryenExpressionId BinaryenAtomicCmpxchgId(void); BinaryenExpressionId BinaryenAtomicRMWId(void); BinaryenExpressionId BinaryenAtomicWaitId(void); -BinaryenExpressionId BinaryenAtomicWakeId(void); +BinaryenExpressionId BinaryenAtomicNotifyId(void); BinaryenExpressionId BinaryenSIMDExtractId(void); BinaryenExpressionId BinaryenSIMDReplaceId(void); BinaryenExpressionId BinaryenSIMDShuffleId(void); @@ -538,7 +538,7 @@ BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t byt BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type); BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type); BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType type); -BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount); +BinaryenExpressionRef BinaryenAtomicNotify(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef notifyCount); BinaryenExpressionRef BinaryenSIMDExtract(BinaryenModuleRef module, BinaryenOp op, BinaryenExpressionRef vec, uint8_t index); BinaryenExpressionRef BinaryenSIMDReplace(BinaryenModuleRef module, BinaryenOp op, BinaryenExpressionRef vec, uint8_t index, BinaryenExpressionRef value); BinaryenExpressionRef BinaryenSIMDShuffle(BinaryenModuleRef module, BinaryenExpressionRef left, BinaryenExpressionRef right, const uint8_t mask[16]); @@ -652,8 +652,8 @@ BinaryenExpressionRef BinaryenAtomicWaitGetExpected(BinaryenExpressionRef expr); BinaryenExpressionRef BinaryenAtomicWaitGetTimeout(BinaryenExpressionRef expr); BinaryenType BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr); -BinaryenExpressionRef BinaryenAtomicWakeGetPtr(BinaryenExpressionRef expr); -BinaryenExpressionRef BinaryenAtomicWakeGetWakeCount(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr); BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr); BinaryenExpressionRef BinaryenSIMDExtractGetVec(BinaryenExpressionRef expr); diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 710f0d829..c9daba100 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -5,6 +5,9 @@ char op[27] = {'\0'}; strncpy(op, s[0]->c_str(), 26); switch (op[0]) { + case 'a': + if (strcmp(op, "atomic.notify") == 0) return makeAtomicNotify(s); + goto parse_error; case 'b': { switch (op[1]) { case 'l': @@ -946,6 +949,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'w': + if (strcmp(op, "i32.atomic.wait") == 0) return makeAtomicWait(s, i32); + goto parse_error; default: goto parse_error; } } @@ -1235,17 +1241,9 @@ switch (op[0]) { default: goto parse_error; } } - case 'w': { - switch (op[5]) { - case 'a': - if (strcmp(op, "i32.wait") == 0) return makeAtomicWait(s, i32); - goto parse_error; - case 'r': - if (strcmp(op, "i32.wrap_i64") == 0) return makeUnary(s, UnaryOp::WrapInt64); - goto parse_error; - default: goto parse_error; - } - } + case 'w': + if (strcmp(op, "i32.wrap_i64") == 0) return makeUnary(s, UnaryOp::WrapInt64); + goto parse_error; case 'x': if (strcmp(op, "i32.xor") == 0) return makeBinary(s, BinaryOp::XorInt32); goto parse_error; @@ -1594,6 +1592,9 @@ switch (op[0]) { default: goto parse_error; } } + case 'w': + if (strcmp(op, "i64.atomic.wait") == 0) return makeAtomicWait(s, i64); + goto parse_error; default: goto parse_error; } } @@ -1911,9 +1912,6 @@ switch (op[0]) { default: goto parse_error; } } - case 'w': - if (strcmp(op, "i64.wait") == 0) return makeAtomicWait(s, i64); - goto parse_error; case 'x': if (strcmp(op, "i64.xor") == 0) return makeBinary(s, BinaryOp::XorInt64); goto parse_error; @@ -2257,9 +2255,6 @@ switch (op[0]) { default: goto parse_error; } } - case 'w': - if (strcmp(op, "wake") == 0) return makeAtomicWake(s); - goto parse_error; default: goto parse_error; } parse_error: diff --git a/src/ir/ExpressionAnalyzer.cpp b/src/ir/ExpressionAnalyzer.cpp index fecee0cce..fcbd29665 100644 --- a/src/ir/ExpressionAnalyzer.cpp +++ b/src/ir/ExpressionAnalyzer.cpp @@ -171,7 +171,7 @@ void visitImmediates(Expression* curr, T& visitor) { visitor.visitAddress(curr->offset); visitor.visitType(curr->expectedType); } - void visitAtomicWake(AtomicWake* curr) { + void visitAtomicNotify(AtomicNotify* curr) { visitor.visitAddress(curr->offset); } void visitSIMDExtract(SIMDExtract* curr) { diff --git a/src/ir/ExpressionManipulator.cpp b/src/ir/ExpressionManipulator.cpp index 32ee442b7..578d35e3f 100644 --- a/src/ir/ExpressionManipulator.cpp +++ b/src/ir/ExpressionManipulator.cpp @@ -111,8 +111,8 @@ Expression* flexibleCopy(Expression* original, Module& wasm, CustomCopier custom Expression* visitAtomicWait(AtomicWait* curr) { return builder.makeAtomicWait(copy(curr->ptr), copy(curr->expected), copy(curr->timeout), curr->expectedType, curr->offset); } - Expression* visitAtomicWake(AtomicWake* curr) { - return builder.makeAtomicWake(copy(curr->ptr), copy(curr->wakeCount), curr->offset); + Expression* visitAtomicNotify(AtomicNotify* curr) { + return builder.makeAtomicNotify(copy(curr->ptr), copy(curr->notifyCount), curr->offset); } Expression* visitSIMDExtract(SIMDExtract* curr) { return builder.makeSIMDExtract(curr->op, copy(curr->vec), curr->index); diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp index 3f374265c..e4d5180d1 100644 --- a/src/ir/ReFinalize.cpp +++ b/src/ir/ReFinalize.cpp @@ -136,7 +136,7 @@ void ReFinalize::visitStore(Store* curr) { curr->finalize(); } void ReFinalize::visitAtomicRMW(AtomicRMW* curr) { curr->finalize(); } void ReFinalize::visitAtomicCmpxchg(AtomicCmpxchg* curr) { curr->finalize(); } void ReFinalize::visitAtomicWait(AtomicWait* curr) { curr->finalize(); } -void ReFinalize::visitAtomicWake(AtomicWake* curr) { curr->finalize(); } +void ReFinalize::visitAtomicNotify(AtomicNotify* curr) { curr->finalize(); } void ReFinalize::visitSIMDExtract(SIMDExtract* curr) { curr->finalize(); } void ReFinalize::visitSIMDReplace(SIMDReplace* curr) { curr->finalize(); } void ReFinalize::visitSIMDShuffle(SIMDShuffle* curr) { curr->finalize(); } diff --git a/src/ir/effects.h b/src/ir/effects.h index 394bf0116..401232fa1 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -230,8 +230,8 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer> { isAtomic = true; if (!ignoreImplicitTraps) implicitTrap = true; } - void visitAtomicWake(AtomicWake* curr) { - // AtomicWake doesn't strictly write memory, but it does modify the waiters + void visitAtomicNotify(AtomicNotify* curr) { + // AtomicNotify doesn't strictly write memory, but it does modify the waiters // list associated with the specified address, which we can think of as a // write. readsMemory = true; diff --git a/src/ir/utils.h b/src/ir/utils.h index db437875d..c91698124 100644 --- a/src/ir/utils.h +++ b/src/ir/utils.h @@ -128,7 +128,7 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize, OverriddenVisitor<R void visitAtomicRMW(AtomicRMW* curr); void visitAtomicCmpxchg(AtomicCmpxchg* curr); void visitAtomicWait(AtomicWait* curr); - void visitAtomicWake(AtomicWake* curr); + void visitAtomicNotify(AtomicNotify* curr); void visitSIMDExtract(SIMDExtract* curr); void visitSIMDReplace(SIMDReplace* curr); void visitSIMDShuffle(SIMDShuffle* curr); @@ -184,7 +184,7 @@ struct ReFinalizeNode : public OverriddenVisitor<ReFinalizeNode> { void visitAtomicRMW(AtomicRMW* curr) { curr->finalize(); } void visitAtomicCmpxchg(AtomicCmpxchg* curr) { curr->finalize(); } void visitAtomicWait(AtomicWait* curr) { curr->finalize(); } - void visitAtomicWake(AtomicWake* curr) { curr->finalize(); } + void visitAtomicNotify(AtomicNotify* curr) { curr->finalize(); } void visitSIMDExtract(SIMDExtract* curr) { curr->finalize(); } void visitSIMDReplace(SIMDReplace* curr) { curr->finalize(); } void visitSIMDShuffle(SIMDShuffle* curr) { curr->finalize(); } diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index aee41255c..1796080fc 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -67,7 +67,7 @@ Module['UnreachableId'] = Module['_BinaryenUnreachableId'](); Module['AtomicCmpxchgId'] = Module['_BinaryenAtomicCmpxchgId'](); Module['AtomicRMWId'] = Module['_BinaryenAtomicRMWId'](); Module['AtomicWaitId'] = Module['_BinaryenAtomicWaitId'](); -Module['AtomicWakeId'] = Module['_BinaryenAtomicWakeId'](); +Module['AtomicNotifyId'] = Module['_BinaryenAtomicNotifyId'](); Module['SIMDExtractId'] = Module['_BinaryenSIMDExtractId'](); Module['SIMDReplaceId'] = Module['_BinaryenSIMDReplaceId'](); Module['SIMDShuffleId'] = Module['_BinaryenSIMDShuffleId'](); @@ -1728,8 +1728,8 @@ function wrapModule(module, self) { self['unreachable'] = function() { return Module['_BinaryenUnreachable'](module); }; - self['wake'] = function(ptr, wakeCount) { - return Module['_BinaryenAtomicWake'](module, ptr, wakeCount); + self['notify'] = function(ptr, notifyCount) { + return Module['_BinaryenAtomicNotify'](module, ptr, notifyCount); }; // 'Module' operations @@ -2208,12 +2208,12 @@ Module['getExpressionInfo'] = function(expr) { 'timeout': Module['_BinaryenAtomicWaitGetTimeout'](expr), 'expectedType': Module['_BinaryenAtomicWaitGetExpectedType'](expr) }; - case Module['AtomicWakeId']: + case Module['AtomicNotifyId']: return { 'id': id, 'type': type, - 'ptr': Module['_BinaryenAtomicWakeGetPtr'](expr), - 'wakeCount': Module['_BinaryenAtomicWakeGetWakeCount'](expr) + 'ptr': Module['_BinaryenAtomicNotifyGetPtr'](expr), + 'notifyCount': Module['_BinaryenAtomicNotifyGetNotifyCount'](expr) }; case Module['SIMDExtractId']: return { diff --git a/src/passes/DeadCodeElimination.cpp b/src/passes/DeadCodeElimination.cpp index a6b20a7ba..a56c88929 100644 --- a/src/passes/DeadCodeElimination.cpp +++ b/src/passes/DeadCodeElimination.cpp @@ -256,7 +256,7 @@ struct DeadCodeElimination : public WalkerPass<PostWalker<DeadCodeElimination>> case Expression::Id::AtomicCmpxchgId: DELEGATE(AtomicCmpxchg); case Expression::Id::AtomicRMWId: DELEGATE(AtomicRMW); case Expression::Id::AtomicWaitId: DELEGATE(AtomicWait); - case Expression::Id::AtomicWakeId: DELEGATE(AtomicWake); + case Expression::Id::AtomicNotifyId: DELEGATE(AtomicNotify); case Expression::Id::SIMDExtractId: DELEGATE(SIMDExtract); case Expression::Id::SIMDReplaceId: DELEGATE(SIMDReplace); case Expression::Id::SIMDShuffleId: DELEGATE(SIMDShuffle); diff --git a/src/passes/Precompute.cpp b/src/passes/Precompute.cpp index 5e9d9c9ea..6f59fceb7 100644 --- a/src/passes/Precompute.cpp +++ b/src/passes/Precompute.cpp @@ -119,7 +119,7 @@ public: Flow visitAtomicWait(AtomicWait *curr) { return Flow(NOTPRECOMPUTABLE_FLOW); } - Flow visitAtomicWake(AtomicWake *curr) { + Flow visitAtomicNotify(AtomicNotify *curr) { return Flow(NOTPRECOMPUTABLE_FLOW); } Flow visitHost(Host *curr) { diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index fd0bf17dc..6d7d512ff 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -228,13 +228,13 @@ struct PrintExpressionContents : public Visitor<PrintExpressionContents> { } void visitAtomicWait(AtomicWait* curr) { prepareColor(o); - o << printType(curr->expectedType) << ".wait"; + o << printType(curr->expectedType) << ".atomic.wait"; if (curr->offset) { o << " offset=" << curr->offset; } } - void visitAtomicWake(AtomicWake* curr) { - printMedium(o, "wake"); + void visitAtomicNotify(AtomicNotify* curr) { + printMedium(o, "atomic.notify"); if (curr->offset) { o << " offset=" << curr->offset; } @@ -904,12 +904,12 @@ struct PrintSExpression : public Visitor<PrintSExpression> { printFullLine(curr->timeout); decIndent(); } - void visitAtomicWake(AtomicWake* curr) { + void visitAtomicNotify(AtomicNotify* curr) { o << '('; PrintExpressionContents(currFunction, o).visit(curr); incIndent(); printFullLine(curr->ptr); - printFullLine(curr->wakeCount); + printFullLine(curr->notifyCount); decIndent(); } void visitSIMDExtract(SIMDExtract* curr) { diff --git a/src/passes/RemoveUnusedModuleElements.cpp b/src/passes/RemoveUnusedModuleElements.cpp index 069137ff6..b9c8d5150 100644 --- a/src/passes/RemoveUnusedModuleElements.cpp +++ b/src/passes/RemoveUnusedModuleElements.cpp @@ -114,7 +114,7 @@ struct ReachabilityAnalyzer : public PostWalker<ReachabilityAnalyzer> { void visitAtomicWait(AtomicWait* curr) { usesMemory = true; } - void visitAtomicWake(AtomicWake* curr) { + void visitAtomicNotify(AtomicNotify* curr) { usesMemory = true; } void visitHost(Host* curr) { diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h index f16d0ecad..6aa0764f1 100644 --- a/src/tools/fuzzing.h +++ b/src/tools/fuzzing.h @@ -1618,7 +1618,7 @@ private: } else { auto* ptr = makePointer(); auto* count = make(i32); - return builder.makeAtomicWake(ptr, count, logify(get())); + return builder.makeAtomicNotify(ptr, count, logify(get())); } } Index bytes; diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 66c95299e..8b449192a 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -557,7 +557,7 @@ enum ASTNodes { }; enum AtomicOpcodes { - AtomicWake = 0x00, + AtomicNotify = 0x00, I32AtomicWait = 0x01, I64AtomicWait = 0x02, @@ -1108,7 +1108,7 @@ public: bool maybeVisitAtomicRMW(Expression*& out, uint8_t code); bool maybeVisitAtomicCmpxchg(Expression*& out, uint8_t code); bool maybeVisitAtomicWait(Expression*& out, uint8_t code); - bool maybeVisitAtomicWake(Expression*& out, uint8_t code); + bool maybeVisitAtomicNotify(Expression*& out, uint8_t code); bool maybeVisitConst(Expression*& out, uint8_t code); bool maybeVisitUnary(Expression*& out, uint8_t code); bool maybeVisitBinary(Expression*& out, uint8_t code); diff --git a/src/wasm-builder.h b/src/wasm-builder.h index eee4e3b79..8c50ff2dc 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -247,13 +247,13 @@ public: wait->finalize(); return wait; } - AtomicWake* makeAtomicWake(Expression* ptr, Expression* wakeCount, Address offset) { - auto* wake = allocator.alloc<AtomicWake>(); - wake->offset = offset; - wake->ptr = ptr; - wake->wakeCount = wakeCount; - wake->finalize(); - return wake; + AtomicNotify* makeAtomicNotify(Expression* ptr, Expression* notifyCount, Address offset) { + auto* notify = allocator.alloc<AtomicNotify>(); + notify->offset = offset; + notify->ptr = ptr; + notify->notifyCount = notifyCount; + notify->finalize(); + return notify; } Store* makeStore(unsigned bytes, uint32_t offset, unsigned align, Expression *ptr, Expression *value, Type type) { auto* ret = allocator.alloc<Store>(); diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index c584f0ea7..ae9494d1c 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1124,12 +1124,12 @@ public: // for now, just assume we are woken up return Literal(int32_t(0)); // woken up } - Flow visitAtomicWake(AtomicWake *curr) { - NOTE_ENTER("AtomicWake"); + Flow visitAtomicNotify(AtomicNotify *curr) { + NOTE_ENTER("AtomicNotify"); Flow ptr = this->visit(curr->ptr); if (ptr.breaking()) return ptr; NOTE_EVAL1(ptr); - auto count = this->visit(curr->wakeCount); + auto count = this->visit(curr->notifyCount); NOTE_EVAL1(count); if (count.breaking()) return count; // TODO: add threads support! diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index e92436952..d1f8f5504 100644 --- a/src/wasm-module-building.h +++ b/src/wasm-module-building.h @@ -65,7 +65,7 @@ static std::mutex debug; // * workers transform functions into nullptrs, and optimize them // * we keep an atomic count of the number of active workers and // the number of optimized functions. -// * after adding a function, the main thread wakes up workers if +// * after adding a function, the main thread notifys up workers if // it calculates there is work for them. // * a lock is used for going to sleep and waking up. // Locking should be rare, as optimization is @@ -156,10 +156,10 @@ public: wasm->addFunction(func); if (!useWorkers()) return; // we optimize at the end in that case queueFunction(func); - // wake workers if needed - auto wake = availableFuncs.load(); - for (uint32_t i = 0; i < wake; i++) { - wakeWorker(); + // notify workers if needed + auto notify = availableFuncs.load(); + for (uint32_t i = 0; i < notify; i++) { + notifyWorker(); } } @@ -180,7 +180,7 @@ public: } else { DEBUG_THREAD("finish()ing"); assert(nextFunction == numFunctions); - wakeAllWorkers(); + notifyAllWorkers(); waitUntilAllFinished(); } // TODO: clear side thread allocators from module allocator, as these threads were transient @@ -192,14 +192,14 @@ private: threads.emplace_back(make_unique<std::thread>(workerMain, this)); } - void wakeWorker() { - DEBUG_THREAD("wake a worker"); + void notifyWorker() { + DEBUG_THREAD("notify a worker"); std::lock_guard<std::mutex> lock(mutex); condition.notify_one(); } - void wakeAllWorkers() { - DEBUG_THREAD("wake all workers"); + void notifyAllWorkers() { + DEBUG_THREAD("notify all workers"); std::lock_guard<std::mutex> lock(mutex); condition.notify_all(); } diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 07de235a2..c80fa8b83 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -191,7 +191,7 @@ private: Expression* makeAtomicRMW(Element& s, Type type, uint8_t bytes, const char* extra); Expression* makeAtomicCmpxchg(Element& s, Type type, uint8_t bytes, const char* extra); Expression* makeAtomicWait(Element& s, Type type); - Expression* makeAtomicWake(Element& s); + Expression* makeAtomicNotify(Element& s); Expression* makeSIMDExtract(Element& s, SIMDExtractOp op, size_t lanes); Expression* makeSIMDReplace(Element& s, SIMDReplaceOp op, size_t lanes); Expression* makeSIMDShuffle(Element& s); diff --git a/src/wasm-stack.h b/src/wasm-stack.h index f0995497a..afef2632b 100644 --- a/src/wasm-stack.h +++ b/src/wasm-stack.h @@ -134,7 +134,7 @@ public: void visitAtomicRMW(AtomicRMW* curr); void visitAtomicCmpxchg(AtomicCmpxchg* curr); void visitAtomicWait(AtomicWait* curr); - void visitAtomicWake(AtomicWake* curr); + void visitAtomicNotify(AtomicNotify* curr); void visitSIMDExtract(SIMDExtract* curr); void visitSIMDReplace(SIMDReplace* curr); void visitSIMDShuffle(SIMDShuffle* curr); @@ -890,15 +890,15 @@ void StackWriter<Mode, Parent>::visitAtomicWait(AtomicWait* curr) { } template<StackWriterMode Mode, typename Parent> -void StackWriter<Mode, Parent>::visitAtomicWake(AtomicWake* curr) { +void StackWriter<Mode, Parent>::visitAtomicNotify(AtomicNotify* curr) { visitChild(curr->ptr); // stop if the rest isn't reachable anyhow if (curr->ptr->type == unreachable) return; - visitChild(curr->wakeCount); - if (curr->wakeCount->type == unreachable) return; + visitChild(curr->notifyCount); + if (curr->notifyCount->type == unreachable) return; if (justAddToStack(curr)) return; - o << int8_t(BinaryConsts::AtomicPrefix) << int8_t(BinaryConsts::AtomicWake); + o << int8_t(BinaryConsts::AtomicPrefix) << int8_t(BinaryConsts::AtomicNotify); emitMemoryAccess(4, 4, 0); } diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h index 541490418..6259bf271 100644 --- a/src/wasm-traversal.h +++ b/src/wasm-traversal.h @@ -54,7 +54,7 @@ struct Visitor { ReturnType visitAtomicRMW(AtomicRMW* curr) { return ReturnType(); } ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) { return ReturnType(); } ReturnType visitAtomicWait(AtomicWait* curr) { return ReturnType(); } - ReturnType visitAtomicWake(AtomicWake* curr) { return ReturnType(); } + ReturnType visitAtomicNotify(AtomicNotify* curr) { return ReturnType(); } ReturnType visitSIMDExtract(SIMDExtract* curr) { return ReturnType(); } ReturnType visitSIMDReplace(SIMDReplace* curr) { return ReturnType(); } ReturnType visitSIMDShuffle(SIMDShuffle* curr) { return ReturnType(); } @@ -106,7 +106,7 @@ struct Visitor { case Expression::Id::AtomicRMWId: DELEGATE(AtomicRMW); case Expression::Id::AtomicCmpxchgId: DELEGATE(AtomicCmpxchg); case Expression::Id::AtomicWaitId: DELEGATE(AtomicWait); - case Expression::Id::AtomicWakeId: DELEGATE(AtomicWake); + case Expression::Id::AtomicNotifyId: DELEGATE(AtomicNotify); case Expression::Id::SIMDExtractId: DELEGATE(SIMDExtract); case Expression::Id::SIMDReplaceId: DELEGATE(SIMDReplace); case Expression::Id::SIMDShuffleId: DELEGATE(SIMDShuffle); @@ -160,7 +160,7 @@ struct OverriddenVisitor { UNIMPLEMENTED(AtomicRMW); UNIMPLEMENTED(AtomicCmpxchg); UNIMPLEMENTED(AtomicWait); - UNIMPLEMENTED(AtomicWake); + UNIMPLEMENTED(AtomicNotify); UNIMPLEMENTED(SIMDExtract); UNIMPLEMENTED(SIMDReplace); UNIMPLEMENTED(SIMDShuffle); @@ -213,7 +213,7 @@ struct OverriddenVisitor { case Expression::Id::AtomicRMWId: DELEGATE(AtomicRMW); case Expression::Id::AtomicCmpxchgId: DELEGATE(AtomicCmpxchg); case Expression::Id::AtomicWaitId: DELEGATE(AtomicWait); - case Expression::Id::AtomicWakeId: DELEGATE(AtomicWake); + case Expression::Id::AtomicNotifyId: DELEGATE(AtomicNotify); case Expression::Id::SIMDExtractId: DELEGATE(SIMDExtract); case Expression::Id::SIMDReplaceId: DELEGATE(SIMDReplace); case Expression::Id::SIMDShuffleId: DELEGATE(SIMDShuffle); @@ -265,7 +265,7 @@ struct UnifiedExpressionVisitor : public Visitor<SubType, ReturnType> { ReturnType visitAtomicRMW(AtomicRMW* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitAtomicWait(AtomicWait* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } - ReturnType visitAtomicWake(AtomicWake* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } + ReturnType visitAtomicNotify(AtomicNotify* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitSIMDExtract(SIMDExtract* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitSIMDReplace(SIMDReplace* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitSIMDShuffle(SIMDShuffle* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } @@ -473,7 +473,7 @@ struct Walker : public VisitorType { 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 doVisitAtomicWait(SubType* self, Expression** currp) { self->visitAtomicWait((*currp)->cast<AtomicWait>()); } - static void doVisitAtomicWake(SubType* self, Expression** currp) { self->visitAtomicWake((*currp)->cast<AtomicWake>()); } + static void doVisitAtomicNotify(SubType* self, Expression** currp) { self->visitAtomicNotify((*currp)->cast<AtomicNotify>()); } static void doVisitSIMDExtract(SubType* self, Expression** currp) { self->visitSIMDExtract((*currp)->cast<SIMDExtract>()); } static void doVisitSIMDReplace(SubType* self, Expression** currp) { self->visitSIMDReplace((*currp)->cast<SIMDReplace>()); } static void doVisitSIMDShuffle(SubType* self, Expression** currp) { self->visitSIMDShuffle((*currp)->cast<SIMDShuffle>()); } @@ -617,10 +617,10 @@ struct PostWalker : public Walker<SubType, VisitorType> { self->pushTask(SubType::scan, &curr->cast<AtomicWait>()->ptr); break; } - case Expression::Id::AtomicWakeId: { - self->pushTask(SubType::doVisitAtomicWake, currp); - self->pushTask(SubType::scan, &curr->cast<AtomicWake>()->wakeCount); - self->pushTask(SubType::scan, &curr->cast<AtomicWake>()->ptr); + case Expression::Id::AtomicNotifyId: { + self->pushTask(SubType::doVisitAtomicNotify, currp); + self->pushTask(SubType::scan, &curr->cast<AtomicNotify>()->notifyCount); + self->pushTask(SubType::scan, &curr->cast<AtomicNotify>()->ptr); break; } case Expression::Id::SIMDExtractId: { diff --git a/src/wasm.h b/src/wasm.h index ab9d7c816..12071fdb4 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -206,7 +206,7 @@ public: AtomicRMWId, AtomicCmpxchgId, AtomicWaitId, - AtomicWakeId, + AtomicNotifyId, SIMDExtractId, SIMDReplaceId, SIMDShuffleId, @@ -512,14 +512,14 @@ class AtomicWait : public SpecificExpression<Expression::AtomicWaitId> { void finalize(); }; -class AtomicWake : public SpecificExpression<Expression::AtomicWakeId> { +class AtomicNotify : public SpecificExpression<Expression::AtomicNotifyId> { public: - AtomicWake() = default; - AtomicWake(MixedArena& allocator) : AtomicWake() {} + AtomicNotify() = default; + AtomicNotify(MixedArena& allocator) : AtomicNotify() {} Address offset; Expression* ptr; - Expression* wakeCount; + Expression* notifyCount; void finalize(); }; diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 18bd48e2a..643f69dde 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -1703,7 +1703,7 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitAtomicRMW(curr, code)) break; if (maybeVisitAtomicCmpxchg(curr, code)) break; if (maybeVisitAtomicWait(curr, code)) break; - if (maybeVisitAtomicWake(curr, code)) break; + if (maybeVisitAtomicNotify(curr, code)) break; throwError("invalid code after atomic prefix: " + std::to_string(code)); break; } @@ -2215,17 +2215,17 @@ bool WasmBinaryBuilder::maybeVisitAtomicWait(Expression*& out, uint8_t code) { return true; } -bool WasmBinaryBuilder::maybeVisitAtomicWake(Expression*& out, uint8_t code) { - if (code != BinaryConsts::AtomicWake) return false; - auto* curr = allocator.alloc<AtomicWake>(); - if (debug) std::cerr << "zz node: AtomicWake" << std::endl; +bool WasmBinaryBuilder::maybeVisitAtomicNotify(Expression*& out, uint8_t code) { + if (code != BinaryConsts::AtomicNotify) return false; + auto* curr = allocator.alloc<AtomicNotify>(); + if (debug) std::cerr << "zz node: AtomicNotify" << std::endl; curr->type = i32; - curr->wakeCount = popNonVoidExpression(); + curr->notifyCount = popNonVoidExpression(); curr->ptr = popNonVoidExpression(); Address readAlign; readMemoryAccess(readAlign, curr->offset); - if (readAlign != getTypeSize(curr->type)) throwError("Align of AtomicWake must match size"); + if (readAlign != getTypeSize(curr->type)) throwError("Align of AtomicNotify must match size"); curr->finalize(); out = curr; return true; diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 1067264f7..ddda991cd 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -1071,11 +1071,11 @@ Expression* SExpressionWasmBuilder::makeAtomicWait(Element& s, Type type) { return ret; } -Expression* SExpressionWasmBuilder::makeAtomicWake(Element& s) { - auto ret = allocator.alloc<AtomicWake>(); +Expression* SExpressionWasmBuilder::makeAtomicNotify(Element& s) { + auto ret = allocator.alloc<AtomicNotify>(); ret->type = i32; ret->ptr = parseExpression(s[1]); - ret->wakeCount = parseExpression(s[2]); + ret->notifyCount = parseExpression(s[2]); ret->finalize(); return ret; } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 5c0e0d542..6d4490982 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -245,7 +245,7 @@ public: void visitAtomicRMW(AtomicRMW* curr); void visitAtomicCmpxchg(AtomicCmpxchg* curr); void visitAtomicWait(AtomicWait* curr); - void visitAtomicWake(AtomicWake* curr); + void visitAtomicNotify(AtomicNotify* curr); void visitSIMDExtract(SIMDExtract* curr); void visitSIMDReplace(SIMDReplace* curr); void visitSIMDShuffle(SIMDShuffle* curr); @@ -576,12 +576,12 @@ void FunctionValidator::visitAtomicWait(AtomicWait* curr) { shouldBeEqualOrFirstIsUnreachable(curr->timeout->type, i64, curr, "AtomicWait timeout type must be i64"); } -void FunctionValidator::visitAtomicWake(AtomicWake* curr) { +void FunctionValidator::visitAtomicNotify(AtomicNotify* curr) { shouldBeTrue(info.features.hasAtomics(), curr, "Atomic operation (atomics are disabled)"); shouldBeFalse(!getModule()->memory.shared, curr, "Atomic operation with non-shared memory"); - shouldBeEqualOrFirstIsUnreachable(curr->type, i32, curr, "AtomicWake must have type i32"); - shouldBeEqualOrFirstIsUnreachable(curr->ptr->type, i32, curr, "AtomicWake pointer type must be i32"); - shouldBeEqualOrFirstIsUnreachable(curr->wakeCount->type, i32, curr, "AtomicWake wakeCount type must be i32"); + shouldBeEqualOrFirstIsUnreachable(curr->type, i32, curr, "AtomicNotify must have type i32"); + shouldBeEqualOrFirstIsUnreachable(curr->ptr->type, i32, curr, "AtomicNotify pointer type must be i32"); + shouldBeEqualOrFirstIsUnreachable(curr->notifyCount->type, i32, curr, "AtomicNotify notifyCount type must be i32"); } void FunctionValidator::visitSIMDExtract(SIMDExtract* curr) { diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index c99bb0994..e135ba750 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -105,7 +105,7 @@ const char* getExpressionName(Expression* curr) { case Expression::Id::AtomicCmpxchgId: return "atomic_cmpxchg"; case Expression::Id::AtomicRMWId: return "atomic_rmw"; case Expression::Id::AtomicWaitId: return "atomic_wait"; - case Expression::Id::AtomicWakeId: return "atomic_wake"; + case Expression::Id::AtomicNotifyId: return "atomic_notify"; case Expression::Id::SIMDExtractId: return "simd_extract"; case Expression::Id::SIMDReplaceId: return "simd_replace"; case Expression::Id::SIMDShuffleId: return "simd_shuffle"; @@ -420,9 +420,9 @@ void AtomicWait::finalize() { } } -void AtomicWake::finalize() { +void AtomicNotify::finalize() { type = i32; - if (ptr->type == unreachable || wakeCount->type == unreachable) { + if (ptr->type == unreachable || notifyCount->type == unreachable) { type = unreachable; } } |