aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2014-09-19 18:53:50 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2014-09-19 18:53:50 +0000
commit5850bf669fb2f22b024cc6273109637fb4501e18 (patch)
treeb63efa4114cb120ea108cbe0f7bfdb24b4747405 /gcc
parent2bfbb8613327472484037c20d5fc3647e82113dc (diff)
downloadgcc-5850bf669fb2f22b024cc6273109637fb4501e18.zip
gcc-5850bf669fb2f22b024cc6273109637fb4501e18.tar.gz
gcc-5850bf669fb2f22b024cc6273109637fb4501e18.tar.bz2
compiler: Pass constant arguments directly to thunk functions.
From-SVN: r215402
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/statements.cc50
1 files changed, 36 insertions, 14 deletions
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index 090c193..f847805 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -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;
+ }
}
}