Commit 4161493a by Ian Lance Taylor

compiler: connect the concrete type and the placeholder for circular types

    
    Previously, when creating the backend representation of a
    circular type, we resolve the placeholder to a
    circular_pointer_type. The backend doesn't know what the
    concrete type is.
    
    This CL changes it to resolve the placeholder to the concrete
    type instead, so the backend may have better knowledge of the
    concrete type.
    
    Reviewed-on: https://go-review.googlesource.com/123738

From-SVN: r262830
parent 5485812c
db991403fc97854201b3f40492f4f6b9d471cabc
d6338c94e5574b63469c740159d064e89c6718bf
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -10786,15 +10786,10 @@ Named_type::do_get_backend(Gogo* gogo)
// Don't build a circular data structure. GENERIC can't handle
// it.
if (this->seen_in_get_backend_)
{
this->is_circular_ = true;
return gogo->backend()->circular_pointer_type(bt, true);
}
return gogo->backend()->circular_pointer_type(bt, true);
this->seen_in_get_backend_ = true;
bt1 = Type::get_named_base_btype(gogo, base);
this->seen_in_get_backend_ = false;
if (this->is_circular_)
bt1 = gogo->backend()->circular_pointer_type(bt, true);
if (!gogo->backend()->set_placeholder_pointer_type(bt, bt1))
bt = gogo->backend()->error_type();
return bt;
......@@ -10803,15 +10798,10 @@ Named_type::do_get_backend(Gogo* gogo)
// Don't build a circular data structure. GENERIC can't handle
// it.
if (this->seen_in_get_backend_)
{
this->is_circular_ = true;
return gogo->backend()->circular_pointer_type(bt, false);
}
return gogo->backend()->circular_pointer_type(bt, false);
this->seen_in_get_backend_ = true;
bt1 = Type::get_named_base_btype(gogo, base);
this->seen_in_get_backend_ = false;
if (this->is_circular_)
bt1 = gogo->backend()->circular_pointer_type(bt, false);
if (!gogo->backend()->set_placeholder_pointer_type(bt, bt1))
bt = gogo->backend()->error_type();
return bt;
......
......@@ -3243,8 +3243,8 @@ class Named_type : public Type
interface_method_tables_(NULL), pointer_interface_method_tables_(NULL),
location_(location), named_btype_(NULL), dependencies_(),
is_alias_(false), is_visible_(true), is_error_(false), in_heap_(true),
is_placeholder_(false), is_converted_(false), is_circular_(false),
is_verified_(false), seen_(false), seen_in_compare_is_identity_(false),
is_placeholder_(false), is_converted_(false), is_verified_(false),
seen_(false), seen_in_compare_is_identity_(false),
seen_in_get_backend_(false), seen_alias_(false)
{ }
......@@ -3345,12 +3345,6 @@ class Named_type : public Type
is_valid() const
{ return !this->is_error_; }
// Whether this is a circular type: a pointer or function type that
// refers to itself, which is not possible in C.
bool
is_circular() const
{ return this->is_circular_; }
// Return the base type for this type.
Type*
named_base();
......@@ -3557,9 +3551,6 @@ class Named_type : public Type
// Whether this type has been converted to the backend
// representation. Implies that is_placeholder_ is false.
bool is_converted_;
// Whether this is a pointer or function type which refers to the
// type itself.
bool is_circular_;
// Whether this type has been verified.
bool is_verified_;
// In a recursive operation such as has_pointer, this flag is used
......
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