+2017-05-12 Than McIntosh <thanm@google.com>
+
+ * go-gcc.cc (Gcc_backend::call_expression): Add caller parameter.
+
2017-05-11 Ian Lance Taylor <iant@google.com>
PR go/64238
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*
// 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)
-d5bfa6cebb19a154cbfbc53f6e647d2ca7adef68
+2f21020c9f61b31bd04d5b814aaa27bf976bf07a
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
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.
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);
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));
}
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);