]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: Avoid knock-on errors with impossibly large types.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 26 Jan 2016 22:35:20 +0000 (22:35 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 26 Jan 2016 22:35:20 +0000 (22:35 +0000)
    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

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

index b4c90ef8892fae5b0931099b37967b5707c18ef1..9540d16b4c81c7d5e742b62cf84a769385d5c779 100644 (file)
@@ -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.
index 802a17dc0e381aa41ad562058f35d5db3793c27d..52a1e4da886f7a1e389888363f9a3bdae741fcf2 100644 (file)
@@ -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)
@@ -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);
 }
@@ -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);