aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2018-01-09 23:33:49 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-01-09 23:33:49 +0000
commit92bb02927b92c5d0123431b6b486d2a398770fce (patch)
treeb2e86086338f45336e6aa538099f55d6618323f4 /gcc
parenteb80a362bc7b382baf8541e84ccab33a887dd58a (diff)
downloadgcc-92bb02927b92c5d0123431b6b486d2a398770fce.zip
gcc-92bb02927b92c5d0123431b6b486d2a398770fce.tar.gz
gcc-92bb02927b92c5d0123431b6b486d2a398770fce.tar.bz2
compiler: make non-escaping Bound_method_expression not heap allocate
Bound_method_expression needs a closure. Stack allocate the closure when it does not escape. Reviewed-on: https://go-review.googlesource.com/85638 From-SVN: r256407
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc7
2 files changed, 7 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index b3f314a..fe3c16e 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-584fdecefce831c3471dbd4857ba0ce0be2b5212
+d5774539b17112d9ce709a1fe722daf68eb8594f
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 319fc9e..f4dc8e8 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -7030,7 +7030,12 @@ Bound_method_expression::do_flatten(Gogo* gogo, Named_object*,
Expression* ret = Expression::make_struct_composite_literal(st, vals, loc);
if (!gogo->compiling_runtime() || gogo->package_name() != "runtime")
- ret = Expression::make_heap_expression(ret, loc);
+ {
+ ret = Expression::make_heap_expression(ret, loc);
+ Node* n = Node::make_node(this);
+ if ((n->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
+ ret->heap_expression()->set_allocate_on_stack();
+ }
else
{
// When compiling the runtime, method closures do not escape.