aboutsummaryrefslogtreecommitdiff
path: root/gcc/go/gofrontend/statements.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2011-04-19 21:52:41 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-04-19 21:52:41 +0000
commit9131ad67477de06fb420c24863b9c9abf2a16d80 (patch)
tree09b4493c30f3ccd5ea96ddd3dd3b139abdffcd5e /gcc/go/gofrontend/statements.cc
parentf067961248ea104024f8b313ae39b3b95af1f8b5 (diff)
downloadgcc-9131ad67477de06fb420c24863b9c9abf2a16d80.zip
gcc-9131ad67477de06fb420c24863b9c9abf2a16d80.tar.gz
gcc-9131ad67477de06fb420c24863b9c9abf2a16d80.tar.bz2
Use backend interface for temporary variables.
* go-gcc.cc (Gcc_backend::temporary_variable): New function. From-SVN: r172737
Diffstat (limited to 'gcc/go/gofrontend/statements.cc')
-rw-r--r--gcc/go/gofrontend/statements.cc98
1 files changed, 42 insertions, 56 deletions
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index 7c6ccb9..eef9398 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -311,19 +311,6 @@ Temporary_statement::type() const
return this->type_ != NULL ? this->type_ : this->init_->type();
}
-// Return the tree for the temporary variable.
-
-tree
-Temporary_statement::get_decl() const
-{
- if (this->decl_ == NULL)
- {
- gcc_assert(saw_errors());
- return error_mark_node;
- }
- return this->decl_;
-}
-
// Traversal.
int
@@ -400,53 +387,52 @@ Temporary_statement::do_check_types(Gogo*)
tree
Temporary_statement::do_get_tree(Translate_context* context)
{
- gcc_assert(this->decl_ == NULL_TREE);
- tree type_tree = this->type()->get_tree(context->gogo());
- tree init_tree = (this->init_ == NULL
- ? NULL_TREE
- : this->init_->get_tree(context));
- if (type_tree == error_mark_node || init_tree == error_mark_node)
- {
- this->decl_ = error_mark_node;
- return error_mark_node;
- }
- // We can only use create_tmp_var if the type is not addressable.
- if (!TREE_ADDRESSABLE(type_tree))
+ gcc_assert(this->bvariable_ == NULL);
+
+ // FIXME: Permitting FUNCTION to be NULL here is a temporary measure
+ // until we have a better representation of the init function.
+ Named_object* function = context->function();
+ Bfunction* bfunction;
+ if (function == NULL)
+ bfunction = NULL;
+ else
+ bfunction = tree_to_function(function->func_value()->get_decl());
+
+ Btype* btype = tree_to_type(this->type()->get_tree(context->gogo()));
+
+ Bexpression* binit;
+ if (this->init_ == NULL)
+ binit = NULL;
+ else if (this->type_ == NULL)
+ binit = tree_to_expr(this->init_->get_tree(context));
+ else
{
- this->decl_ = create_tmp_var(type_tree, "GOTMP");
- DECL_SOURCE_LOCATION(this->decl_) = this->location();
+ Expression* init = Expression::make_cast(this->type_, this->init_,
+ this->location());
+ context->gogo()->lower_expression(context->function(), &init);
+ binit = tree_to_expr(init->get_tree(context));
}
- else
+
+ Bstatement* statement;
+ this->bvariable_ =
+ context->backend()->temporary_variable(bfunction, context->bblock(),
+ btype, binit,
+ this->is_address_taken_,
+ this->location(), &statement);
+ return stat_to_tree(statement);
+}
+
+// Return the backend variable.
+
+Bvariable*
+Temporary_statement::get_backend_variable(Translate_context* context) const
+{
+ if (this->bvariable_ == NULL)
{
- gcc_assert(context->function() != NULL && context->block() != NULL);
- tree decl = build_decl(this->location(), VAR_DECL,
- create_tmp_var_name("GOTMP"),
- type_tree);
- DECL_ARTIFICIAL(decl) = 1;
- DECL_IGNORED_P(decl) = 1;
- TREE_USED(decl) = 1;
- gcc_assert(current_function_decl != NULL_TREE);
- DECL_CONTEXT(decl) = current_function_decl;
-
- // We have to add this variable to the BLOCK and the BIND_EXPR.
- tree bind_tree = block_to_tree(context->bblock());
- gcc_assert(bind_tree != NULL_TREE && TREE_CODE(bind_tree) == BIND_EXPR);
- tree block_tree = BIND_EXPR_BLOCK(bind_tree);
- gcc_assert(TREE_CODE(block_tree) == BLOCK);
- DECL_CHAIN(decl) = BLOCK_VARS(block_tree);
- BLOCK_VARS(block_tree) = decl;
- BIND_EXPR_VARS(bind_tree) = BLOCK_VARS(block_tree);
-
- this->decl_ = decl;
+ gcc_assert(saw_errors());
+ return context->backend()->error_variable();
}
- if (init_tree != NULL_TREE)
- DECL_INITIAL(this->decl_) =
- Expression::convert_for_assignment(context, this->type(),
- this->init_->type(), init_tree,
- this->location());
- if (this->is_address_taken_)
- TREE_ADDRESSABLE(this->decl_) = 1;
- return this->build_stmt_1(DECL_EXPR, this->decl_);
+ return this->bvariable_;
}
// Make and initialize a temporary variable in BLOCK.