Commit 47e8a22a by Ian Lance Taylor

compiler: stack allocate defer thunk

    
    Defer statement may need to allocate a thunk. When it is not
    inside a loop, this can be stack allocated, as it runs before
    the function finishes.
    
    Reviewed-on: https://go-review.googlesource.com/85639

From-SVN: r256410
parent 311eca53
d5774539b17112d9ce709a1fe722daf68eb8594f 7c5e4d67041e3529a055a923b2b9f5ef09aa72a3
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1420,7 +1420,14 @@ Escape_analysis_assign::statement(Block*, size_t*, Statement* s) ...@@ -1420,7 +1420,14 @@ Escape_analysis_assign::statement(Block*, size_t*, Statement* s)
case Statement::STATEMENT_DEFER: case Statement::STATEMENT_DEFER:
if (this->context_->loop_depth() == 1) if (this->context_->loop_depth() == 1)
break; {
// Defer statement may need to allocate a thunk. When it is
// not inside a loop, this can be stack allocated, as it
// runs before the function finishes.
Node* n = Node::make_node(s);
n->set_encoding(Node::ESCAPE_NONE);
break;
}
// fallthrough // fallthrough
case Statement::STATEMENT_GO: case Statement::STATEMENT_GO:
......
...@@ -2156,6 +2156,8 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function, ...@@ -2156,6 +2156,8 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
// Allocate the initialized struct on the heap. // Allocate the initialized struct on the heap.
constructor = Expression::make_heap_expression(constructor, location); constructor = Expression::make_heap_expression(constructor, location);
if ((Node::make_node(this)->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
constructor->heap_expression()->set_allocate_on_stack();
// Throw an error if the function is nil. This is so that for `go // Throw an error if the function is nil. This is so that for `go
// nil` we get a backtrace from the go statement, rather than a // nil` we get a backtrace from the go statement, rather than a
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment