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-base.h11
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc249
-rw-r--r--gcc/rust/backend/rust-compile-implitem.h16
-rw-r--r--gcc/rust/backend/rust-compile-item.h3
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.cc22
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.h5
-rw-r--r--gcc/rust/backend/rust-compile-var-decl.h1
-rw-r--r--gcc/rust/backend/rust-compile.cc5
8 files changed, 122 insertions, 190 deletions
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index e963176..902bedc 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -60,6 +60,17 @@ protected:
bool verify_array_capacities (tree ltype, tree rtype, Location ltype_locus,
Location rtype_locus);
+
+ tree query_compile (HirId ref, TyTy::BaseType *lookup,
+ const HIR::PathIdentSegment &final_segment,
+ const Analysis::NodeMapping &mappings,
+ Location expr_locus, bool is_qualified_path);
+
+ tree resolve_adjustements (std::vector<Resolver::Adjustment> &adjustments,
+ tree expression, Location locus);
+
+ tree resolve_deref_adjustment (Resolver::Adjustment &adjustment,
+ tree expression, Location locus);
};
} // namespace Compile
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index 33237e5..c58d29d 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -23,7 +23,6 @@
#include "rust-hir-trait-resolve.h"
#include "rust-hir-path-probe.h"
#include "rust-hir-type-bounds.h"
-#include "rust-hir-dot-operator.h"
#include "rust-compile-pattern.h"
#include "rust-constexpr.h"
@@ -574,25 +573,9 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
expr.get_mappings ().get_hirid (), &adjustments);
rust_assert (ok);
- for (auto &adjustment : *adjustments)
- {
- switch (adjustment.get_type ())
- {
- case Resolver::Adjustment::AdjustmentType::IMM_REF:
- case Resolver::Adjustment::AdjustmentType::MUT_REF:
- self = ctx->get_backend ()->address_expression (
- self, expr.get_receiver ()->get_locus ());
- break;
-
- case Resolver::Adjustment::AdjustmentType::DEREF_REF:
- tree expected_type
- = TyTyResolveCompile::compile (ctx, adjustment.get_expected ());
- self = ctx->get_backend ()->indirect_expression (
- expected_type, self, true, /* known_valid*/
- expr.get_receiver ()->get_locus ());
- break;
- }
- }
+ // apply adjustments for the fn call
+ self = resolve_adjustements (*adjustments, self,
+ expr.get_receiver ()->get_locus ());
std::vector<tree> args;
args.push_back (self); // adjusted self
@@ -737,11 +720,10 @@ CompileExpr::resolve_method_address (TyTy::FnType *fntype, HirId ref,
if (resolved_item != nullptr)
{
if (!fntype->has_subsititions_defined ())
- return CompileInherentImplItem::Compile (receiver, resolved_item, ctx,
- true);
+ return CompileInherentImplItem::Compile (resolved_item, ctx, true);
- return CompileInherentImplItem::Compile (receiver, resolved_item, ctx,
- true, fntype);
+ return CompileInherentImplItem::Compile (resolved_item, ctx, true,
+ fntype);
}
// it might be resolved to a trait item
@@ -785,24 +767,20 @@ CompileExpr::resolve_method_address (TyTy::FnType *fntype, HirId ref,
}
else
{
- std::vector<Resolver::Adjustment> adjustments;
- Resolver::PathProbeCandidate *candidate
- = Resolver::MethodResolution::Select (candidates, root, adjustments);
-
// FIXME this will be a case to return error_mark_node, there is
// an error scenario where a Trait Foo has a method Bar, but this
// receiver does not implement this trait or has an incompatible
// implementation and we should just return error_mark_node
- rust_assert (candidate != nullptr);
- rust_assert (candidate->is_impl_candidate ());
- HIR::ImplItem *impl_item = candidate->item.impl.impl_item;
+ rust_assert (candidates.size () == 1);
+ auto &candidate = candidates.at (0);
+ rust_assert (candidate.is_impl_candidate ());
+
+ HIR::ImplItem *impl_item = candidate.item.impl.impl_item;
if (!fntype->has_subsititions_defined ())
- return CompileInherentImplItem::Compile (receiver, impl_item, ctx,
- true);
+ return CompileInherentImplItem::Compile (impl_item, ctx, true);
- return CompileInherentImplItem::Compile (receiver, impl_item, ctx, true,
- fntype);
+ return CompileInherentImplItem::Compile (impl_item, ctx, true, fntype);
}
}
@@ -868,29 +846,8 @@ CompileExpr::resolve_operator_overload (
expr.get_mappings ().get_hirid (), &adjustments);
rust_assert (ok);
- // FIXME refactor this out
- tree self = lhs;
- for (auto &adjustment : *adjustments)
- {
- switch (adjustment.get_type ())
- {
- case Resolver::Adjustment::AdjustmentType::IMM_REF:
- case Resolver::Adjustment::AdjustmentType::MUT_REF:
- self
- = ctx->get_backend ()->address_expression (self,
- lhs_expr->get_locus ());
- break;
-
- case Resolver::Adjustment::AdjustmentType::DEREF_REF:
- tree expected_type
- = TyTyResolveCompile::compile (ctx, adjustment.get_expected ());
- self
- = ctx->get_backend ()->indirect_expression (expected_type, self,
- true, /* known_valid*/
- lhs_expr->get_locus ());
- break;
- }
- }
+ // apply adjustments for the fn call
+ tree self = resolve_adjustements (*adjustments, lhs, lhs_expr->get_locus ());
std::vector<tree> args;
args.push_back (self); // adjusted self
@@ -1221,106 +1178,82 @@ CompileExpr::array_copied_expr (Location expr_locus,
expr_locus);
}
-// tree
-// CompileExpr::array_copied_expr (Location expr_locus, tree array_type,
-// HIR::ArrayElemsCopied &elems)
-// {
-// // create tmp for the result
-// fncontext fnctx = ctx->peek_fn ();
-// Location start_location = expr_locus;
-// Location end_location = expr_locus;
-// tree fndecl = fnctx.fndecl;
-// tree enclosing_scope = ctx->peek_enclosing_scope ();
-
-// bool is_address_taken = false;
-// tree result_var_stmt = nullptr;
-// Bvariable *result
-// = ctx->get_backend ()->temporary_variable (fnctx.fndecl,
-// enclosing_scope,
-// array_type, NULL,
-// is_address_taken, expr_locus,
-// &result_var_stmt);
-// ctx->add_statement (result_var_stmt);
-
-// // get the compiled value
-// tree translated_expr = CompileExpr::Compile (elems.get_elem_to_copy (),
-// ctx);
-
-// // lets assign each index in the array
-// TyTy::BaseType *capacity_tyty = nullptr;
-// HirId capacity_ty_id
-// = elems.get_num_copies_expr ()->get_mappings ().get_hirid ();
-// bool ok = ctx->get_tyctx ()->lookup_type (capacity_ty_id,
-// &capacity_tyty); rust_assert (ok); tree capacity_type =
-// TyTyResolveCompile::compile (ctx, capacity_tyty); tree capacity_expr =
-// CompileExpr::Compile (elems.get_num_copies_expr (), ctx);
-
-// // create a loop for this with assignments to array_index exprs
-// tree index_type = capacity_type;
-// Bvariable *idx
-// = ctx->get_backend ()->temporary_variable (fnctx.fndecl,
-// enclosing_scope,
-// index_type, NULL,
-// is_address_taken, expr_locus,
-// &result_var_stmt);
-// ctx->add_statement (result_var_stmt);
-
-// // set index to zero
-// tree index_lvalue = error_mark_node;
-// tree zero = build_int_cst (index_type, 0);
-// tree index_assignment
-// = ctx->get_backend ()->assignment_statement (fnctx.fndecl,
-// index_lvalue,
-// zero, expr_locus);
-// ctx->add_statement (index_assignment);
-
-// // BEGIN loop block
-// tree loop_body = ctx->get_backend ()->block (fndecl, enclosing_scope, {},
-// start_location, end_location);
-// ctx->push_block (loop_body);
-
-// // loop predicate
-// tree loop_predicate
-// = fold_build2_loc (expr_locus.gcc_location (), GE_EXPR,
-// boolean_type_node,
-// ctx->get_backend ()->var_expression (idx, expr_locus),
-// capacity_expr);
-// tree exit_expr = fold_build1_loc (expr_locus.gcc_location (), EXIT_EXPR,
-// void_type_node, loop_predicate);
-// tree break_stmt
-// = ctx->get_backend ()->expression_statement (fnctx.fndecl, exit_expr);
-// ctx->add_statement (break_stmt);
-
-// // increment index
-// tree increment
-// = fold_build2_loc (expr_locus.gcc_location (), POSTINCREMENT_EXPR,
-// index_type,
-// ctx->get_backend ()->var_expression (idx, expr_locus),
-// build_int_cst (index_type, 1));
-
-// // create index_assess
-// tree index_access = ctx->get_backend ()->array_index_expression (
-// ctx->get_backend ()->var_expression (result, expr_locus), increment,
-// expr_locus);
-
-// // create assignment to index_access
-// tree array_assignment
-// = ctx->get_backend ()->assignment_statement (fnctx.fndecl,
-// index_access,
-// translated_expr, expr_locus);
-// ctx->add_statement (array_assignment);
-
-// // END loop block
-// ctx->pop_block ();
-
-// tree loop_expr = ctx->get_backend ()->loop_expression (loop_body,
-// expr_locus); tree loop_stmt
-// = ctx->get_backend ()->expression_statement (fnctx.fndecl, loop_expr);
-// ctx->add_statement (loop_stmt);
-
-// // result is the tmp
-// return ctx->get_backend ()->var_expression (result, expr_locus);
-// }
+tree
+HIRCompileBase::resolve_adjustements (
+ std::vector<Resolver::Adjustment> &adjustments, tree expression,
+ Location locus)
+{
+ tree e = expression;
+ for (auto &adjustment : adjustments)
+ {
+ switch (adjustment.get_type ())
+ {
+ case Resolver::Adjustment::AdjustmentType::ERROR:
+ return error_mark_node;
+
+ case Resolver::Adjustment::AdjustmentType::IMM_REF:
+ case Resolver::Adjustment::AdjustmentType::MUT_REF:
+ e = ctx->get_backend ()->address_expression (e, locus);
+ break;
+
+ case Resolver::Adjustment::AdjustmentType::DEREF_REF:
+ e = resolve_deref_adjustment (adjustment, e, locus);
+ break;
+ }
+ }
+
+ return e;
+}
+
+tree
+HIRCompileBase::resolve_deref_adjustment (Resolver::Adjustment &adjustment,
+ tree expression, Location locus)
+{
+ rust_assert (adjustment.is_deref_adjustment ());
+
+ tree expected_type
+ = TyTyResolveCompile::compile (ctx, adjustment.get_expected ());
+ if (!adjustment.has_operator_overload ())
+ {
+ return ctx->get_backend ()->indirect_expression (expected_type,
+ expression,
+ true, /* known_valid*/
+ locus);
+ }
+
+ TyTy::FnType *lookup = adjustment.get_deref_operator_fn ();
+ HIR::ImplItem *resolved_item = adjustment.get_deref_hir_item ();
+
+ tree fn_address = error_mark_node;
+ if (!lookup->has_subsititions_defined ())
+ fn_address = CompileInherentImplItem::Compile (resolved_item, ctx, true,
+ nullptr, true, locus);
+ else
+ fn_address = CompileInherentImplItem::Compile (resolved_item, ctx, true,
+ lookup, true, locus);
+
+ // does it need a reference to call
+ tree adjusted_argument = expression;
+ bool needs_borrow = adjustment.get_deref_adjustment_type ()
+ != Resolver::Adjustment::AdjustmentType::ERROR;
+ if (needs_borrow)
+ {
+ adjusted_argument
+ = ctx->get_backend ()->address_expression (expression, locus);
+ }
+
+ // make the call
+ auto fncontext = ctx->peek_fn ();
+ tree deref_call
+ = ctx->get_backend ()->call_expression (fncontext.fndecl, fn_address,
+ {adjusted_argument}, nullptr,
+ locus);
+
+ // do the indirect expression
+ return ctx->get_backend ()->indirect_expression (expected_type, deref_call,
+ true, /* known_valid*/
+ locus);
+}
} // namespace Compile
} // namespace Rust
diff --git a/gcc/rust/backend/rust-compile-implitem.h b/gcc/rust/backend/rust-compile-implitem.h
index 7bef6ae..82b7c6d 100644
--- a/gcc/rust/backend/rust-compile-implitem.h
+++ b/gcc/rust/backend/rust-compile-implitem.h
@@ -34,14 +34,12 @@ class CompileInherentImplItem : public HIRCompileBase
using Rust::Compile::HIRCompileBase::visit;
public:
- static tree Compile (const TyTy::BaseType *self, HIR::ImplItem *item,
- Context *ctx, bool compile_fns,
+ static tree Compile (HIR::ImplItem *item, Context *ctx, bool compile_fns,
TyTy::BaseType *concrete = nullptr,
bool is_query_mode = false,
Location ref_locus = Location ())
{
- CompileInherentImplItem compiler (self, ctx, compile_fns, concrete,
- ref_locus);
+ CompileInherentImplItem compiler (ctx, compile_fns, concrete, ref_locus);
item->accept_vis (compiler);
if (is_query_mode
@@ -307,15 +305,13 @@ public:
}
private:
- CompileInherentImplItem (const TyTy::BaseType *self, Context *ctx,
- bool compile_fns, TyTy::BaseType *concrete,
- Location ref_locus)
- : HIRCompileBase (ctx), self (self), compile_fns (compile_fns),
- concrete (concrete), reference (ctx->get_backend ()->error_expression ()),
+ CompileInherentImplItem (Context *ctx, bool compile_fns,
+ TyTy::BaseType *concrete, Location ref_locus)
+ : HIRCompileBase (ctx), compile_fns (compile_fns), concrete (concrete),
+ reference (ctx->get_backend ()->error_expression ()),
ref_locus (ref_locus)
{}
- const TyTy::BaseType *self;
bool compile_fns;
TyTy::BaseType *concrete;
tree reference;
diff --git a/gcc/rust/backend/rust-compile-item.h b/gcc/rust/backend/rust-compile-item.h
index c35efcc..b3c5ba8 100644
--- a/gcc/rust/backend/rust-compile-item.h
+++ b/gcc/rust/backend/rust-compile-item.h
@@ -395,8 +395,7 @@ public:
}
for (auto &impl_item : impl_block.get_impl_items ())
- CompileInherentImplItem::Compile (self_lookup, impl_item.get (), ctx,
- compile_fns);
+ CompileInherentImplItem::Compile (impl_item.get (), ctx, compile_fns);
}
void visit (HIR::ExternBlock &extern_block) override
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index c1d0778..5c727d6 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -152,10 +152,10 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment,
// let the query system figure it out
return query_compile (ref, lookup, final_segment, mappings, expr_locus,
is_qualified_path);
-} // namespace Compile
+}
tree
-ResolvePathRef::query_compile (HirId ref, TyTy::BaseType *lookup,
+HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup,
const HIR::PathIdentSegment &final_segment,
const Analysis::NodeMapping &mappings,
Location expr_locus, bool is_qualified_path)
@@ -194,13 +194,11 @@ ResolvePathRef::query_compile (HirId ref, TyTy::BaseType *lookup,
rust_assert (ok);
if (!lookup->has_subsititions_defined ())
- return CompileInherentImplItem::Compile (self, resolved_item, ctx,
- true, nullptr, true,
- expr_locus);
+ return CompileInherentImplItem::Compile (resolved_item, ctx, true,
+ nullptr, true, expr_locus);
else
- return CompileInherentImplItem::Compile (self, resolved_item, ctx,
- true, lookup, true,
- expr_locus);
+ return CompileInherentImplItem::Compile (resolved_item, ctx, true,
+ lookup, true, expr_locus);
}
else
{
@@ -278,12 +276,12 @@ ResolvePathRef::query_compile (HirId ref, TyTy::BaseType *lookup,
rust_assert (ok);
if (!lookup->has_subsititions_defined ())
- return CompileInherentImplItem::Compile (self, impl_item, ctx,
- true, nullptr, true,
+ return CompileInherentImplItem::Compile (impl_item, ctx, true,
+ nullptr, true,
expr_locus);
else
- return CompileInherentImplItem::Compile (self, impl_item, ctx,
- true, lookup, true,
+ return CompileInherentImplItem::Compile (impl_item, ctx, true,
+ lookup, true,
expr_locus);
lookup->set_ty_ref (impl_item->get_impl_mappings ().get_hirid ());
diff --git a/gcc/rust/backend/rust-compile-resolve-path.h b/gcc/rust/backend/rust-compile-resolve-path.h
index 56f82d1..97a79e2 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.h
+++ b/gcc/rust/backend/rust-compile-resolve-path.h
@@ -57,11 +57,6 @@ private:
const Analysis::NodeMapping &mappings, Location locus,
bool is_qualified_path);
- tree query_compile (HirId ref, TyTy::BaseType *lookup,
- const HIR::PathIdentSegment &final_segment,
- const Analysis::NodeMapping &mappings,
- Location expr_locus, bool is_qualified_path);
-
tree resolved;
};
diff --git a/gcc/rust/backend/rust-compile-var-decl.h b/gcc/rust/backend/rust-compile-var-decl.h
index 4b52dcd..51affe0 100644
--- a/gcc/rust/backend/rust-compile-var-decl.h
+++ b/gcc/rust/backend/rust-compile-var-decl.h
@@ -49,6 +49,7 @@ public:
address_taken_context->lookup_addess_taken (
stmt.get_mappings ().get_hirid (), &address_taken);
+
translated_type = TyTyResolveCompile::compile (ctx, resolved_type);
stmt.get_pattern ()->accept_vis (*this);
}
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index a97ad4d..b17c438 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -528,9 +528,8 @@ HIRCompileBase::compute_address_for_trait_item (
lookup_fntype = lookup_fntype->handle_substitions (mappings);
}
- return CompileInherentImplItem::Compile (root, associated_function, ctx,
- true, lookup_fntype, true,
- locus);
+ return CompileInherentImplItem::Compile (associated_function, ctx, true,
+ lookup_fntype, true, locus);
}
// we can only compile trait-items with a body