diff options
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-expr.cc')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-expr.cc | 431 |
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 ¶m : 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 ¶m : 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) { |