diff mbox

Go patch committed: pass current function to Backend::call_expression

Message ID CAOyqgcVH31oVka=fvhXg010EXO_06xwihQf0dMXu5hv-ORrcQA@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor May 12, 2017, 4:36 p.m. UTC
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  <thanm@google.com>

* go-gcc.cc (Gcc_backend::call_expression): Add caller parameter.
diff mbox

Patch

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);