summaryrefslogtreecommitdiff
path: root/gcc/varpool.c
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2016-07-15 14:01:23 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2016-07-15 14:01:23 +0300
commit3ef4678208cb06208343de776ad96de2db4de25c (patch)
tree652086436fa04743a73656233cc4b3f5c0a32a3a /gcc/varpool.c
parenta8e15f9074d70cf2b029e04f3f56ed64e5171556 (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.c22
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;