diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-02-11 12:07:19 +0000 |
---|---|---|
committer | Philip Herron <herron.philip@googlemail.com> | 2021-02-13 09:54:32 +0000 |
commit | 7366f6decf5ff3c652844913977582c9dec68d53 (patch) | |
tree | 8720f70594965d4c191b93979d491ea0639158f7 /gcc/rust/backend | |
parent | 92898b2903528fc3747d561f26df7f6d70d0a3b3 (diff) | |
download | gcc-7366f6decf5ff3c652844913977582c9dec68d53.zip gcc-7366f6decf5ff3c652844913977582c9dec68d53.tar.gz gcc-7366f6decf5ff3c652844913977582c9dec68d53.tar.bz2 |
Add in while loop support
We create a LoopExpr comprising of:
LOOP_EXPR {
EXIT_EXPR (while loop predicate)
{
<LOOP_BODY>
}
}
Fixes #109
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.h | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h index 7b25c5e..1ca7631 100644 --- a/gcc/rust/backend/rust-compile-expr.h +++ b/gcc/rust/backend/rust-compile-expr.h @@ -641,11 +641,61 @@ public: } } + void visit (HIR::WhileLoopExpr &expr) + { + fncontext fnctx = ctx->peek_fn (); + if (expr.has_loop_label ()) + { + HIR::LoopLabel &loop_label = expr.get_loop_label (); + Blabel *label + = ctx->get_backend ()->label (fnctx.fndecl, + loop_label.get_lifetime ().get_name (), + loop_label.get_locus ()); + Bstatement *label_decl + = ctx->get_backend ()->label_definition_statement (label); + ctx->add_statement (label_decl); + ctx->insert_label_decl ( + loop_label.get_lifetime ().get_mappings ().get_hirid (), label); + } + + std::vector<Bvariable *> locals; + Location start_location = expr.get_loop_block ()->get_locus (); + Location end_location = expr.get_loop_block ()->get_locus (); // FIXME + + Bblock *enclosing_scope = ctx->peek_enclosing_scope (); + Bblock *loop_block + = ctx->get_backend ()->block (fnctx.fndecl, enclosing_scope, locals, + start_location, end_location); + ctx->push_block (loop_block); + + Bexpression *condition + = CompileExpr::Compile (expr.get_predicate_expr ().get (), ctx); + Bexpression *exit_expr + = ctx->get_backend ()->exit_expression (condition, expr.get_locus ()); + Bstatement *break_stmt + = ctx->get_backend ()->expression_statement (fnctx.fndecl, exit_expr); + ctx->add_statement (break_stmt); + + Bblock *code_block + = CompileBlock::compile (expr.get_loop_block ().get (), ctx, nullptr); + Bstatement *code_block_stmt + = ctx->get_backend ()->block_statement (code_block); + ctx->add_statement (code_block_stmt); + + ctx->pop_block (); + + Bexpression *loop_expr + = ctx->get_backend ()->loop_expression (loop_block, expr.get_locus ()); + Bstatement *loop_stmt + = ctx->get_backend ()->expression_statement (fnctx.fndecl, loop_expr); + ctx->add_statement (loop_stmt); + } + void visit (HIR::BreakExpr &expr) { + fncontext fnctx = ctx->peek_fn (); if (expr.has_break_expr ()) { - fncontext fnctx = ctx->peek_fn (); Bexpression *compiled_expr = CompileExpr::Compile (expr.get_expr ().get (), ctx); @@ -695,7 +745,6 @@ public: } else { - fncontext fnctx = ctx->peek_fn (); Bexpression *exit_expr = ctx->get_backend ()->exit_expression ( ctx->get_backend ()->boolean_constant_expression (true), expr.get_locus ()); |