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
This commit is contained in:
parent
a8e15f9074
commit
3ef4678208
|
@ -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>
|
2016-07-15 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
* tree-ssa-pre.c (get_representative_for): Make sure to return
|
* tree-ssa-pre.c (get_representative_for): Make sure to return
|
||||||
|
|
|
@ -2141,6 +2141,7 @@ enum cgraph_order_sort_kind
|
||||||
ORDER_UNDEFINED = 0,
|
ORDER_UNDEFINED = 0,
|
||||||
ORDER_FUNCTION,
|
ORDER_FUNCTION,
|
||||||
ORDER_VAR,
|
ORDER_VAR,
|
||||||
|
ORDER_VAR_UNDEF,
|
||||||
ORDER_ASM
|
ORDER_ASM
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2187,14 +2188,18 @@ output_in_order (bool no_reorder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_EACH_DEFINED_VARIABLE (pv)
|
/* There is a similar loop in symbol_table::output_variables.
|
||||||
if (!DECL_EXTERNAL (pv->decl))
|
Please keep them in sync. */
|
||||||
|
FOR_EACH_VARIABLE (pv)
|
||||||
{
|
{
|
||||||
if (no_reorder && !pv->no_reorder)
|
if (no_reorder && !pv->no_reorder)
|
||||||
continue;
|
continue;
|
||||||
|
if (DECL_HARD_REGISTER (pv->decl)
|
||||||
|
|| DECL_HAS_VALUE_EXPR_P (pv->decl))
|
||||||
|
continue;
|
||||||
i = pv->order;
|
i = pv->order;
|
||||||
gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
|
gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
|
||||||
nodes[i].kind = ORDER_VAR;
|
nodes[i].kind = pv->definition ? ORDER_VAR : ORDER_VAR_UNDEF;
|
||||||
nodes[i].u.v = pv;
|
nodes[i].u.v = pv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2222,16 +2227,13 @@ output_in_order (bool no_reorder)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ORDER_VAR:
|
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 ();
|
nodes[i].u.v->assemble_decl ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ORDER_VAR_UNDEF:
|
||||||
|
assemble_undefined_decl (nodes[i].u.v->decl);
|
||||||
|
break;
|
||||||
|
|
||||||
case ORDER_ASM:
|
case ORDER_ASM:
|
||||||
assemble_asm (nodes[i].u.a->asm_str);
|
assemble_asm (nodes[i].u.a->asm_str);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -733,11 +733,6 @@ symbol_table::output_variables (void)
|
||||||
|
|
||||||
timevar_push (TV_VAROUT);
|
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)
|
FOR_EACH_DEFINED_VARIABLE (node)
|
||||||
{
|
{
|
||||||
/* Handled in output_in_order. */
|
/* Handled in output_in_order. */
|
||||||
|
@ -747,20 +742,19 @@ symbol_table::output_variables (void)
|
||||||
node->finalize_named_section_flags ();
|
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. */
|
/* Handled in output_in_order. */
|
||||||
if (node->no_reorder)
|
if (node->no_reorder)
|
||||||
continue;
|
continue;
|
||||||
#ifdef ACCEL_COMPILER
|
if (DECL_HARD_REGISTER (node->decl)
|
||||||
/* Do not assemble "omp declare target link" vars. */
|
|| DECL_HAS_VALUE_EXPR_P (node->decl))
|
||||||
if (DECL_HAS_VALUE_EXPR_P (node->decl)
|
|
||||||
&& lookup_attribute ("omp declare target link",
|
|
||||||
DECL_ATTRIBUTES (node->decl)))
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
if (node->definition)
|
||||||
if (node->assemble_decl ())
|
changed |= node->assemble_decl ();
|
||||||
changed = true;
|
else
|
||||||
|
assemble_undefined_decl (node->decl);
|
||||||
}
|
}
|
||||||
timevar_pop (TV_VAROUT);
|
timevar_pop (TV_VAROUT);
|
||||||
return changed;
|
return changed;
|
||||||
|
|
Loading…
Reference in New Issue