]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: Pass constant arguments directly to thunk functions.
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 19 Sep 2014 18:53:50 +0000 (18:53 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 19 Sep 2014 18:53:50 +0000 (18:53 +0000)
From-SVN: r215402

gcc/go/gofrontend/statements.cc

index 090c193b8ca45fb9a561ea1b25046c2750d6dd95..f8478051f94df264a6686869fc21274c6f7b17bc 100644 (file)
@@ -2178,7 +2178,11 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
       for (Expression_list::const_iterator p = ce->args()->begin();
           p != ce->args()->end();
           ++p)
-       vals->push_back(*p);
+       {
+         if ((*p)->is_constant())
+           continue;
+         vals->push_back(*p);
+       }
     }
 
   // Build the struct.
@@ -2281,6 +2285,9 @@ Thunk_statement::build_struct(Function_type* fntype)
           p != args->end();
           ++p, ++i)
        {
+         if ((*p)->is_constant())
+           continue;
+
          char buf[50];
          this->thunk_field_param(i, buf, sizeof buf);
          fields->push_back(Struct_field(Typed_identifier(buf, (*p)->type(),
@@ -2418,21 +2425,36 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
     ++p;
   bool is_recover_call = ce->is_recover_call();
   Expression* recover_arg = NULL;
-  for (; p != fields->end(); ++p, ++next_index)
+
+  const Expression_list* args = ce->args();
+  if (args != NULL)
     {
-      Expression* thunk_param = Expression::make_var_reference(named_parameter,
-                                                              location);
-      thunk_param = Expression::make_unary(OPERATOR_MULT, thunk_param,
-                                          location);
-      Expression* param = Expression::make_field_reference(thunk_param,
-                                                          next_index,
-                                                          location);
-      if (!is_recover_call)
-       call_params->push_back(param);
-      else
+      for (Expression_list::const_iterator arg = args->begin();
+          arg != args->end();
+          ++arg)
        {
-         go_assert(call_params->empty());
-         recover_arg = param;
+         Expression* param;
+         if ((*arg)->is_constant())
+           param = *arg;
+         else
+           {
+             Expression* thunk_param =
+               Expression::make_var_reference(named_parameter, location);
+             thunk_param =
+               Expression::make_unary(OPERATOR_MULT, thunk_param, location);
+             param = Expression::make_field_reference(thunk_param,
+                                                      next_index,
+                                                      location);
+             ++next_index;
+           }
+
+         if (!is_recover_call)
+           call_params->push_back(param);
+         else
+           {
+             go_assert(call_params->empty());
+             recover_arg = param;
+           }
        }
     }