94 lines
3.1 KiB
Diff
94 lines
3.1 KiB
Diff
|
2006-10-18 Jan Hubicka <jh@suse.cz>
|
||
|
|
||
|
PR middle-end/29299
|
||
|
* cfgexpand.c (expand_used_vars_for_block): Vars marked used by user
|
||
|
are used.
|
||
|
|
||
|
2006-10-15 Jan Hubicka <jh@suse.cz>
|
||
|
Richard Guenther <rguenther@suse.de>
|
||
|
|
||
|
PR middle-end/29299
|
||
|
* cgraphunit.c (cgraph_finalize_compilation_unit): Call
|
||
|
process_function_and_variable_attributes on all variables, including
|
||
|
those discovered during cgraph construction phase.
|
||
|
|
||
|
* gcc.dg/pr29299.c: New testcase.
|
||
|
|
||
|
--- gcc/cgraphunit.c (revision 117745)
|
||
|
+++ gcc/cgraphunit.c (revision 117863)
|
||
|
@@ -1055,6 +1055,7 @@ cgraph_finalize_compilation_unit (void)
|
||
|
/* Keep track of already processed nodes when called multiple times for
|
||
|
intermodule optimization. */
|
||
|
static struct cgraph_node *first_analyzed;
|
||
|
+ struct cgraph_node *first_processed = first_analyzed;
|
||
|
static struct cgraph_varpool_node *first_analyzed_var;
|
||
|
|
||
|
if (errorcount || sorrycount)
|
||
|
@@ -1077,7 +1078,10 @@ cgraph_finalize_compilation_unit (void)
|
||
|
}
|
||
|
|
||
|
timevar_push (TV_CGRAPH);
|
||
|
- process_function_and_variable_attributes (first_analyzed, first_analyzed_var);
|
||
|
+ process_function_and_variable_attributes (first_processed,
|
||
|
+ first_analyzed_var);
|
||
|
+ first_processed = cgraph_nodes;
|
||
|
+ first_analyzed_var = cgraph_varpool_nodes;
|
||
|
cgraph_varpool_analyze_pending_decls ();
|
||
|
if (cgraph_dump_file)
|
||
|
{
|
||
|
@@ -1119,11 +1123,16 @@ cgraph_finalize_compilation_unit (void)
|
||
|
if (!edge->callee->reachable)
|
||
|
cgraph_mark_reachable_node (edge->callee);
|
||
|
|
||
|
+ /* We finalize local static variables during constructing callgraph
|
||
|
+ edges. Process their attributes too. */
|
||
|
+ process_function_and_variable_attributes (first_processed,
|
||
|
+ first_analyzed_var);
|
||
|
+ first_processed = cgraph_nodes;
|
||
|
+ first_analyzed_var = cgraph_varpool_nodes;
|
||
|
cgraph_varpool_analyze_pending_decls ();
|
||
|
}
|
||
|
|
||
|
/* Collect entry points to the unit. */
|
||
|
-
|
||
|
if (cgraph_dump_file)
|
||
|
{
|
||
|
fprintf (cgraph_dump_file, "Unit entry points:");
|
||
|
@@ -1163,7 +1172,6 @@ cgraph_finalize_compilation_unit (void)
|
||
|
dump_cgraph (cgraph_dump_file);
|
||
|
}
|
||
|
first_analyzed = cgraph_nodes;
|
||
|
- first_analyzed_var = cgraph_varpool_nodes;
|
||
|
ggc_collect ();
|
||
|
timevar_pop (TV_CGRAPH);
|
||
|
}
|
||
|
--- gcc/cfgexpand.c (revision 117745)
|
||
|
+++ gcc/cfgexpand.c (revision 117863)
|
||
|
@@ -764,7 +764,12 @@ expand_used_vars_for_block (tree block,
|
||
|
|
||
|
/* Expand all variables at this level. */
|
||
|
for (t = BLOCK_VARS (block); t ; t = TREE_CHAIN (t))
|
||
|
- if (TREE_USED (t))
|
||
|
+ if (TREE_USED (t)
|
||
|
+ /* Force local static variables to be output when marked by
|
||
|
+ used attribute. For unit-at-a-time, cgraph code already takes
|
||
|
+ care of this. */
|
||
|
+ || (!flag_unit_at_a_time && TREE_STATIC (t)
|
||
|
+ && DECL_PRESERVE_P (t)))
|
||
|
expand_one_var (t, toplevel);
|
||
|
|
||
|
this_sv_num = stack_vars_num;
|
||
|
--- gcc/testsuite/gcc.dg/pr29299.c (revision 0)
|
||
|
+++ gcc/testsuite/gcc.dg/pr29299.c (revision 117863)
|
||
|
@@ -0,0 +1,10 @@
|
||
|
+/* { dg-do compile } */
|
||
|
+/* { dg-options "-O" } */
|
||
|
+
|
||
|
+static int bof __attribute__((used));
|
||
|
+int foo()
|
||
|
+{
|
||
|
+ static int barbarbarbar __attribute__((used));
|
||
|
+};
|
||
|
+
|
||
|
+/* { dg-final { scan-assembler "barbarbarbar" } } */
|