Skip to content

Commit

Permalink
compiler: Avoid knock-on errors with impossibly large types.
Browse files Browse the repository at this point in the history
    
    The gofrontend asks the backend compiler for the architecture
    appropriate size of a given type.  For array types, it is possible
    to construct a type too large to fit on the machine.  This patch does
    two things: 1. When an impossibly large type is encountered, we mark
    the type as erroneous and later calls to discover the size of that
    type are short-circuited. 2. When generating the GC symbol data for
    an impossibly large array of arrays, we avoid generating symbol data
    as soon as we find an array that is too large to be expressed.
    
    Fixes golang/go#12938.
    
    Reviewed-on: https://go-review.googlesource.com/16234

From-SVN: r232855
  • Loading branch information
Ian Lance Taylor committed Jan 26, 2016
1 parent 8dfdb41 commit a54d45c
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 3 deletions.
2 changes: 1 addition & 1 deletion gcc/go/gofrontend/MERGE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
c375f3bf470f94220149b486c947bb3eb57cde7d
731941c155214d6158fa800e52ab3225c0b55f73

The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
6 changes: 4 additions & 2 deletions gcc/go/gofrontend/types.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2550,6 +2550,8 @@ Type::backend_type_size(Gogo* gogo, int64_t *psize)
{
if (!this->is_backend_type_size_known(gogo))
return false;
if (this->is_error_type())
return false;
Btype* bt = this->get_backend_placeholder(gogo);
*psize = gogo->backend()->type_size(bt);
if (*psize == -1)
Expand Down Expand Up @@ -6453,7 +6455,7 @@ Array_type::slice_gc_symbol(Gogo* gogo, Expression_list** vals,
(*vals)->push_back(Expression::make_integer_ul(opval, uintptr_type, bloc));
(*vals)->push_back(*offset);

if (element_size != 0)
if (element_size != 0 && ok)
(*vals)->push_back(Expression::make_gc_symbol(element_type));
this->advance_gc_offset(offset);
}
Expand Down Expand Up @@ -6488,7 +6490,7 @@ Array_type::array_gc_symbol(Gogo* gogo, Expression_list** vals,
Type* element_type = this->element_type();
if (bound < 1 || !element_type->has_pointer())
this->advance_gc_offset(offset);
else if (bound == 1 || iwidth <= 4 * pwidth)
else if (ok && (bound == 1 || iwidth <= 4 * pwidth))
{
for (unsigned int i = 0; i < bound; ++i)
Type::gc_symbol(gogo, element_type, vals, offset, stack_size);
Expand Down

0 comments on commit a54d45c

Please sign in to comment.