compiler, go/internal/gccgoimporter: export notinheap annotation
authorIan Lance Taylor <iant@golang.org>
Mon, 26 Oct 2020 23:48:03 +0000 (16:48 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 27 Oct 2020 18:03:11 +0000 (11:03 -0700)
This is the gofrontend version of https://golang.org/cl/259297.
This is required now because that change is in the 1.15.3 release.

This requires changing the go/internal/gccgoimporter package, to skip
the new annotation. This change will need to be ported to the gc and
x/tools repos.

For golang/go#41761

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/265258

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/export.cc
gcc/go/gofrontend/import.cc
gcc/go/gofrontend/types.cc
gcc/go/gofrontend/types.h
libgo/go/go/internal/gccgoimporter/parser.go

index 6caece3f894506157b39a918de3d79740c336fd7..7d06595450274e41d91e87b2878b33cada7c2314 100644 (file)
@@ -1,4 +1,4 @@
-4c1e7a083bdea02759cd5d2054038fb8a4a55ec8
+957591b8a054b692d92203a2420851689875f9c5
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 277aa74e571753cca7cfd0f3a624d3d27dd660cc..90a5f6dbcec619f3fe0ebdd16bf470cb2d228cdb 100644 (file)
@@ -1211,6 +1211,9 @@ Export::write_type_definition(const Type* type, int index)
       this->write_string(nt->named_object()->name());
       this->write_c_string("\" ");
 
+      if (!nt->in_heap())
+       this->write_c_string("notinheap ");
+
       if (nt->is_alias())
        this->write_c_string("= ");
     }
index c6c1178bc2484f74a52cdf6cdd50bd85030066a5..f671416a42319956dd44644d8259ca5185801627 100644 (file)
@@ -1049,6 +1049,13 @@ Import::read_named_type(int index)
       this->require_c_string(" ");
     }
 
+  bool in_heap = true;
+  if (this->match_c_string("notinheap"))
+    {
+      this->require_c_string("notinheap ");
+      in_heap = false;
+    }
+
   bool is_alias = false;
   if (this->match_c_string("= "))
     {
@@ -1102,7 +1109,14 @@ Import::read_named_type(int index)
   // declaration of a type defined in some other file.
   Type* type;
   if (this->match_c_string(">") || this->match_c_string("\n"))
-    type = this->types_[index];
+    {
+      type = this->types_[index];
+      if (!in_heap)
+       go_error_at(this->location_,
+                   ("import error at %d for type index %d: "
+                    "forward declaration marked notinheap"),
+                   this->pos(), index);
+    }
   else
     {
       if (no->is_type_declaration())
@@ -1117,6 +1131,8 @@ Import::read_named_type(int index)
          // This type has not yet been imported.
          ntype->clear_is_visible();
 
+         if (!in_heap)
+           ntype->set_not_in_heap();
          if (is_alias)
            ntype->set_is_alias();
 
index eb9c766b742bac745c724a8c4484eba9177417b2..f3bcf2eabd47d5def30161b1bf703b5bd4e96989 100644 (file)
@@ -6048,7 +6048,7 @@ Struct_type::do_hash_might_panic()
 // Return whether this struct type is permitted to be in the heap.
 
 bool
-Struct_type::do_in_heap()
+Struct_type::do_in_heap() const
 {
   const Struct_field_list* fields = this->fields_;
   if (fields == NULL)
index ccd12686d41293f259454ee251d994f5713f160d..9ac851699d26f0497503f8b480f7c842c7966f04 100644 (file)
@@ -667,7 +667,7 @@ class Type
 
   // Whether the type is permitted in the heap.
   bool
-  in_heap()
+  in_heap() const
   { return this->do_in_heap(); }
 
   // Return a hash code for this type for the method hash table.
@@ -1120,7 +1120,7 @@ class Type
   { return false; }
 
   virtual bool
-  do_in_heap()
+  do_in_heap() const
   { return true; }
 
   virtual unsigned int
@@ -2660,7 +2660,7 @@ class Struct_type : public Type
   do_hash_might_panic();
 
   bool
-  do_in_heap();
+  do_in_heap() const;
 
   unsigned int
   do_hash_for_method(Gogo*, int) const;
@@ -2842,7 +2842,7 @@ class Array_type : public Type
   { return this->length_ != NULL && this->element_type_->hash_might_panic(); }
 
   bool
-  do_in_heap()
+  do_in_heap() const
   { return this->length_ == NULL || this->element_type_->in_heap(); }
 
   unsigned int
@@ -3591,7 +3591,7 @@ class Named_type : public Type
   do_needs_key_update();
 
   bool
-  do_in_heap()
+  do_in_heap() const
   { return this->in_heap_ && this->type_->in_heap(); }
 
   unsigned int
@@ -3754,7 +3754,7 @@ class Forward_declaration_type : public Type
   { return this->real_type()->needs_key_update(); }
 
   bool
-  do_in_heap()
+  do_in_heap() const
   { return this->real_type()->in_heap(); }
 
   unsigned int
index e2ef33f7ae6d3b182ee7384619c73e214d660348..1b1d07d3f6ed57da2ccbc9edd570064f5be7d101 100644 (file)
@@ -517,6 +517,13 @@ func (p *parser) parseNamedType(nlist []interface{}) types.Type {
                p.errorf("%v has nil type", obj)
        }
 
+       if p.tok == scanner.Ident && p.lit == "notinheap" {
+               p.next()
+               // The go/types package has no way of recording that
+               // this type is marked notinheap. Presumably no user
+               // of this package actually cares.
+       }
+
        // type alias
        if p.tok == '=' {
                p.next()