Commit c2f879e1 by Ian Lance Taylor

compiler: make escape analysis work with imported inlineable functions

    
    The escape analysis was written before we import inlineable
    function bodies, and in some places it skipped functions that are
    not in the local package. Now that there are imported function
    bodies, make the escape analysis work with them.
    
    Note that it is necessary for the escape analysis to run on
    imported function bodies, even if they are already tagged. The
    tags only have the information of the parameters (receiver,
    results), but not the internal nodes, e.g. local variables. We
    still need to do the analysis to get all the information. (In the
    future maybe we could export/import escape info for internal
    nodes also, then we don't need to redo the analysis.)
    
    Also add assertions to ensure that if we analyze the same
    function in multiple places, they'd better agree with each other.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181537

From-SVN: r272124
parent f359611b
b79e9e79fddc9040ab58c7c518eb08454f308def a32739aadf0c7a65fcd5d5b6d0a0d206bff24a4f
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.
...@@ -2773,15 +2773,8 @@ Gogo::assign_connectivity(Escape_context* context, Named_object* fn) ...@@ -2773,15 +2773,8 @@ Gogo::assign_connectivity(Escape_context* context, Named_object* fn)
if (!p->type()->has_pointer()) if (!p->type()->has_pointer())
continue; continue;
// External function? Parameters must escape unless //go:noescape is set. param_node->set_encoding(Node::ESCAPE_NONE);
// TODO(cmang): Implement //go:noescape directive. context->track(param_node);
if (fn->package() != NULL)
param_node->set_encoding(Node::ESCAPE_HEAP);
else
{
param_node->set_encoding(Node::ESCAPE_NONE);
context->track(param_node);
}
} }
Escape_analysis_loop el; Escape_analysis_loop el;
...@@ -3319,9 +3312,6 @@ Escape_analysis_tag::tag(Named_object* fn) ...@@ -3319,9 +3312,6 @@ Escape_analysis_tag::tag(Named_object* fn)
{ {
// External functions are assumed unsafe // External functions are assumed unsafe
// unless //go:noescape is given before the declaration. // unless //go:noescape is given before the declaration.
if (fn->package() != NULL)
return;
if (fn->is_function_declaration()) if (fn->is_function_declaration())
{ {
Function_declaration* fdcl = fn->func_declaration_value(); Function_declaration* fdcl = fn->func_declaration_value();
......
...@@ -1494,7 +1494,12 @@ class Typed_identifier ...@@ -1494,7 +1494,12 @@ class Typed_identifier
// Set the escape note. // Set the escape note.
void void
set_note(const std::string& note) set_note(const std::string& note)
{ this->note_ = new std::string(note); } {
if (this->note_ != NULL)
go_assert(*this->note_ == note);
else
this->note_ = new std::string(note);
}
private: private:
// Identifier name. // Identifier name.
......
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