aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-02-11 12:07:19 +0000
committerPhilip Herron <herron.philip@googlemail.com>2021-02-13 09:54:32 +0000
commit7366f6decf5ff3c652844913977582c9dec68d53 (patch)
tree8720f70594965d4c191b93979d491ea0639158f7 /gcc/rust/backend
parent92898b2903528fc3747d561f26df7f6d70d0a3b3 (diff)
downloadgcc-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.h53
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 ());