diff options
Diffstat (limited to 'src/ast_utils.h')
-rw-r--r-- | src/ast_utils.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h index 77bfaf1f3..3e45d0e33 100644 --- a/src/ast_utils.h +++ b/src/ast_utils.h @@ -160,6 +160,8 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer, Visitor<EffectAnalyzer void visitSetLocal(SetLocal *curr) { localsWritten.insert(curr->index); } + void visitGetGlobal(GetGlobal *curr) { readsMemory = true; } // TODO: global-specific + void visitSetGlobal(SetGlobal *curr) { writesMemory = true; } // stuff? void visitLoad(Load *curr) { readsMemory = true; } void visitStore(Store *curr) { writesMemory = true; } void visitReturn(Return *curr) { branches = true; } @@ -277,6 +279,12 @@ struct ExpressionManipulator { Expression* visitSetLocal(SetLocal *curr) { return builder.makeSetLocal(curr->index, copy(curr->value)); } + Expression* visitGetGlobal(GetGlobal *curr) { + return builder.makeGetGlobal(curr->index, curr->type); + } + Expression* visitSetGlobal(SetGlobal *curr) { + return builder.makeSetGlobal(curr->index, copy(curr->value)); + } Expression* visitLoad(Load *curr) { return builder.makeLoad(curr->bytes, curr->signed_, curr->offset, curr->align, copy(curr->ptr), curr->type); } @@ -476,6 +484,15 @@ struct ExpressionAnalyzer { PUSH(SetLocal, value); break; } + case Expression::Id::GetGlobalId: { + CHECK(GetGlobal, index); + break; + } + case Expression::Id::SetGlobalId: { + CHECK(SetGlobal, index); + PUSH(SetGlobal, value); + break; + } case Expression::Id::LoadId: { CHECK(Load, bytes); CHECK(Load, signed_); @@ -678,6 +695,15 @@ struct ExpressionAnalyzer { PUSH(SetLocal, value); break; } + case Expression::Id::GetGlobalId: { + HASH(GetGlobal, index); + break; + } + case Expression::Id::SetGlobalId: { + HASH(SetGlobal, index); + PUSH(SetGlobal, value); + break; + } case Expression::Id::LoadId: { HASH(Load, bytes); HASH(Load, signed_); |