diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-implitem.h')
-rw-r--r-- | gcc/rust/backend/rust-compile-implitem.h | 504 |
1 files changed, 12 insertions, 492 deletions
diff --git a/gcc/rust/backend/rust-compile-implitem.h b/gcc/rust/backend/rust-compile-implitem.h index 9320276..60b7246 100644 --- a/gcc/rust/backend/rust-compile-implitem.h +++ b/gcc/rust/backend/rust-compile-implitem.h @@ -19,19 +19,17 @@ #ifndef RUST_COMPILE_IMPLITEM_H #define RUST_COMPILE_IMPLITEM_H -#include "rust-compile-base.h" -#include "rust-compile-tyty.h" -#include "rust-compile-var-decl.h" -#include "rust-compile-stmt.h" +#include "rust-compile-item.h" #include "rust-compile-expr.h" #include "rust-compile-fnparam.h" namespace Rust { namespace Compile { -class CompileInherentImplItem : public HIRCompileBase +// this is a proxy for HIR::ImplItem's back to use the normel HIR::Item path +class CompileInherentImplItem : public CompileItem { - using Rust::Compile::HIRCompileBase::visit; + using Rust::Compile::CompileItem::visit; public: static tree Compile (HIR::ImplItem *item, Context *ctx, @@ -50,265 +48,11 @@ public: return compiler.reference; } - void visit (HIR::ConstantItem &constant) override - { - TyTy::BaseType *resolved_type = nullptr; - bool ok - = ctx->get_tyctx ()->lookup_type (constant.get_mappings ().get_hirid (), - &resolved_type); - rust_assert (ok); - - tree type = TyTyResolveCompile::compile (ctx, resolved_type); - tree value = CompileExpr::Compile (constant.get_expr (), ctx); - - const Resolver::CanonicalPath *canonical_path = nullptr; - ok = ctx->get_mappings ()->lookup_canonical_path ( - constant.get_mappings ().get_crate_num (), - constant.get_mappings ().get_nodeid (), &canonical_path); - rust_assert (ok); - - std::string ident = canonical_path->get (); - tree const_expr = ctx->get_backend ()->named_constant_expression ( - type, constant.get_identifier (), value, constant.get_locus ()); - - ctx->push_const (const_expr); - ctx->insert_const_decl (constant.get_mappings ().get_hirid (), const_expr); - - reference = const_expr; - } - - void visit (HIR::Function &function) override - { - TyTy::BaseType *fntype_tyty; - if (!ctx->get_tyctx ()->lookup_type (function.get_mappings ().get_hirid (), - &fntype_tyty)) - { - rust_fatal_error (function.get_locus (), - "failed to lookup function type"); - return; - } - - rust_assert (fntype_tyty->get_kind () == TyTy::TypeKind::FNDEF); - TyTy::FnType *fntype = static_cast<TyTy::FnType *> (fntype_tyty); - if (fntype->has_subsititions_defined ()) - { - // we cant do anything for this only when it is used and a concrete type - // is given - if (concrete == nullptr) - return; - else - { - rust_assert (concrete->get_kind () == TyTy::TypeKind::FNDEF); - fntype = static_cast<TyTy::FnType *> (concrete); - } - } - - // items can be forward compiled which means we may not need to invoke this - // code. We might also have already compiled this generic function as well. - tree lookup = NULL_TREE; - if (ctx->lookup_function_decl (fntype->get_ty_ref (), &lookup, - fntype->get_id (), fntype)) - { - // has this been added to the list then it must be finished - if (ctx->function_completed (lookup)) - { - tree dummy = NULL_TREE; - if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &dummy)) - { - ctx->insert_function_decl (fntype, lookup); - } - reference - = ctx->get_backend ()->function_code_expression (lookup, - ref_locus); - return; - } - } - - if (fntype->has_subsititions_defined ()) - { - // override the Hir Lookups for the substituions in this context - fntype->override_context (); - } - - // convert to the actual function type - tree compiled_fn_type = TyTyResolveCompile::compile (ctx, fntype); - - const Resolver::CanonicalPath *canonical_path = nullptr; - bool ok = ctx->get_mappings ()->lookup_canonical_path ( - function.get_mappings ().get_crate_num (), - function.get_mappings ().get_nodeid (), &canonical_path); - rust_assert (ok); - - std::string ir_symbol_name - = canonical_path->get () + fntype->subst_as_string (); - std::string asm_name = ctx->mangle_item (fntype, *canonical_path); - - unsigned int flags = 0; - tree fndecl - = ctx->get_backend ()->function (compiled_fn_type, ir_symbol_name, - asm_name, flags, function.get_locus ()); - setup_attributes_on_fndecl (fndecl, false, function.has_visibility (), - function.get_qualifiers (), - function.get_outer_attrs ()); - ctx->insert_function_decl (fntype, fndecl); - - // setup the params - TyTy::BaseType *tyret = fntype->get_return_type (); - std::vector<Bvariable *> param_vars; - - if (function.is_method ()) - { - // insert self - TyTy::BaseType *self_tyty_lookup = nullptr; - if (!ctx->get_tyctx ()->lookup_type ( - function.get_self_param ().get_mappings ().get_hirid (), - &self_tyty_lookup)) - { - rust_error_at (function.get_self_param ().get_locus (), - "failed to lookup self param type"); - return; - } - - tree self_type = TyTyResolveCompile::compile (ctx, self_tyty_lookup); - if (self_type == nullptr) - { - rust_error_at (function.get_self_param ().get_locus (), - "failed to compile self param type"); - return; - } - - Bvariable *compiled_self_param - = CompileSelfParam::compile (ctx, fndecl, function.get_self_param (), - self_type, - function.get_self_param ().get_locus ()); - if (compiled_self_param == nullptr) - { - rust_error_at (function.get_self_param ().get_locus (), - "failed to compile self param variable"); - return; - } - - param_vars.push_back (compiled_self_param); - ctx->insert_var_decl ( - function.get_self_param ().get_mappings ().get_hirid (), - compiled_self_param); - } - - // offset from + 1 for the TyTy::FnType being used when this is a method to - // skip over Self on the FnType - size_t i = function.is_method () ? 1 : 0; - for (auto referenced_param : function.get_function_params ()) - { - auto tyty_param = fntype->param_at (i); - auto param_tyty = tyty_param.second; - - auto compiled_param_type - = TyTyResolveCompile::compile (ctx, param_tyty); - if (compiled_param_type == nullptr) - { - rust_error_at (referenced_param.get_locus (), - "failed to compile parameter type"); - return; - } - - Location param_locus - = ctx->get_mappings ()->lookup_location (param_tyty->get_ref ()); - Bvariable *compiled_param_var - = CompileFnParam::compile (ctx, fndecl, &referenced_param, - compiled_param_type, param_locus); - if (compiled_param_var == nullptr) - { - rust_error_at (param_locus, "Failed to compile parameter variable"); - return; - } - - param_vars.push_back (compiled_param_var); - - ctx->insert_var_decl (referenced_param.get_mappings ().get_hirid (), - compiled_param_var); - i++; - } - - if (!ctx->get_backend ()->function_set_parameters (fndecl, param_vars)) - { - rust_fatal_error (function.get_locus (), - "failed to setup parameter variables"); - return; - } - - // lookup locals - auto block_expr = function.get_definition ().get (); - auto body_mappings = block_expr->get_mappings (); - - Resolver::Rib *rib = nullptr; - if (!ctx->get_resolver ()->find_name_rib (body_mappings.get_nodeid (), - &rib)) - { - rust_fatal_error (function.get_locus (), - "failed to setup locals per block"); - return; - } - - std::vector<Bvariable *> locals; - ok = compile_locals_for_block (*rib, fndecl, locals); - rust_assert (ok); - - tree enclosing_scope = NULL_TREE; - HIR::BlockExpr *function_body = function.get_definition ().get (); - Location start_location = function_body->get_locus (); - Location end_location = function_body->get_end_locus (); - - tree code_block - = ctx->get_backend ()->block (fndecl, enclosing_scope, locals, - start_location, end_location); - ctx->push_block (code_block); - - Bvariable *return_address = nullptr; - if (function.has_function_return_type ()) - { - tree return_type = TyTyResolveCompile::compile (ctx, tyret); - - bool address_is_taken = false; - tree ret_var_stmt = NULL_TREE; - - return_address = ctx->get_backend ()->temporary_variable ( - fndecl, code_block, return_type, NULL, address_is_taken, - function.get_locus (), &ret_var_stmt); - - ctx->add_statement (ret_var_stmt); - } - - ctx->push_fn (fndecl, return_address); - - compile_function_body (fndecl, *function.get_definition ().get (), - function.has_function_return_type ()); - - ctx->pop_block (); - auto body = ctx->get_backend ()->block_statement (code_block); - if (!ctx->get_backend ()->function_set_body (fndecl, body)) - { - rust_error_at (function.get_locus (), "failed to set body to function"); - return; - } - - ctx->pop_fn (); - ctx->push_function (fndecl); - - reference - = ctx->get_backend ()->function_code_expression (fndecl, ref_locus); - } - private: CompileInherentImplItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus) - : HIRCompileBase (ctx), concrete (concrete), - reference (ctx->get_backend ()->error_expression ()), - ref_locus (ref_locus) + : CompileItem (ctx, concrete, ref_locus) {} - - TyTy::BaseType *concrete; - tree reference; - Location ref_locus; }; class CompileTraitItem : public HIRCompileBase @@ -316,12 +60,11 @@ class CompileTraitItem : public HIRCompileBase using Rust::Compile::HIRCompileBase::visit; public: - static tree Compile (const TyTy::BaseType *self, HIR::TraitItem *item, - Context *ctx, TyTy::BaseType *concrete, - bool is_query_mode = false, + static tree Compile (HIR::TraitItem *item, Context *ctx, + TyTy::BaseType *concrete, bool is_query_mode = false, Location ref_locus = Location ()) { - CompileTraitItem compiler (self, ctx, concrete, ref_locus); + CompileTraitItem compiler (ctx, concrete, ref_locus); item->accept_vis (compiler); if (is_query_mode @@ -332,240 +75,17 @@ public: return compiler.reference; } - void visit (HIR::TraitItemConst &constant) override - { - rust_assert (concrete != nullptr); - TyTy::BaseType *resolved_type = concrete; - - tree type = TyTyResolveCompile::compile (ctx, resolved_type); - tree value = CompileExpr::Compile (constant.get_expr ().get (), ctx); - - const Resolver::CanonicalPath *canonical_path = nullptr; - bool ok = ctx->get_mappings ()->lookup_canonical_path ( - constant.get_mappings ().get_crate_num (), - constant.get_mappings ().get_nodeid (), &canonical_path); - rust_assert (ok); - - std::string ident = canonical_path->get (); - tree const_expr = ctx->get_backend ()->named_constant_expression ( - type, constant.get_name (), value, constant.get_locus ()); - - ctx->push_const (const_expr); - ctx->insert_const_decl (constant.get_mappings ().get_hirid (), const_expr); - - reference = const_expr; - } - - void visit (HIR::TraitItemFunc &func) override - { - rust_assert (func.has_block_defined ()); - - rust_assert (concrete->get_kind () == TyTy::TypeKind::FNDEF); - TyTy::FnType *fntype = static_cast<TyTy::FnType *> (concrete); - - // items can be forward compiled which means we may not need to invoke this - // code. We might also have already compiled this generic function as well. - tree lookup = NULL_TREE; - if (ctx->lookup_function_decl (fntype->get_ty_ref (), &lookup, - fntype->get_id (), fntype)) - { - // has this been added to the list then it must be finished - if (ctx->function_completed (lookup)) - { - tree dummy = NULL_TREE; - if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &dummy)) - { - ctx->insert_function_decl (fntype, lookup); - } - reference - = ctx->get_backend ()->function_code_expression (lookup, - ref_locus); - return; - } - } - - if (fntype->has_subsititions_defined ()) - { - // override the Hir Lookups for the substituions in this context - fntype->override_context (); - } - - // convert to the actual function type - tree compiled_fn_type = TyTyResolveCompile::compile (ctx, fntype); - HIR::TraitFunctionDecl &function = func.get_decl (); - - const Resolver::CanonicalPath *canonical_path = nullptr; - bool ok = ctx->get_mappings ()->lookup_canonical_path ( - func.get_mappings ().get_crate_num (), func.get_mappings ().get_nodeid (), - &canonical_path); - rust_assert (ok); - - std::string fn_identifier = canonical_path->get (); - std::string asm_name = ctx->mangle_item (fntype, *canonical_path); - - unsigned int flags = 0; - tree fndecl - = ctx->get_backend ()->function (compiled_fn_type, fn_identifier, - asm_name, flags, func.get_locus ()); - setup_attributes_on_fndecl (fndecl, false, false, - func.get_decl ().get_qualifiers (), - func.get_outer_attrs ()); - ctx->insert_function_decl (fntype, fndecl); - - // setup the params - TyTy::BaseType *tyret = fntype->get_return_type (); - std::vector<Bvariable *> param_vars; - - if (function.is_method ()) - { - // insert self - TyTy::BaseType *self_tyty_lookup = nullptr; - if (!ctx->get_tyctx ()->lookup_type ( - function.get_self ().get_mappings ().get_hirid (), - &self_tyty_lookup)) - { - rust_error_at (function.get_self ().get_locus (), - "failed to lookup self param type"); - return; - } - - tree self_type = TyTyResolveCompile::compile (ctx, self_tyty_lookup); - if (self_type == nullptr) - { - rust_error_at (function.get_self ().get_locus (), - "failed to compile self param type"); - return; - } + void visit (HIR::TraitItemConst &constant) override; - Bvariable *compiled_self_param - = CompileSelfParam::compile (ctx, fndecl, function.get_self (), - self_type, - function.get_self ().get_locus ()); - if (compiled_self_param == nullptr) - { - rust_error_at (function.get_self ().get_locus (), - "failed to compile self param variable"); - return; - } - - param_vars.push_back (compiled_self_param); - ctx->insert_var_decl (function.get_self ().get_mappings ().get_hirid (), - compiled_self_param); - } - - // offset from + 1 for the TyTy::FnType being used when this is a method to - // skip over Self on the FnType - size_t i = function.is_method () ? 1 : 0; - for (auto referenced_param : function.get_function_params ()) - { - auto tyty_param = fntype->param_at (i); - auto param_tyty = tyty_param.second; - - auto compiled_param_type - = TyTyResolveCompile::compile (ctx, param_tyty); - if (compiled_param_type == nullptr) - { - rust_error_at (referenced_param.get_locus (), - "failed to compile parameter type"); - return; - } - - Location param_locus - = ctx->get_mappings ()->lookup_location (param_tyty->get_ref ()); - Bvariable *compiled_param_var - = CompileFnParam::compile (ctx, fndecl, &referenced_param, - compiled_param_type, param_locus); - if (compiled_param_var == nullptr) - { - rust_error_at (param_locus, "Failed to compile parameter variable"); - return; - } - - param_vars.push_back (compiled_param_var); - - ctx->insert_var_decl (referenced_param.get_mappings ().get_hirid (), - compiled_param_var); - i++; - } - - if (!ctx->get_backend ()->function_set_parameters (fndecl, param_vars)) - { - rust_fatal_error (func.get_locus (), - "failed to setup parameter variables"); - return; - } - - // lookup locals - auto block_expr = func.get_block_expr ().get (); - auto body_mappings = block_expr->get_mappings (); - - Resolver::Rib *rib = nullptr; - if (!ctx->get_resolver ()->find_name_rib (body_mappings.get_nodeid (), - &rib)) - { - rust_fatal_error (func.get_locus (), - "failed to setup locals per block"); - return; - } - - std::vector<Bvariable *> locals; - ok = compile_locals_for_block (*rib, fndecl, locals); - rust_assert (ok); - - tree enclosing_scope = NULL_TREE; - HIR::BlockExpr *function_body = func.get_block_expr ().get (); - Location start_location = function_body->get_locus (); - Location end_location = function_body->get_end_locus (); - - tree code_block - = ctx->get_backend ()->block (fndecl, enclosing_scope, locals, - start_location, end_location); - ctx->push_block (code_block); - - Bvariable *return_address = nullptr; - if (function.has_return_type ()) - { - tree return_type = TyTyResolveCompile::compile (ctx, tyret); - - bool address_is_taken = false; - tree ret_var_stmt = NULL_TREE; - - return_address = ctx->get_backend ()->temporary_variable ( - fndecl, code_block, return_type, NULL, address_is_taken, - func.get_locus (), &ret_var_stmt); - - ctx->add_statement (ret_var_stmt); - } - - ctx->push_fn (fndecl, return_address); - - compile_function_body (fndecl, *func.get_block_expr ().get (), - function.has_return_type ()); - - ctx->pop_block (); - auto body = ctx->get_backend ()->block_statement (code_block); - if (!ctx->get_backend ()->function_set_body (fndecl, body)) - { - rust_error_at (func.get_locus (), "failed to set body to function"); - return; - } - - ctx->pop_fn (); - ctx->push_function (fndecl); - - reference - = ctx->get_backend ()->function_code_expression (fndecl, ref_locus); - } + void visit (HIR::TraitItemFunc &func) override; private: - CompileTraitItem (const TyTy::BaseType *self, Context *ctx, - TyTy::BaseType *concrete, Location ref_locus) - : HIRCompileBase (ctx), self (self), concrete (concrete), + CompileTraitItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus) + : HIRCompileBase (ctx), concrete (concrete), reference (ctx->get_backend ()->error_expression ()), ref_locus (ref_locus) {} - const TyTy::BaseType *self; TyTy::BaseType *concrete; tree reference; Location ref_locus; |