compiler: make escape analysis work with imported inlineable functions
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 10 Jun 2019 19:30:21 +0000 (19:30 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 10 Jun 2019 19:30:21 +0000 (19:30 +0000)
    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

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/escape.cc
gcc/go/gofrontend/types.h

index 91b85c0fecd47e15522f6b9afddbe2472f0082c0..eae27560ffcbf389ca8311e1b4c0ebec9800db99 100644 (file)
@@ -1,4 +1,4 @@
-b79e9e79fddc9040ab58c7c518eb08454f308def
+a32739aadf0c7a65fcd5d5b6d0a0d206bff24a4f
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 2957c0d1e507bae29ea76beb12e8d673137128ba..a1558340da4d0cfa60cb98d9aa4db4a235ad6707 100644 (file)
@@ -2773,15 +2773,8 @@ Gogo::assign_connectivity(Escape_context* context, Named_object* fn)
       if (!p->type()->has_pointer())
         continue;
 
-      // External function?  Parameters must escape unless //go:noescape is set.
-      // TODO(cmang): Implement //go:noescape directive.
-      if (fn->package() != NULL)
-       param_node->set_encoding(Node::ESCAPE_HEAP);
-      else
-        {
-          param_node->set_encoding(Node::ESCAPE_NONE);
-          context->track(param_node);
-        }
+      param_node->set_encoding(Node::ESCAPE_NONE);
+      context->track(param_node);
     }
 
   Escape_analysis_loop el;
@@ -3319,9 +3312,6 @@ Escape_analysis_tag::tag(Named_object* fn)
 {
   // External functions are assumed unsafe
   // unless //go:noescape is given before the declaration.
-  if (fn->package() != NULL)
-    return;
-
   if (fn->is_function_declaration())
     {
       Function_declaration* fdcl = fn->func_declaration_value();
index 375f7112742ea1047e0b29c030b8cf52de1b77bb..2b51df5812be00d2c398e9e7166a8b00c5e97957 100644 (file)
@@ -1494,7 +1494,12 @@ class Typed_identifier
   // Set the escape note.
   void
   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:
   // Identifier name.