aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-12-14 20:41:30 -0800
committerIan Lance Taylor <iant@golang.org>2020-12-15 12:56:50 -0800
commit8a5b8fc719f5c5bd6bd732d95646193238343f39 (patch)
treeeddea22d69c0152b414957227fac616c3d41c6b0 /gcc
parentf23753c710d54fdf6f6c6cbe93c5b0fdbf209fc8 (diff)
downloadgcc-8a5b8fc719f5c5bd6bd732d95646193238343f39.zip
gcc-8a5b8fc719f5c5bd6bd732d95646193238343f39.tar.gz
gcc-8a5b8fc719f5c5bd6bd732d95646193238343f39.tar.bz2
compiler: discard global sink variables with static initializers
This is specifically for the test fixedbugs/issue23781.go, which builds a large static array. The code does compile and work without this change, but it takes a long time and generates a large object file. Discarding the unnecessary static initializer makes this test much faster. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/278172
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/gogo.cc13
-rw-r--r--gcc/go/gofrontend/gogo.h17
-rw-r--r--gcc/go/gofrontend/parse.cc1
4 files changed, 31 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 1bada25..a596b24 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-8b913a1865e36d4bd105f29aa0b12264a4e03515
+85c390ec75c6c3f3fbfe08f6dac58585588c6211
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index e31a038..fbf8935 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -1558,6 +1558,17 @@ Gogo::write_globals()
|| (no->is_const() && no->const_value()->is_sink()))
continue;
+ // Skip global sink variables with static initializers. With
+ // non-static initializers we have to evaluate for side effects,
+ // and we wind up initializing a dummy variable. That is not
+ // ideal but it works and it's a rare case.
+ if (no->is_variable()
+ && no->var_value()->is_global_sink()
+ && !no->var_value()->has_pre_init()
+ && (no->var_value()->init() == NULL
+ || no->var_value()->init()->is_static_initializer()))
+ continue;
+
// There is nothing useful we can output for constants which
// have ideal or non-integral type.
if (no->is_const())
@@ -7447,7 +7458,7 @@ Variable::Variable(Type* type, Expression* init, bool is_global,
: type_(type), init_(init), preinit_(NULL), location_(location),
backend_(NULL), is_global_(is_global), is_parameter_(is_parameter),
is_closure_(false), is_receiver_(is_receiver),
- is_varargs_parameter_(false), is_used_(false),
+ is_varargs_parameter_(false), is_global_sink_(false), is_used_(false),
is_address_taken_(false), is_non_escaping_address_taken_(false),
seen_(false), init_is_lowered_(false), init_is_flattened_(false),
type_from_init_tuple_(false), type_from_range_index_(false),
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index 49d7bd9..bdb3166 100644
--- a/gcc/go/gofrontend/gogo.h
+++ b/gcc/go/gofrontend/gogo.h
@@ -2113,6 +2113,20 @@ class Variable
is_varargs_parameter() const
{ return this->is_varargs_parameter_; }
+ // Return whether this is a global sink variable, created only to
+ // run an initializer.
+ bool
+ is_global_sink() const
+ { return this->is_global_sink_; }
+
+ // Record that this is a global sink variable.
+ void
+ set_is_global_sink()
+ {
+ go_assert(this->is_global_);
+ this->is_global_sink_ = true;
+ }
+
// Whether this variable's address is taken.
bool
is_address_taken() const
@@ -2340,6 +2354,9 @@ class Variable
bool is_receiver_ : 1;
// Whether this is the varargs parameter of a function.
bool is_varargs_parameter_ : 1;
+ // Whether this is a global sink variable created to run an
+ // initializer.
+ bool is_global_sink_ : 1;
// Whether this variable is ever referenced.
bool is_used_ : 1;
// Whether something takes the address of this variable. For a
diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc
index a4740cf..3b2e5a7 100644
--- a/gcc/go/gofrontend/parse.cc
+++ b/gcc/go/gofrontend/parse.cc
@@ -2075,6 +2075,7 @@ Parse::create_dummy_global(Type* type, Expression* init,
if (type == NULL && init == NULL)
type = Type::lookup_bool_type();
Variable* var = new Variable(type, init, true, false, false, location);
+ var->set_is_global_sink();
static int count;
char buf[30];
snprintf(buf, sizeof buf, "_.%d", count);