compiler: add calling Bfunction Backend::call_expression
authorThan McIntosh <thanm@google.com>
Fri, 12 May 2017 16:36:50 +0000 (16:36 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 12 May 2017 16:36:50 +0000 (16:36 +0000)
    Pass 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.

    Reviewed-on: https://go-review.googlesource.com/43270

From-SVN: r247981

gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/MERGE
gcc/go/gofrontend/backend.h
gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/gogo.cc

index 11550003e05a37acbddc3ad7f58ce9d9a9cd6789..59b4e6eeb6bb6977efddd5ecf4a96a8b8c9621be 100644 (file)
@@ -1,3 +1,7 @@
+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
index 06bc6d720c069938f57ad9ad5546b031c8242b30..a7977fe03c134caea7cc56b8f972b4aa940d47ca 100644 (file)
@@ -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(Bexpression* array, Bexpression* index,
 
 // 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 f4bcf46e46ea652ddcc27fa7b13f872657e5e7ce..02219862b359a68b31aa631b3ef84a31490c6e3d 100644 (file)
@@ -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 e51efe4ef237d82b7876c3faba9bd9584f06fe2a..9951a72e45cede3c8065ad73f225140a44102fbc 100644 (file)
@@ -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 ecafe1658b67f4150101e00532c798b21a20d46d..c5e9a0b6a562eccf07e8c9b403ff90fda206ac6c 100644 (file)
@@ -10290,13 +10290,16 @@ Call_expression::do_get_backend(Translate_context* context)
       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 12135d7e9a6c87e39dae6b1322eef8af124d300c..b076b87b4911acf3cad3eaba2f297f5c1693660c 100644 (file)
@@ -708,8 +708,8 @@ Gogo::init_imports(std::vector<Bstatement*>& init_stmts, Bfunction *bfunction)
       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);