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
merge done from the gofrontend repository.
......@@ -1420,7 +1420,14 @@ Escape_analysis_assign::statement(Block*, size_t*, Statement* s)
case Statement::STATEMENT_DEFER:
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
case Statement::STATEMENT_GO:
......
......@@ -2156,6 +2156,8 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
// Allocate the initialized struct on the heap.
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
// 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