compiler: use more accurate array type in Gogo::register_gc_vars
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 30 Dec 2016 07:08:00 +0000 (07:08 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 30 Dec 2016 07:08:00 +0000 (07:08 +0000)
    The length of the roots array in Gogo::register_gc_vars was being
    computed incorrectly, potentially leading to type clashes in the back
    end. Compute an accurate length for this array ahead of time.

    Reviewed-on: https://go-review.googlesource.com/34624

From-SVN: r243974

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/gogo.cc

index b9c62808b6745dd9c46b4078e169a88041ec7078..9392c940d99919f1b3d271187b2317bcdbddb494 100644 (file)
@@ -1,4 +1,4 @@
-9a89f32811e6b3a29e22dda46e9c23811f562876
+d9be5f5d7907cbc169424fe2b8532cc3919cad5b
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 51de428394699c2a64c485e02b72105ab56cbafd..ff82f11948f3f6f31a5eaf3d7d79477278a50949 100644 (file)
@@ -740,9 +740,9 @@ Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
                                                           "__size", uint_type);
 
   Location builtin_loc = Linemap::predeclared_location();
-  Expression* length = Expression::make_integer_ul(var_gc.size(), NULL,
-                                                  builtin_loc);
-
+  unsigned roots_len = var_gc.size() + this->gc_roots_.size() + 1;
+  Expression* length = Expression::make_integer_ul(roots_len, NULL,
+                                                   builtin_loc);
   Array_type* root_array_type = Type::make_array_type(root_type, length);
   Type* ptdt = Type::make_type_descriptor_ptr_type();
   Struct_type* root_list_type =