aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-10-26 16:48:03 -0700
committerIan Lance Taylor <iant@golang.org>2020-10-27 11:03:11 -0700
commitb7ac5fdbe7352bd33f6e9f8629d1140f278060cb (patch)
treed3b27f28217b8c585d29e0eb4ddb148faa6da911 /gcc/go
parent6f33e2d8427f347ed265e1c0e11523a650e465a6 (diff)
downloadgcc-b7ac5fdbe7352bd33f6e9f8629d1140f278060cb.zip
gcc-b7ac5fdbe7352bd33f6e9f8629d1140f278060cb.tar.gz
gcc-b7ac5fdbe7352bd33f6e9f8629d1140f278060cb.tar.bz2
compiler, go/internal/gccgoimporter: export notinheap annotation
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
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/export.cc3
-rw-r--r--gcc/go/gofrontend/import.cc18
-rw-r--r--gcc/go/gofrontend/types.cc2
-rw-r--r--gcc/go/gofrontend/types.h12
5 files changed, 28 insertions, 9 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 6caece3..7d06595 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -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.
diff --git a/gcc/go/gofrontend/export.cc b/gcc/go/gofrontend/export.cc
index 277aa74..90a5f6d 100644
--- a/gcc/go/gofrontend/export.cc
+++ b/gcc/go/gofrontend/export.cc
@@ -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("= ");
}
diff --git a/gcc/go/gofrontend/import.cc b/gcc/go/gofrontend/import.cc
index c6c1178..f671416 100644
--- a/gcc/go/gofrontend/import.cc
+++ b/gcc/go/gofrontend/import.cc
@@ -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();
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index eb9c766..f3bcf2e 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -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)
diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h
index ccd1268..9ac8516 100644
--- a/gcc/go/gofrontend/types.h
+++ b/gcc/go/gofrontend/types.h
@@ -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