This patch by Than McIntosh passes in the calling (containing) Bfunction when invoking the Backend method call_expression(), so as to handle the case where generation of the call forces the creation of a temp var within the calling function. Bootstrapped and ran Go tests on x86_64-pc-linux-gnu. Committed to mainline.
Ian 2017-05-12 Than McIntosh <th...@google.com> * go-gcc.cc (Gcc_backend::call_expression): Add caller parameter.
Index: gcc/go/go-gcc.cc =================================================================== --- gcc/go/go-gcc.cc (revision 247937) +++ gcc/go/go-gcc.cc (working copy) @@ -348,7 +348,8 @@ class Gcc_backend : public Backend array_index_expression(Bexpression* array, Bexpression* index, Location); Bexpression* - call_expression(Bexpression* fn, const std::vector<Bexpression*>& args, + call_expression(Bfunction* caller, Bexpression* fn, + const std::vector<Bexpression*>& args, Bexpression* static_chain, Location); Bexpression* @@ -1892,9 +1893,11 @@ Gcc_backend::array_index_expression(Bexp // Create an expression for a call to FN_EXPR with FN_ARGS. Bexpression* -Gcc_backend::call_expression(Bexpression* fn_expr, +Gcc_backend::call_expression(Bfunction*, // containing fcn for call + Bexpression* fn_expr, const std::vector<Bexpression*>& fn_args, - Bexpression* chain_expr, Location location) + Bexpression* chain_expr, + Location location) { tree fn = fn_expr->get_tree(); if (fn == error_mark_node || TREE_TYPE(fn) == error_mark_node) Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 247967) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -d5bfa6cebb19a154cbfbc53f6e647d2ca7adef68 +2f21020c9f61b31bd04d5b814aaa27bf976bf07a The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/backend.h =================================================================== --- gcc/go/gofrontend/backend.h (revision 247848) +++ gcc/go/gofrontend/backend.h (working copy) @@ -372,9 +372,11 @@ class Backend virtual Bexpression* array_index_expression(Bexpression* array, Bexpression* index, Location) = 0; - // Create an expression for a call to FN with ARGS. + // Create an expression for a call to FN with ARGS, taking place within + // caller CALLER. virtual Bexpression* - call_expression(Bexpression* fn, const std::vector<Bexpression*>& args, + call_expression(Bfunction *caller, Bexpression* fn, + const std::vector<Bexpression*>& args, Bexpression* static_chain, Location) = 0; // Return an expression that allocates SIZE bytes on the stack. Index: gcc/go/gofrontend/expressions.cc =================================================================== --- gcc/go/gofrontend/expressions.cc (revision 247848) +++ gcc/go/gofrontend/expressions.cc (working copy) @@ -10290,13 +10290,16 @@ Call_expression::do_get_backend(Translat bfn = gogo->backend()->convert_expression(bft, bfn, location); } - Bexpression* call = gogo->backend()->call_expression(bfn, fn_args, - bclosure, location); + Bfunction* bfunction = NULL; + if (context->function()) + bfunction = context->function()->func_value()->get_decl(); + Bexpression* call = gogo->backend()->call_expression(bfunction, bfn, + fn_args, bclosure, + location); if (this->results_ != NULL) { Bexpression* bcall_ref = this->call_result_ref(context); - Bfunction* bfunction = context->function()->func_value()->get_decl(); Bstatement* assn_stmt = gogo->backend()->assignment_statement(bfunction, bcall_ref, call, location); Index: gcc/go/gofrontend/gogo.cc =================================================================== --- gcc/go/gofrontend/gogo.cc (revision 247848) +++ gcc/go/gofrontend/gogo.cc (working copy) @@ -708,8 +708,8 @@ Gogo::init_imports(std::vector<Bstatemen Bexpression* pfunc_code = this->backend()->function_code_expression(pfunc, unknown_loc); Bexpression* pfunc_call = - this->backend()->call_expression(pfunc_code, empty_args, - NULL, unknown_loc); + this->backend()->call_expression(bfunction, pfunc_code, empty_args, + NULL, unknown_loc); init_stmts.push_back(this->backend()->expression_statement(bfunction, pfunc_call)); } @@ -1498,7 +1498,7 @@ Gogo::write_globals() Bfunction* initfn = func->get_or_make_decl(this, *p); Bexpression* func_code = this->backend()->function_code_expression(initfn, func_loc); - Bexpression* call = this->backend()->call_expression(func_code, + Bexpression* call = this->backend()->call_expression(initfn, func_code, empty_args, NULL, func_loc); Bstatement* ist = this->backend()->expression_statement(initfn, call);