gccrs: Move Backend::error_variable to Bvariable::error_variable

gcc/rust/ChangeLog:

	* rust-backend.h
	(Backend::error_variable): Remove.
	(Gcc_backend::error_variable): Move to ...
	* rust-gcc.cc
	(Bvariable::error_variable): ... here ...
	* rust-gcc.h
	(Bvariable::error_variable): ... and declare here.
	(Gcc_backend::global_variable): Update error_variable call.
	(Gcc_backend::local_variable): Likewise.
	(Gcc_backend::parameter_variable): Likewise.
	(Gcc_backend::static_chain_variable): Likewise.
	(Gcc_backend::temporary_variable): Likewise.
	* backend/rust-compile-extern.h
	(CompileExternItem::visit): Likewise.
	* backend/rust-compile-fnparam.cc
	(CompileFnParam::CompileFnParam): Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
This commit is contained in:
Owen Avery 2023-08-02 15:51:38 -04:00 committed by Arthur Cohen
parent 79b52e6956
commit 77fbe55f8e
5 changed files with 18 additions and 14 deletions

View file

@ -48,7 +48,7 @@ public:
void visit (HIR::ExternalStaticItem &item) override void visit (HIR::ExternalStaticItem &item) override
{ {
// check if its already been compiled // check if its already been compiled
Bvariable *lookup = ctx->get_backend ()->error_variable (); Bvariable *lookup = Bvariable::error_variable ();
if (ctx->lookup_var_decl (item.get_mappings ().get_hirid (), &lookup)) if (ctx->lookup_var_decl (item.get_mappings ().get_hirid (), &lookup))
{ {
reference = ctx->get_backend ()->var_expression (lookup, ref_locus); reference = ctx->get_backend ()->var_expression (lookup, ref_locus);

View file

@ -27,7 +27,7 @@ namespace Compile {
CompileFnParam::CompileFnParam (Context *ctx, tree fndecl, tree decl_type, CompileFnParam::CompileFnParam (Context *ctx, tree fndecl, tree decl_type,
location_t locus) location_t locus)
: HIRCompileBase (ctx), fndecl (fndecl), decl_type (decl_type), locus (locus), : HIRCompileBase (ctx), fndecl (fndecl), decl_type (decl_type), locus (locus),
compiled_param (ctx->get_backend ()->error_variable ()) compiled_param (Bvariable::error_variable ())
{} {}
Bvariable * Bvariable *

View file

@ -346,11 +346,6 @@ public:
// Variables. // Variables.
// Create an error variable. This is used for cases which should
// not occur in a correct program, in order to keep the compilation
// going without crashing.
virtual Bvariable *error_variable () = 0;
// Create a global variable. NAME is the package-qualified name of // Create a global variable. NAME is the package-qualified name of
// the variable. ASM_NAME is the encoded identifier for the // the variable. ASM_NAME is the encoded identifier for the
// variable, incorporating the package, and made safe for the // variable, incorporating the package, and made safe for the
@ -655,8 +650,6 @@ public:
// Variables. // Variables.
Bvariable *error_variable () { return new Bvariable (error_mark_node); }
Bvariable *global_variable (const std::string &var_name, Bvariable *global_variable (const std::string &var_name,
const std::string &asm_name, tree type, const std::string &asm_name, tree type,
bool is_external, bool is_hidden, bool is_external, bool is_hidden,

View file

@ -77,6 +77,12 @@ Bvariable::get_tree (location_t location) const
return build_fold_indirect_ref_loc (location, t); return build_fold_indirect_ref_loc (location, t);
} }
Bvariable *
Bvariable::error_variable ()
{
return new Bvariable (error_mark_node);
}
// This file implements the interface between the Rust frontend proper // This file implements the interface between the Rust frontend proper
// and the gcc IR. This implements specific instantiations of // and the gcc IR. This implements specific instantiations of
// abstract classes defined by the Rust frontend proper. The Rust // abstract classes defined by the Rust frontend proper. The Rust
@ -2048,7 +2054,7 @@ Gcc_backend::global_variable (const std::string &var_name,
bool in_unique_section, location_t location) bool in_unique_section, location_t location)
{ {
if (type_tree == error_mark_node) if (type_tree == error_mark_node)
return this->error_variable (); return Bvariable::error_variable ();
// The GNU linker does not like dynamic variables with zero size. // The GNU linker does not like dynamic variables with zero size.
tree orig_type_tree = type_tree; tree orig_type_tree = type_tree;
@ -2113,7 +2119,7 @@ Gcc_backend::local_variable (tree function, const std::string &name,
location_t location) location_t location)
{ {
if (type_tree == error_mark_node) if (type_tree == error_mark_node)
return this->error_variable (); return Bvariable::error_variable ();
tree decl = build_decl (location, VAR_DECL, get_identifier_from_string (name), tree decl = build_decl (location, VAR_DECL, get_identifier_from_string (name),
type_tree); type_tree);
DECL_CONTEXT (decl) = function; DECL_CONTEXT (decl) = function;
@ -2134,7 +2140,7 @@ Gcc_backend::parameter_variable (tree function, const std::string &name,
tree type_tree, location_t location) tree type_tree, location_t location)
{ {
if (type_tree == error_mark_node) if (type_tree == error_mark_node)
return this->error_variable (); return Bvariable::error_variable ();
tree decl = build_decl (location, PARM_DECL, tree decl = build_decl (location, PARM_DECL,
get_identifier_from_string (name), type_tree); get_identifier_from_string (name), type_tree);
DECL_CONTEXT (decl) = function; DECL_CONTEXT (decl) = function;
@ -2151,7 +2157,7 @@ Gcc_backend::static_chain_variable (tree fndecl, const std::string &name,
tree type_tree, location_t location) tree type_tree, location_t location)
{ {
if (type_tree == error_mark_node) if (type_tree == error_mark_node)
return this->error_variable (); return Bvariable::error_variable ();
tree decl = build_decl (location, PARM_DECL, tree decl = build_decl (location, PARM_DECL,
get_identifier_from_string (name), type_tree); get_identifier_from_string (name), type_tree);
DECL_CONTEXT (decl) = fndecl; DECL_CONTEXT (decl) = fndecl;
@ -2188,7 +2194,7 @@ Gcc_backend::temporary_variable (tree fndecl, tree bind_tree, tree type_tree,
|| fndecl == error_mark_node) || fndecl == error_mark_node)
{ {
*pstatement = error_mark_node; *pstatement = error_mark_node;
return this->error_variable (); return Bvariable::error_variable ();
} }
tree var; tree var;

View file

@ -49,6 +49,11 @@ public:
// Get the actual decl; // Get the actual decl;
tree get_decl () const { return this->t_; } tree get_decl () const { return this->t_; }
// Create an error variable. This is used for cases which should
// not occur in a correct program, in order to keep the compilation
// going without crashing.
static Bvariable *error_variable ();
private: private:
tree t_; tree t_;
tree orig_type_; tree orig_type_;