diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-09-19 18:53:50 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-09-19 18:53:50 +0000 |
commit | 5850bf669fb2f22b024cc6273109637fb4501e18 (patch) | |
tree | b63efa4114cb120ea108cbe0f7bfdb24b4747405 /gcc | |
parent | 2bfbb8613327472484037c20d5fc3647e82113dc (diff) | |
download | gcc-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.cc | 50 |
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; + } } } |