diff options
author | Daniel Wirtz <dcode@dcode.io> | 2020-01-17 18:43:45 +0100 |
---|---|---|
committer | Alon Zakai <azakai@google.com> | 2020-01-17 09:43:44 -0800 |
commit | 98f5507c508d6fde326347df3fcad70740b634ea (patch) | |
tree | 3b8a7f1420ba81ca8e8df5b10a9e744a3602e6b4 /src/ir/effects.h | |
parent | e873e2a84db3fda3c8df5ed8e0b39578a1fb2f2d (diff) | |
download | binaryen-98f5507c508d6fde326347df3fcad70740b634ea.tar.gz binaryen-98f5507c508d6fde326347df3fcad70740b634ea.tar.bz2 binaryen-98f5507c508d6fde326347df3fcad70740b634ea.zip |
Expose ExpressionAnalyzer in C-/JS-API (#2585)
Instead of reinventing the wheel on our side, this adds ExpressionAnalyzer
bindings to the C- and JS-APIs, which can be useful for generators. For
example, a generator may decide to simplify a compilation step if a
subexpression doesn't have any side effects, or simply skip emitting
something that is likely to compile to a drop or an empty block right away.
Diffstat (limited to 'src/ir/effects.h')
-rw-r--r-- | src/ir/effects.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/ir/effects.h b/src/ir/effects.h index 9c8887333..0d1e2c2b1 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -408,6 +408,57 @@ struct EffectAnalyzer EffectAnalyzer bEffects(passOptions, b); return !aEffects.invalidates(bEffects); } + + // C-API + + enum SideEffects : uint32_t { + None = 0, + Branches = 1 << 0, + Calls = 1 << 1, + ReadsLocal = 1 << 2, + WritesLocal = 1 << 3, + ReadsGlobal = 1 << 4, + WritesGlobal = 1 << 5, + ReadsMemory = 1 << 6, + WritesMemory = 1 << 7, + ImplicitTrap = 1 << 8, + IsAtomic = 1 << 9, + Any = (1 << 10) - 1 + }; + uint32_t getSideEffects() const { + uint32_t effects = 0; + if (branches) { + effects |= SideEffects::Branches; + } + if (calls) { + effects |= SideEffects::Calls; + } + if (localsRead.size() > 0) { + effects |= SideEffects::ReadsLocal; + } + if (localsWritten.size() > 0) { + effects |= SideEffects::WritesLocal; + } + if (globalsRead.size() > 0) { + effects |= SideEffects::ReadsGlobal; + } + if (globalsWritten.size() > 0) { + effects |= SideEffects::WritesGlobal; + } + if (readsMemory) { + effects |= SideEffects::ReadsMemory; + } + if (writesMemory) { + effects |= SideEffects::WritesMemory; + } + if (implicitTrap) { + effects |= SideEffects::ImplicitTrap; + } + if (isAtomic) { + effects |= SideEffects::IsAtomic; + } + return effects; + } }; } // namespace wasm |