compiler: delete lowered constant strings
authorIan Lance Taylor <iant@golang.org>
Tue, 4 Aug 2020 01:23:39 +0000 (18:23 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 4 Aug 2020 17:21:37 +0000 (10:21 -0700)
If we lower a constant string operation in a Binary_expression,
delete the strings.  This is safe because constant strings are always
newly allocated.

This is a hack to use much less memory when compiling the new
time/tzdata package, which has a file that contains the sum of over
13,000 constant strings.  We don't do this for numeric expressions
because that could cause us to delete an Iota_expression.

We should have a cleaner approach to memory usage some day.

Fixes PR go/96450

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index 0bc8e1b5a59a9b861f44a0ce529764103c65b214..c21b6000229fa9592afbb1e73e84ee0e6acba173 100644 (file)
@@ -1,4 +1,4 @@
-7f0d3834ac40cf3bcbeb9b13926ab5ccb2523537
+f45afedf90ac9af8f03d7d4515e952cbd724953a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 90f860bd7353a19b490795e44375a27c2ebc2687..7e7fb8c7313562f65f6006557063f93a0159799b 100644 (file)
@@ -556,7 +556,10 @@ Expression::get_backend(Translate_context* context)
 {
   // The child may have marked this expression as having an error.
   if (this->classification_ == EXPRESSION_ERROR)
-    return context->backend()->error_expression();
+    {
+      go_assert(saw_errors());
+      return context->backend()->error_expression();
+    }
 
   return this->do_get_backend(context);
 }
@@ -6080,6 +6083,8 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
               Type* result_type = (left->type()->named_type() != NULL
                                    ? left->type()
                                    : right->type());
+             delete left;
+             delete right;
               return Expression::make_string_typed(left_string + right_string,
                                                    result_type, location);
             }
@@ -6087,6 +6092,8 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
            {
              int cmp = left_string.compare(right_string);
              bool r = Binary_expression::cmp_to_bool(op, cmp);
+             delete left;
+             delete right;
              return Expression::make_boolean(r, location);
            }
        }