diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2016-07-15 14:01:23 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2016-07-15 14:01:23 +0300 |
commit | 3ef4678208cb06208343de776ad96de2db4de25c (patch) | |
tree | 652086436fa04743a73656233cc4b3f5c0a32a3a /gcc/varpool.c | |
parent | a8e15f9074d70cf2b029e04f3f56ed64e5171556 (diff) |
handle undefined extern vars in output_in_order
* cgraphunit.c (cgraph_order_sort_kind): New entry ORDER_VAR_UNDEF.
(output_in_order): Loop over undefined variables too. Output them
via assemble_undefined_decl. Skip variables that correspond to hard
registers or have value-exprs.
* varpool.c (symbol_table::output_variables): Handle undefined
variables together with defined ones.
From-SVN: r238371
Diffstat (limited to 'gcc/varpool.c')
-rw-r--r-- | gcc/varpool.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/gcc/varpool.c b/gcc/varpool.c index ab615fa33fc..e5f991eb759 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -733,11 +733,6 @@ symbol_table::output_variables (void) timevar_push (TV_VAROUT); - FOR_EACH_VARIABLE (node) - if (!node->definition - && !DECL_HAS_VALUE_EXPR_P (node->decl) - && !DECL_HARD_REGISTER (node->decl)) - assemble_undefined_decl (node->decl); FOR_EACH_DEFINED_VARIABLE (node) { /* Handled in output_in_order. */ @@ -747,20 +742,19 @@ symbol_table::output_variables (void) node->finalize_named_section_flags (); } - FOR_EACH_DEFINED_VARIABLE (node) + /* There is a similar loop in output_in_order. Please keep them in sync. */ + FOR_EACH_VARIABLE (node) { /* Handled in output_in_order. */ if (node->no_reorder) continue; -#ifdef ACCEL_COMPILER - /* Do not assemble "omp declare target link" vars. */ - if (DECL_HAS_VALUE_EXPR_P (node->decl) - && lookup_attribute ("omp declare target link", - DECL_ATTRIBUTES (node->decl))) + if (DECL_HARD_REGISTER (node->decl) + || DECL_HAS_VALUE_EXPR_P (node->decl)) continue; -#endif - if (node->assemble_decl ()) - changed = true; + if (node->definition) + changed |= node->assemble_decl (); + else + assemble_undefined_decl (node->decl); } timevar_pop (TV_VAROUT); return changed; |