summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-15 11:01:23 +0000
committeramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-15 11:01:23 +0000
commit511b1ef245a08c367f860844770244683ae94d1b (patch)
tree652086436fa04743a73656233cc4b3f5c0a32a3a
parentf3dce1cdd016e16cf9dc051d127bdf6eb58430fc (diff)
downloadgcc-511b1ef245a08c367f860844770244683ae94d1b.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238371 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cgraphunit.c36
-rw-r--r--gcc/varpool.c22
3 files changed, 36 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7e04fe94814..e2c0598d43d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2016-07-15 Alexander Monakov <amonakov@ispras.ru>
+
+ * 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.
+
2016-07-15 Richard Biener <rguenther@suse.de>
* tree-ssa-pre.c (get_representative_for): Make sure to return
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 4bfcad78f59..e30fe6e423b 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2141,6 +2141,7 @@ enum cgraph_order_sort_kind
ORDER_UNDEFINED = 0,
ORDER_FUNCTION,
ORDER_VAR,
+ ORDER_VAR_UNDEF,
ORDER_ASM
};
@@ -2187,16 +2188,20 @@ output_in_order (bool no_reorder)
}
}
- FOR_EACH_DEFINED_VARIABLE (pv)
- if (!DECL_EXTERNAL (pv->decl))
- {
- if (no_reorder && !pv->no_reorder)
- continue;
- i = pv->order;
- gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
- nodes[i].kind = ORDER_VAR;
- nodes[i].u.v = pv;
- }
+ /* There is a similar loop in symbol_table::output_variables.
+ Please keep them in sync. */
+ FOR_EACH_VARIABLE (pv)
+ {
+ if (no_reorder && !pv->no_reorder)
+ continue;
+ if (DECL_HARD_REGISTER (pv->decl)
+ || DECL_HAS_VALUE_EXPR_P (pv->decl))
+ continue;
+ i = pv->order;
+ gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
+ nodes[i].kind = pv->definition ? ORDER_VAR : ORDER_VAR_UNDEF;
+ nodes[i].u.v = pv;
+ }
for (pa = symtab->first_asm_symbol (); pa; pa = pa->next)
{
@@ -2222,16 +2227,13 @@ output_in_order (bool no_reorder)
break;
case ORDER_VAR:
-#ifdef ACCEL_COMPILER
- /* Do not assemble "omp declare target link" vars. */
- if (DECL_HAS_VALUE_EXPR_P (nodes[i].u.v->decl)
- && lookup_attribute ("omp declare target link",
- DECL_ATTRIBUTES (nodes[i].u.v->decl)))
- break;
-#endif
nodes[i].u.v->assemble_decl ();
break;
+ case ORDER_VAR_UNDEF:
+ assemble_undefined_decl (nodes[i].u.v->decl);
+ break;
+
case ORDER_ASM:
assemble_asm (nodes[i].u.a->asm_str);
break;
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;