aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir/rust-ast-lower-expr.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-expr.cc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.cc431
1 files changed, 326 insertions, 105 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc
index c414643..d5aef7e 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -17,6 +17,7 @@
// <http://www.gnu.org/licenses/>.
#include "rust-ast-lower-expr.h"
+#include "optional.h"
#include "rust-ast-lower-base.h"
#include "rust-ast-lower-block.h"
#include "rust-ast-lower-struct-field-expr.h"
@@ -24,6 +25,9 @@
#include "rust-ast-lower-type.h"
#include "rust-ast.h"
#include "rust-diagnostics.h"
+#include "rust-hir-map.h"
+#include "rust-system.h"
+#include "tree/rust-hir-expr.h"
namespace Rust {
namespace HIR {
@@ -45,8 +49,8 @@ ASTLoweringExpr::translate (AST::Expr &expr, bool *terminated)
return nullptr;
}
- resolver.mappings->insert_hir_expr (resolver.translated);
- resolver.mappings->insert_location (
+ resolver.mappings.insert_hir_expr (resolver.translated);
+ resolver.mappings.insert_location (
resolver.translated->get_mappings ().get_hirid (), expr.get_locus ());
if (terminated != nullptr)
@@ -61,9 +65,9 @@ ASTLoweringExpr::visit (AST::TupleIndexExpr &expr)
HIR::Expr *tuple_expr
= ASTLoweringExpr::translate (expr.get_tuple_expr (), &terminated);
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -75,16 +79,16 @@ ASTLoweringExpr::visit (AST::TupleIndexExpr &expr)
void
ASTLoweringExpr::visit (AST::TupleExpr &expr)
{
- std::vector<std::unique_ptr<HIR::Expr> > tuple_elements;
+ std::vector<std::unique_ptr<HIR::Expr>> tuple_elements;
for (auto &e : expr.get_tuple_elems ())
{
HIR::Expr *t = ASTLoweringExpr::translate (*e);
tuple_elements.push_back (std::unique_ptr<HIR::Expr> (t));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -124,6 +128,43 @@ ASTLoweringExpr::visit (AST::BlockExpr &expr)
}
void
+ASTLoweringExpr::visit (AST::AnonConst &expr)
+{
+ auto inner_expr = ASTLoweringExpr::translate (expr.get_inner_expr ());
+
+ auto &mappings = Analysis::Mappings::get ();
+ auto crate_num = mappings.get_current_crate ();
+ auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated = new HIR::AnonConst (std::move (mapping),
+ std::unique_ptr<Expr> (inner_expr),
+ expr.get_locus ());
+}
+
+void
+ASTLoweringExpr::visit (AST::ConstBlock &expr)
+{
+ auto inner_expr = ASTLoweringExpr::translate (expr.get_const_expr ());
+
+ // we know this will always be an `AnonConst`, or we have an issue. Let's
+ // assert just to be sure.
+ rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
+ auto anon_const = static_cast<AnonConst *> (inner_expr);
+
+ auto &mappings = Analysis::Mappings::get ();
+ auto crate_num = mappings.get_current_crate ();
+ auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated
+ = new HIR::ConstBlock (std::move (mapping), std::move (*anon_const),
+ expr.get_locus (), expr.get_outer_attrs ());
+}
+
+void
ASTLoweringExpr::visit (AST::UnsafeBlockExpr &expr)
{
translated = ASTLoweringBlock::translate (expr, &terminated);
@@ -142,6 +183,13 @@ ASTLoweringExpr::visit (AST::QualifiedPathInExpression &expr)
}
void
+ASTLoweringExpr::visit (AST::BoxExpr &expr)
+{
+ // Not implemented
+ rust_unreachable ();
+}
+
+void
ASTLoweringExpr::visit (AST::ReturnExpr &expr)
{
terminated = true;
@@ -150,9 +198,9 @@ ASTLoweringExpr::visit (AST::ReturnExpr &expr)
? ASTLoweringExpr::translate (expr.get_returned_expr ())
: nullptr;
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated = new HIR::ReturnExpr (mapping, expr.get_locus (),
@@ -165,17 +213,17 @@ ASTLoweringExpr::visit (AST::CallExpr &expr)
HIR::Expr *func = ASTLoweringExpr::translate (expr.get_function_expr ());
auto const &in_params = expr.get_params ();
- std::vector<std::unique_ptr<HIR::Expr> > params;
+ std::vector<std::unique_ptr<HIR::Expr>> params;
for (auto &param : in_params)
{
auto trans = ASTLoweringExpr::translate (*param);
params.push_back (std::unique_ptr<HIR::Expr> (trans));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (
crate_num, UNKNOWN_NODEID /* this can map back to the AST*/,
- mappings->get_next_hir_id (crate_num), UNKNOWN_LOCAL_DEFID);
+ mappings.get_next_hir_id (crate_num), UNKNOWN_LOCAL_DEFID);
translated = new HIR::CallExpr (mapping, std::unique_ptr<HIR::Expr> (func),
std::move (params), expr.get_outer_attrs (),
@@ -191,16 +239,16 @@ ASTLoweringExpr::visit (AST::MethodCallExpr &expr)
HIR::Expr *receiver = ASTLoweringExpr::translate (expr.get_receiver_expr ());
auto const &in_params = expr.get_params ();
- std::vector<std::unique_ptr<HIR::Expr> > params;
+ std::vector<std::unique_ptr<HIR::Expr>> params;
for (auto &param : in_params)
{
auto trans = ASTLoweringExpr::translate (*param);
params.push_back (std::unique_ptr<HIR::Expr> (trans));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -215,9 +263,9 @@ ASTLoweringExpr::visit (AST::AssignmentExpr &expr)
HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ());
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -229,9 +277,9 @@ ASTLoweringExpr::visit (AST::AssignmentExpr &expr)
void
ASTLoweringExpr::visit (AST::IdentifierExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping1 (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
Analysis::NodeMapping mapping2 (mapping1);
@@ -249,9 +297,9 @@ ASTLoweringExpr::visit (AST::ArrayExpr &expr)
rust_assert (translated_array_elems != nullptr);
HIR::ArrayElems *elems = translated_array_elems;
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -267,9 +315,9 @@ ASTLoweringExpr::visit (AST::ArrayIndexExpr &expr)
HIR::Expr *array_index_expr
= ASTLoweringExpr::translate (expr.get_index_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -281,17 +329,17 @@ ASTLoweringExpr::visit (AST::ArrayIndexExpr &expr)
void
ASTLoweringExpr::visit (AST::ArrayElemsValues &elems)
{
- std::vector<std::unique_ptr<HIR::Expr> > elements;
+ std::vector<std::unique_ptr<HIR::Expr>> elements;
for (auto &elem : elems.get_values ())
{
HIR::Expr *translated_elem = ASTLoweringExpr::translate (*elem);
elements.push_back (std::unique_ptr<HIR::Expr> (translated_elem));
}
- auto crate_num = mappings->get_current_crate ();
- Analysis::NodeMapping mapping (mappings->get_current_crate (),
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (mappings.get_current_crate (),
elems.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated_array_elems
@@ -304,10 +352,10 @@ ASTLoweringExpr::visit (AST::ArrayElemsCopied &elems)
HIR::Expr *element = ASTLoweringExpr::translate (elems.get_elem_to_copy ());
HIR::Expr *num_copies = ASTLoweringExpr::translate (elems.get_num_copies ());
- auto crate_num = mappings->get_current_crate ();
- Analysis::NodeMapping mapping (mappings->get_current_crate (),
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (mappings.get_current_crate (),
elems.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated_array_elems
@@ -318,9 +366,9 @@ ASTLoweringExpr::visit (AST::ArrayElemsCopied &elems)
void
ASTLoweringExpr::visit (AST::LiteralExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
HIR::Literal l = lower_literal (expr.get_literal ());
@@ -336,9 +384,9 @@ ASTLoweringExpr::visit (AST::ArithmeticOrLogicalExpr &expr)
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
rust_assert (rhs != nullptr);
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated = new HIR::ArithmeticOrLogicalExpr (
@@ -354,9 +402,9 @@ ASTLoweringExpr::visit (AST::ComparisonExpr &expr)
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
rust_assert (rhs != nullptr);
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -373,9 +421,9 @@ ASTLoweringExpr::visit (AST::LazyBooleanExpr &expr)
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
rust_assert (rhs != nullptr);
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -390,9 +438,9 @@ ASTLoweringExpr::visit (AST::NegationExpr &expr)
HIR::Expr *negated_value
= ASTLoweringExpr::translate (expr.get_negated_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
= new HIR::NegationExpr (mapping,
@@ -409,9 +457,9 @@ ASTLoweringExpr::visit (AST::TypeCastExpr &expr)
HIR::Type *type_to_cast_to
= lower_type_no_bounds (expr.get_type_to_cast_to ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -464,9 +512,9 @@ ASTLoweringExpr::visit (AST::CompoundAssignmentExpr &expr)
HIR::Expr *asignee_expr = ASTLoweringExpr::translate (expr.get_left_expr ());
HIR::Expr *value = ASTLoweringExpr::translate (expr.get_right_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated = new HIR::CompoundAssignmentExpr (
@@ -482,9 +530,9 @@ ASTLoweringExpr::visit (AST::StructExprStruct &struct_expr)
HIR::PathInExpression copied_path (*path);
delete path;
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, struct_expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated = new HIR::StructExprStruct (mapping, copied_path,
@@ -502,16 +550,18 @@ ASTLoweringExpr::visit (AST::StructExprStructFields &struct_expr)
HIR::PathInExpression copied_path (*path);
delete path;
- HIR::StructBase *base = nullptr;
+ tl::optional<std::unique_ptr<HIR::StructBase>> base = tl::nullopt;
if (struct_expr.has_struct_base ())
{
HIR::Expr *translated_base = ASTLoweringExpr::translate (
struct_expr.get_struct_base ().get_base_struct ());
- base = new HIR::StructBase (std::unique_ptr<HIR::Expr> (translated_base));
+ base = tl::optional<std::unique_ptr<HIR::StructBase>> (
+ std::make_unique<StructBase> (
+ std::unique_ptr<HIR::Expr> (translated_base)));
}
auto const &in_fields = struct_expr.get_fields ();
- std::vector<std::unique_ptr<HIR::StructExprField> > fields;
+ std::vector<std::unique_ptr<HIR::StructExprField>> fields;
for (auto &field : in_fields)
{
HIR::StructExprField *translated
@@ -519,14 +569,15 @@ ASTLoweringExpr::visit (AST::StructExprStructFields &struct_expr)
fields.push_back (std::unique_ptr<HIR::StructExprField> (translated));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, struct_expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
= new HIR::StructExprStructFields (mapping, copied_path, std::move (fields),
- struct_expr.get_locus (), base,
+ struct_expr.get_locus (),
+ std::move (base),
struct_expr.get_inner_attrs (),
struct_expr.get_outer_attrs ());
}
@@ -537,9 +588,9 @@ ASTLoweringExpr::visit (AST::GroupedExpr &expr)
HIR::Expr *paren_expr
= ASTLoweringExpr::translate (expr.get_expr_in_parens ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -553,9 +604,9 @@ ASTLoweringExpr::visit (AST::FieldAccessExpr &expr)
{
HIR::Expr *receiver = ASTLoweringExpr::translate (expr.get_receiver_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
= new HIR::FieldAccessExpr (mapping, std::unique_ptr<HIR::Expr> (receiver),
@@ -578,22 +629,24 @@ ASTLoweringExpr::visit (AST::WhileLoopExpr &expr)
void
ASTLoweringExpr::visit (AST::ForLoopExpr &expr)
{
- translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
+ rust_unreachable ();
}
void
ASTLoweringExpr::visit (AST::BreakExpr &expr)
{
- HIR::Lifetime break_label
- = lower_lifetime (expr.get_label ().get_lifetime ());
+ tl::optional<HIR::Lifetime> break_label = tl::nullopt;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ().get_lifetime ());
+
HIR::Expr *break_expr
= expr.has_break_expr ()
? ASTLoweringExpr::translate (expr.get_break_expr ())
: nullptr;
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -605,11 +658,13 @@ ASTLoweringExpr::visit (AST::BreakExpr &expr)
void
ASTLoweringExpr::visit (AST::ContinueExpr &expr)
{
- HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
+ tl::optional<HIR::Lifetime> break_label;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -623,29 +678,27 @@ ASTLoweringExpr::visit (AST::BorrowExpr &expr)
HIR::Expr *borrow_lvalue
= ASTLoweringExpr::translate (expr.get_borrowed_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
auto *borrow_expr
= new HIR::BorrowExpr (mapping, std::unique_ptr<HIR::Expr> (borrow_lvalue),
- expr.get_is_mut () ? Mutability::Mut
- : Mutability::Imm,
+ expr.get_mutability (), expr.is_raw_borrow (),
expr.get_outer_attrs (), expr.get_locus ());
if (expr.get_is_double_borrow ())
{
- NodeId artificial_double_borrow_id = mappings->get_next_node_id ();
+ NodeId artificial_double_borrow_id = mappings.get_next_node_id ();
Analysis::NodeMapping mapping (crate_num, artificial_double_borrow_id,
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
borrow_expr
= new HIR::BorrowExpr (mapping,
std::unique_ptr<HIR::Expr> (borrow_expr),
- expr.get_is_mut () ? Mutability::Mut
- : Mutability::Imm,
+ expr.get_mutability (), expr.is_raw_borrow (),
expr.get_outer_attrs (), expr.get_locus ());
}
@@ -658,9 +711,9 @@ ASTLoweringExpr::visit (AST::DereferenceExpr &expr)
HIR::Expr *dref_lvalue
= ASTLoweringExpr::translate (expr.get_dereferenced_expr ());
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
@@ -670,21 +723,6 @@ ASTLoweringExpr::visit (AST::DereferenceExpr &expr)
}
void
-ASTLoweringExpr::visit (AST::ErrorPropagationExpr &expr)
-{
- HIR::Expr *propagating_expr
- = ASTLoweringExpr::translate (expr.get_propagating_expr ());
-
- auto crate_num = mappings->get_current_crate ();
- Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
- UNKNOWN_LOCAL_DEFID);
- translated = new HIR::ErrorPropagationExpr (
- mapping, std::unique_ptr<HIR::Expr> (propagating_expr),
- expr.get_outer_attrs (), expr.get_locus ());
-}
-
-void
ASTLoweringExpr::visit (AST::MatchExpr &expr)
{
translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
@@ -693,9 +731,9 @@ ASTLoweringExpr::visit (AST::MatchExpr &expr)
void
ASTLoweringExpr::visit (AST::RangeFromToExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
@@ -711,9 +749,9 @@ ASTLoweringExpr::visit (AST::RangeFromToExpr &expr)
void
ASTLoweringExpr::visit (AST::RangeFromExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
@@ -726,9 +764,9 @@ ASTLoweringExpr::visit (AST::RangeFromExpr &expr)
void
ASTLoweringExpr::visit (AST::RangeToExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
HIR::Expr *range_to = ASTLoweringExpr::translate (expr.get_to_expr ());
@@ -741,9 +779,9 @@ ASTLoweringExpr::visit (AST::RangeToExpr &expr)
void
ASTLoweringExpr::visit (AST::RangeFullExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated = new HIR::RangeFullExpr (mapping, expr.get_locus ());
@@ -752,9 +790,9 @@ ASTLoweringExpr::visit (AST::RangeFullExpr &expr)
void
ASTLoweringExpr::visit (AST::RangeFromToInclExpr &expr)
{
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
+ mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
@@ -780,10 +818,10 @@ ASTLoweringExpr::visit (AST::ClosureExprInner &expr)
closure_params.push_back (std::move (p));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
- mappings->get_next_localdef_id (crate_num));
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
translated
= new HIR::ClosureExpr (mapping, std::move (closure_params),
@@ -807,10 +845,10 @@ ASTLoweringExpr::visit (AST::ClosureExprInnerTyped &expr)
closure_params.push_back (std::move (p));
}
- auto crate_num = mappings->get_current_crate ();
+ auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings->get_next_hir_id (crate_num),
- mappings->get_next_localdef_id (crate_num));
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
translated
= new HIR::ClosureExpr (mapping, std::move (closure_params),
@@ -820,6 +858,189 @@ ASTLoweringExpr::visit (AST::ClosureExprInnerTyped &expr)
expr.get_locus ());
}
+HIR::InlineAsmOperand
+translate_operand_in (const AST::InlineAsmOperand &operand)
+{
+ auto in_value = operand.get_in ();
+
+ struct HIR::InlineAsmOperand::In in (
+ in_value.reg,
+ std::unique_ptr<Expr> (ASTLoweringExpr::translate (*in_value.expr.get ())));
+ return in;
+}
+
+HIR::InlineAsmOperand
+translate_operand_out (const AST::InlineAsmOperand &operand)
+{
+ auto out_value = operand.get_out ();
+ struct HIR::InlineAsmOperand::Out out (out_value.reg, out_value.late,
+ std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (
+ *out_value.expr.get ())));
+ return out;
+}
+
+HIR::InlineAsmOperand
+translate_operand_inout (const AST::InlineAsmOperand &operand)
+{
+ auto inout_value = operand.get_in_out ();
+ struct HIR::InlineAsmOperand::InOut inout (inout_value.reg, inout_value.late,
+ std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (
+ *inout_value.expr.get ())));
+ return inout;
+}
+
+HIR::InlineAsmOperand
+translate_operand_split_in_out (const AST::InlineAsmOperand &operand)
+{
+ auto split_in_out_value = operand.get_split_in_out ();
+ struct HIR::InlineAsmOperand::SplitInOut split_in_out (
+ split_in_out_value.reg, split_in_out_value.late,
+ std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (*split_in_out_value.in_expr.get ())),
+ std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (*split_in_out_value.out_expr.get ())));
+ return split_in_out;
+}
+
+HIR::InlineAsmOperand
+translate_operand_const (const AST::InlineAsmOperand &operand)
+{
+ auto const_value = operand.get_const ();
+
+ auto inner_expr = ASTLoweringExpr::translate (const_value.anon_const);
+
+ // Like `ConstBlock`, we know this should only be an `AnonConst` - let's
+ // assert to make sure and static cast
+ rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
+
+ auto anon_const = static_cast<AnonConst *> (inner_expr);
+
+ return HIR::InlineAsmOperand::Const{*anon_const};
+}
+
+HIR::InlineAsmOperand
+translate_operand_sym (const AST::InlineAsmOperand &operand)
+{
+ auto sym_value = operand.get_sym ();
+ struct HIR::InlineAsmOperand::Sym sym (std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (*sym_value.expr.get ())));
+ return sym;
+}
+HIR::InlineAsmOperand
+translate_operand_label (const AST::InlineAsmOperand &operand)
+{
+ auto label_value = operand.get_label ();
+ struct HIR::InlineAsmOperand::Label label (label_value.label_name,
+ std::unique_ptr<Expr> (
+ ASTLoweringExpr::translate (
+ *label_value.expr.get ())));
+ return label;
+}
+HIR::InlineAsmOperand
+from_operand (const AST::InlineAsmOperand &operand)
+{
+ using RegisterType = AST::InlineAsmOperand::RegisterType;
+ auto type = operand.get_register_type ();
+
+ /*In,*/
+ /*Out,*/
+ /*InOut,*/
+ /*SplitInOut,*/
+ /*Const,*/
+ /*Sym,*/
+ /*Label,*/
+ switch (type)
+ {
+ case RegisterType::In:
+ return translate_operand_in (operand);
+ case RegisterType::Out:
+ return translate_operand_out (operand);
+ case RegisterType::InOut:
+ return translate_operand_inout (operand);
+ case RegisterType::SplitInOut:
+ return translate_operand_split_in_out (operand);
+ case RegisterType::Const:
+ return translate_operand_const (operand);
+ case RegisterType::Sym:
+ return translate_operand_sym (operand);
+ case RegisterType::Label:
+ return translate_operand_label (operand);
+ default:
+ rust_unreachable ();
+ }
+}
+void
+ASTLoweringExpr::visit (AST::InlineAsm &expr)
+{
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ std::vector<HIR::InlineAsmOperand> hir_operands;
+ const std::vector<AST::InlineAsmOperand> &ast_operands = expr.get_operands ();
+ /*int ast_operands_size = ast_operands.size ();*/
+ for (auto &operand : ast_operands)
+ {
+ hir_operands.push_back (from_operand (operand));
+ }
+ /*int hir_operands_size = hir_operands.size ();*/
+
+ /*rust_debug ("{bdbt} : There are %d ast operands prelowering and %d hir "*/
+ /* "operands after lowering\n",*/
+ /* ast_operands_size, hir_operands_size);*/
+ translated
+ = new HIR::InlineAsm (expr.get_locus (), expr.is_global_asm,
+ expr.get_template_ (), expr.get_template_strs (),
+ hir_operands, expr.get_clobber_abi (),
+ expr.get_options (), mapping);
+}
+
+void
+ASTLoweringExpr::visit (AST::LlvmInlineAsm &expr)
+{
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ std::vector<LlvmOperand> inputs;
+ std::vector<LlvmOperand> outputs;
+
+ for (auto i : expr.get_inputs ())
+ {
+ std::unique_ptr<Expr> inner_expr
+ = std::unique_ptr<Expr> (translate (*i.expr.get ()));
+ inputs.emplace_back (i.constraint, std::move (inner_expr));
+ }
+
+ for (auto o : expr.get_outputs ())
+ {
+ std::unique_ptr<Expr> inner_expr
+ = std::unique_ptr<Expr> (translate (*o.expr.get ()));
+ outputs.emplace_back (o.constraint, std::move (inner_expr));
+ }
+
+ HIR::LlvmInlineAsm::Options options{expr.is_volatile (),
+ expr.is_stack_aligned (),
+ expr.get_dialect ()};
+
+ // We're not really supporting llvm_asm, only the bare minimum
+ // we're quite conservative here as the current code support more usecase.
+ rust_assert (outputs.size () == 0);
+ rust_assert (inputs.size () <= 1);
+ rust_assert (expr.get_clobbers ().size () <= 1);
+ rust_assert (expr.get_templates ().size () == 1);
+ rust_assert (expr.get_templates ()[0].symbol == "");
+
+ translated
+ = new HIR::LlvmInlineAsm (expr.get_locus (), inputs, outputs,
+ expr.get_templates (), expr.get_clobbers (),
+ options, expr.get_outer_attrs (), mapping);
+}
+
void
ASTLoweringExpr::visit (AST::FormatArgs &fmt)
{