aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile-expr.h30
-rw-r--r--gcc/rust/backend/rust-compile.cc37
2 files changed, 38 insertions, 29 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 77b8888..92cb392 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -582,21 +582,25 @@ public:
void visit (HIR::LoopExpr &expr)
{
- // loop_start:
- // <loop_body>
- // goto loop_start;
fncontext fnctx = ctx->peek_fn ();
- Blabel *loop_start
- = ctx->get_backend ()->label (fnctx.fndecl, "", expr.get_locus ());
- Bstatement *label_decl_stmt
- = ctx->get_backend ()->label_definition_statement (loop_start);
- ctx->add_statement (label_decl_stmt);
-
- translated = CompileExpr::Compile (expr.get_loop_block ().get (), ctx);
+ Bblock *code_block
+ = CompileBlock::compile (expr.get_loop_block ().get (), ctx, nullptr);
+ Bexpression *loop_expr
+ = ctx->get_backend ()->loop_expression (code_block, expr.get_locus ());
+ Bstatement *loop_stmt
+ = ctx->get_backend ()->expression_statement (fnctx.fndecl, loop_expr);
+ ctx->add_statement (loop_stmt);
+ }
- Bstatement *goto_loop_start_stmt
- = ctx->get_backend ()->goto_statement (loop_start, Location ());
- ctx->add_statement (goto_loop_start_stmt);
+ void visit (HIR::BreakExpr &expr)
+ {
+ fncontext fnctx = ctx->peek_fn ();
+ Bexpression *exit_expr = ctx->get_backend ()->exit_expression (
+ ctx->get_backend ()->boolean_constant_expression (true),
+ expr.get_locus ());
+ Bstatement *break_stmt
+ = ctx->get_backend ()->expression_statement (fnctx.fndecl, exit_expr);
+ ctx->add_statement (break_stmt);
}
private:
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index 600b2f9..dd87d45 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -236,23 +236,28 @@ CompileBlock::visit (HIR::BlockExpr &expr)
// the previous passes will ensure this is a valid return
// dead code elimination should remove any bad trailing expressions
Bexpression *compiled_expr = CompileExpr::Compile (expr.expr.get (), ctx);
- rust_assert (compiled_expr != nullptr);
-
- if (result == nullptr)
- {
- Bstatement *final_stmt
- = ctx->get_backend ()->expression_statement (fnctx.fndecl,
- compiled_expr);
- ctx->add_statement (final_stmt);
- }
- else
+ if (compiled_expr != nullptr)
{
- Bexpression *result_reference = ctx->get_backend ()->var_expression (
- result, expr.get_final_expr ()->get_locus_slow ());
-
- Bstatement *assignment = ctx->get_backend ()->assignment_statement (
- fnctx.fndecl, result_reference, compiled_expr, expr.get_locus ());
- ctx->add_statement (assignment);
+ if (result == nullptr)
+ {
+ Bstatement *final_stmt
+ = ctx->get_backend ()->expression_statement (fnctx.fndecl,
+ compiled_expr);
+ ctx->add_statement (final_stmt);
+ }
+ else
+ {
+ Bexpression *result_reference
+ = ctx->get_backend ()->var_expression (
+ result, expr.get_final_expr ()->get_locus_slow ());
+
+ Bstatement *assignment
+ = ctx->get_backend ()->assignment_statement (fnctx.fndecl,
+ result_reference,
+ compiled_expr,
+ expr.get_locus ());
+ ctx->add_statement (assignment);
+ }
}
}