aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2008-07-16 23:38:15 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2008-07-16 21:38:15 +0000
commit7386e3ee260414735222ea6559f3bb94ecd011f9 (patch)
treee06ba8171841b599b4229f871ff4b5a27a61ccb2 /gcc
parentde498dd486218343a3db23354de14e6da81ada81 (diff)
downloadgcc-7386e3ee260414735222ea6559f3bb94ecd011f9.zip
gcc-7386e3ee260414735222ea6559f3bb94ecd011f9.tar.gz
gcc-7386e3ee260414735222ea6559f3bb94ecd011f9.tar.bz2
cgraph.h (varpool_empty_needed_queue): Declare.
* cgraph.h (varpool_empty_needed_queue): Declare. * cgraphunit.c (output_in_order): Mark all variables as needed; empty the queue. * varpool.c (varpool_assemble_node): Update debug queue. (varpool_assemble_pending_decls): Don't do it here. (varpool_empty_needed_queue): New function. From-SVN: r137903
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cgraph.h1
-rw-r--r--gcc/cgraphunit.c10
-rw-r--r--gcc/varpool.c35
4 files changed, 48 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b2d1547..322e47d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2008-07-16 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.h (varpool_empty_needed_queue): Declare.
+ * cgraphunit.c (output_in_order): Mark all variables as needed;
+ empty the queue.
+ * varpool.c (varpool_assemble_node): Update debug queue.
+ (varpool_assemble_pending_decls): Don't do it here.
+ (varpool_empty_needed_queue): New function.
+
2008-07-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* recog.c (peephole2_optimize): Fix formatting.
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 070bd77..b817f87 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -401,6 +401,7 @@ bool varpool_assemble_decl (struct varpool_node *node);
bool varpool_analyze_pending_decls (void);
void varpool_output_debug_info (void);
void varpool_remove_unreferenced_decls (void);
+void varpool_empty_needed_queue (void);
/* Walk all reachable static variables. */
#define FOR_EACH_STATIC_VARIABLE(node) \
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 2dcccc1..5994ad1 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -1291,6 +1291,16 @@ cgraph_output_in_order (void)
nodes[i].u.a = pa;
}
+ /* In toplevel reorder mode we output all statics; mark them as needed. */
+ for (i = 0; i < max; ++i)
+ {
+ if (nodes[i].kind == ORDER_VAR)
+ {
+ varpool_mark_needed_node (nodes[i].u.v);
+ }
+ }
+ varpool_empty_needed_queue ();
+
for (i = 0; i < max; ++i)
{
switch (nodes[i].kind)
diff --git a/gcc/varpool.c b/gcc/varpool.c
index 4149c1d..c2410f6 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -357,7 +357,13 @@ varpool_assemble_decl (struct varpool_node *node)
&& (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl)))
{
assemble_variable (decl, 0, 1, 0);
- return TREE_ASM_WRITTEN (decl);
+ if (TREE_ASM_WRITTEN (decl))
+ {
+ node->next_needed = varpool_assembled_nodes_queue;
+ varpool_assembled_nodes_queue = node;
+ node->finalized = 1;
+ return true;
+ }
}
return false;
@@ -423,12 +429,7 @@ varpool_assemble_pending_decls (void)
varpool_nodes_queue = varpool_nodes_queue->next_needed;
if (varpool_assemble_decl (node))
- {
- changed = true;
- node->next_needed = varpool_assembled_nodes_queue;
- varpool_assembled_nodes_queue = node;
- node->finalized = 1;
- }
+ changed = true;
else
node->next_needed = NULL;
}
@@ -438,6 +439,26 @@ varpool_assemble_pending_decls (void)
return changed;
}
+/* Remove all elements from the queue so we can re-use it for debug output. */
+void
+varpool_empty_needed_queue (void)
+{
+ /* EH might mark decls as needed during expansion. This should be safe since
+ we don't create references to new function, but it should not be used
+ elsewhere. */
+ varpool_analyze_pending_decls ();
+
+ while (varpool_nodes_queue)
+ {
+ struct varpool_node *node = varpool_nodes_queue;
+ varpool_nodes_queue = varpool_nodes_queue->next_needed;
+ node->next_needed = NULL;
+ }
+ /* varpool_nodes_queue is now empty, clear the pointer to the last element
+ in the queue. */
+ varpool_last_needed_node = NULL;
+}
+
/* Output all variables enqueued to be assembled. */
void
varpool_output_debug_info (void)