diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-12-11 08:07:52 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-12-11 08:07:52 +0000 |
commit | 1d416bd7b7ab86376036f2fc7199b7e7667bd0b1 (patch) | |
tree | d172f85045dead90ab3d5c93716d8db81074fdec /gcc/cgraphunit.c | |
parent | 596e8f4022cb1ac97c5d4ce7b738c9f51653a778 (diff) | |
download | gcc-1d416bd7b7ab86376036f2fc7199b7e7667bd0b1.tar.gz |
Move all varpool routines out of cgraph/cgraphunit to varpool.c
* cgraph.c: Update comments.
(cgraph_varpool_hash,
cgraph_varpool_nodes, cgraph_varpool_last_needed_node
cgraph_varpool_node_name, cgraph_varpool_node,
cgraph_varpol_mode_for_asm, cgraph_varpool_mark_needed_node,
cgraph_variable_initializer_availability): Move to
varpool.c and drop cgraph_ prefixes.
(cgraph_varpool_enqueue_needed_node, cgraph_varpool_reset_queue,
cgraph_varpool_first_unanalyzed_node, cgraph_varpool_finalize_decl):
move to varpool.c; drop cgraph_ prefix; make static.
(dump_cgraph_varpool_node): Move to varpool.c under name
dump_varpool_node.
(dump_varpool, hash_varpool_node, eq_varpool_node,
decide_is_variable_needed): Move to varpool.c
(decl_assembler_name_equal): Move to tree.c.
(availability_names): Rename to ...
(cgraph_availability_names): ... this one.
(dump_cgraph_node): Update.
* cgraph.h: Reorder declarations now in varpool.c
(cgraph_vailablity_names): Declare.
(struct cgraph_varpool_node): Rename to ...
(struct varpool_node): ... this one.
(cgraph_varpool_first_unanalyzed_node, cgraph_varpool_nodes_queue,
cgraph_varpool_first_unanalyzed_node, cgraph_varpool_node,
cgraph_varpool_node_for_asm, cgraph_varpool_mark_needed_node,
cgraph_varpool_finalize_decl, cgraph_varpool_enqueue_needed_node,
cgraph_varpool_reset_queue, cgraph_varpool_assemble_pending_decls,
cgraph_variable_initializer_availability): Rename to ...
(varpool_first_unanalyzed_node, varpool_nodes_queue,
varpool_first_unanalyzed_node, varpool_node,
varpool_node_for_asm, varpool_mark_needed_node,
varpool_finalize_decl, varpool_enqueue_needed_node,
varpool_assemble_pending_decls, variable_initializer_availability):
Rename to ...
* tree.c (decl_assembler_name_equal): Move here from cgraph.c.
* tree.h (decl_assembler_name_equal): Declare.
* omp-low.c (lower_omp_critical): Update.
* ipa-reference (analyze_variable, static_execute): Likewise.
* toplev.c (wrapup_global_declaration_2, compile_file): Update.
* cgraphunit.c: Update comments.
(cgraph_varpool_assembled_nodes_queue): Move to varpool.c under name
varpool_assembled_nodes_queue.
(cgraph_varpool_analyze_pending_decls): Move to varpool.c under name
varpool_analyze_pending_decls.
(cgraph_varpool_remove_unreferenced_decls): Move to varpool.c under name
varpool_remove_unreferenced_decls.
(record_reference): Update.
(cgraph_create_edges): Update.
(record_referneces_in_initializer): New function.
(cgraph_varpool_assemble_decl): Move to varpool.c under name
varpool_assemble_decl; make global.
(cgraph_varpool_assemble_pending_decls): Move to varpool.c under name
varpool_assemble_pending_decls.
(process_function_and_variable_attributes, cgraph_finalize_compilation_unit,
struct cgraph_order_sort, cgraph_output_in_order,
cgraph_function_and_variable_invisibility, cgraph_optimize,
cgraph_increase_alignment): Update.
* dwarf2out.c (decls_for_scope): Likewise.
* ipa-type-escape.c (analyze_variable, type_escape_execute): Likewise.
* except.c (output_ttype): Likewise.
* varasm.c (mark_decl_referenced): Likewise.
(find_decl_and_mark_referenced, assemble_alias): update.
* Makefile.in: Add varpool.c, gt-varpool.c and remove gt-cgraphunit.c
* passes.c (rest_of_decl_compilation): Update.
* cp/decl2.c (var_finalized_p): Update for renamed varpool functions.
* fortran/f59-lang.c (gfc_expand_function): Update for renamed varpool functions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119731 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r-- | gcc/cgraphunit.c | 228 |
1 files changed, 42 insertions, 186 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 26399d368c9..73015b6f29b 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -35,7 +35,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA (There is one exception needed for implementing GCC extern inline function.) - - cgraph_varpool_finalize_variable + - varpool_finalize_variable This function has same behavior as the above but is used for static variables. @@ -60,7 +60,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA modify calling conventions, do better inlining or similar optimizations. - cgraph_mark_needed_node - - cgraph_varpool_mark_needed_node + - varpool_mark_needed_node When function or variable is referenced by some hidden way the call-graph data structure must be updated accordingly by this function. @@ -82,8 +82,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA This function is used to expand function and pass it into RTL back-end. Front-end should not make any assumptions about when this function can be called. In particular cgraph_assemble_pending_functions, - cgraph_varpool_assemble_pending_variables, cgraph_finalize_function, - cgraph_varpool_finalize_function, cgraph_optimize can cause arbitrarily + varpool_assemble_pending_variables, cgraph_finalize_function, + varpool_finalize_function, cgraph_optimize can cause arbitrarily previously finalized functions to be expanded. We implement two compilation modes. @@ -168,9 +168,6 @@ static tree record_reference (tree *, int *, void *); static void cgraph_output_pending_asms (void); static void cgraph_increase_alignment (void); -/* Lists all assembled variables to be sent to debugger output later on. */ -static GTY(()) struct cgraph_varpool_node *cgraph_varpool_assembled_nodes_queue; - /* Records tree nodes seen in record_reference. Simply using walk_tree_without_duplicates doesn't guarantee each node is visited once because it gets a new htab upon each recursive call from @@ -265,83 +262,6 @@ decide_is_function_needed (struct cgraph_node *node, tree decl) return false; } -/* Walk the decls we marked as necessary and see if they reference new - variables or functions and add them into the worklists. */ -static bool -cgraph_varpool_analyze_pending_decls (void) -{ - bool changed = false; - timevar_push (TV_CGRAPH); - - while (cgraph_varpool_first_unanalyzed_node) - { - tree decl = cgraph_varpool_first_unanalyzed_node->decl; - - cgraph_varpool_first_unanalyzed_node->analyzed = true; - - cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed; - - /* Compute the alignment early so function body expanders are - already informed about increased alignment. */ - align_variable (decl, 0); - - if (DECL_INITIAL (decl)) - { - visited_nodes = pointer_set_create (); - walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes); - pointer_set_destroy (visited_nodes); - visited_nodes = NULL; - } - changed = true; - } - timevar_pop (TV_CGRAPH); - return changed; -} - -/* Optimization of function bodies might've rendered some variables as - unnecessary so we want to avoid these from being compiled. - - This is done by pruning the queue and keeping only the variables that - really appear needed (ie they are either externally visible or referenced - by compiled function). Re-doing the reachability analysis on variables - brings back the remaining variables referenced by these. */ -static void -cgraph_varpool_remove_unreferenced_decls (void) -{ - struct cgraph_varpool_node *next, *node = cgraph_varpool_nodes_queue; - - cgraph_varpool_reset_queue (); - - if (errorcount || sorrycount) - return; - - while (node) - { - tree decl = node->decl; - next = node->next_needed; - node->needed = 0; - - if (node->finalized - && ((DECL_ASSEMBLER_NAME_SET_P (decl) - && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) - || node->force_output - || decide_is_variable_needed (node, decl) - /* ??? Cgraph does not yet rule the world with an iron hand, - and does not control the emission of debug information. - After a variable has its DECL_RTL set, we must assume that - it may be referenced by the debug information, and we can - no longer elide it. */ - || DECL_RTL_SET_P (decl))) - cgraph_varpool_mark_needed_node (node); - - node = next; - } - /* Make sure we mark alias targets as used targets. */ - finish_aliases_1 (); - cgraph_varpool_analyze_pending_decls (); -} - - /* When not doing unit-at-a-time, output all functions enqueued. Return true when such a functions were found. */ @@ -521,7 +441,7 @@ record_reference (tree *tp, int *walk_subtrees, void *data) after rtl has been generated. */ if (TREE_STATIC (t) || DECL_EXTERNAL (t)) { - cgraph_varpool_mark_needed_node (cgraph_varpool_node (t)); + varpool_mark_needed_node (varpool_node (t)); if (lang_hooks.callgraph.analyze_expr) return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, data); @@ -602,7 +522,7 @@ cgraph_create_edges (struct cgraph_node *node, tree body) if (TREE_CODE (decl) == VAR_DECL && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl)) && flag_unit_at_a_time) - cgraph_varpool_finalize_decl (decl); + varpool_finalize_decl (decl); else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl)) walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes); } @@ -611,6 +531,16 @@ cgraph_create_edges (struct cgraph_node *node, tree body) visited_nodes = NULL; } +void +record_references_in_initializer (tree decl) +{ + visited_nodes = pointer_set_create (); + walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes); + pointer_set_destroy (visited_nodes); + visited_nodes = NULL; +} + + /* Give initial reasons why inlining would fail. Those gets either NULLified or usually overwritten by more precise reason later. */ @@ -844,78 +774,6 @@ verify_cgraph (void) verify_cgraph_node (node); } -/* Output one variable, if necessary. Return whether we output it. */ -static bool -cgraph_varpool_assemble_decl (struct cgraph_varpool_node *node) -{ - tree decl = node->decl; - - if (!TREE_ASM_WRITTEN (decl) - && !node->alias - && !DECL_EXTERNAL (decl) - && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl))) - { - assemble_variable (decl, 0, 1, 0); - return TREE_ASM_WRITTEN (decl); - } - - return false; -} - -/* Output all variables enqueued to be assembled. */ -bool -cgraph_varpool_assemble_pending_decls (void) -{ - bool changed = false; - - if (errorcount || sorrycount) - return false; - - /* 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. */ - cgraph_varpool_analyze_pending_decls (); - - while (cgraph_varpool_nodes_queue) - { - struct cgraph_varpool_node *node = cgraph_varpool_nodes_queue; - - cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed; - if (cgraph_varpool_assemble_decl (node)) - { - changed = true; - node->next_needed = cgraph_varpool_assembled_nodes_queue; - cgraph_varpool_assembled_nodes_queue = node; - node->finalized = 1; - } - else - node->next_needed = NULL; - } - return changed; -} -/* Output all variables enqueued to be assembled. */ -static void -cgraph_varpool_output_debug_info (void) -{ - timevar_push (TV_SYMOUT); - if (errorcount == 0 && sorrycount == 0) - while (cgraph_varpool_assembled_nodes_queue) - { - struct cgraph_varpool_node *node = cgraph_varpool_assembled_nodes_queue; - - /* Local static variables are never seen by check_global_declarations - so we need to output debug info by hand. */ - if (DECL_CONTEXT (node->decl) - && (TREE_CODE (DECL_CONTEXT (node->decl)) == BLOCK - || TREE_CODE (DECL_CONTEXT (node->decl)) == FUNCTION_DECL) - && errorcount == 0 && sorrycount == 0) - (*debug_hooks->global_decl) (node->decl); - cgraph_varpool_assembled_nodes_queue = node->next_needed; - node->next_needed = 0; - } - timevar_pop (TV_SYMOUT); -} - /* Output all asm statements we have stored up to be output. */ static void @@ -990,10 +848,10 @@ cgraph_analyze_function (struct cgraph_node *node) static void process_function_and_variable_attributes (struct cgraph_node *first, - struct cgraph_varpool_node *first_var) + struct varpool_node *first_var) { struct cgraph_node *node; - struct cgraph_varpool_node *vnode; + struct varpool_node *vnode; for (node = cgraph_nodes; node != first; node = node->next) { @@ -1018,14 +876,14 @@ process_function_and_variable_attributes (struct cgraph_node *first, } } } - for (vnode = cgraph_varpool_nodes; vnode != first_var; vnode = vnode->next) + for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next) { tree decl = vnode->decl; if (lookup_attribute ("used", DECL_ATTRIBUTES (decl))) { mark_decl_referenced (decl); if (vnode->finalized) - cgraph_varpool_mark_needed_node (vnode); + varpool_mark_needed_node (vnode); } if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl))) { @@ -1036,7 +894,7 @@ process_function_and_variable_attributes (struct cgraph_node *first, else { if (vnode->finalized) - cgraph_varpool_mark_needed_node (vnode); + varpool_mark_needed_node (vnode); vnode->externally_visible = true; } } @@ -1053,7 +911,7 @@ cgraph_finalize_compilation_unit (void) intermodule optimization. */ static struct cgraph_node *first_analyzed; struct cgraph_node *first_processed = first_analyzed; - static struct cgraph_varpool_node *first_analyzed_var; + static struct varpool_node *first_analyzed_var; if (errorcount || sorrycount) return; @@ -1064,7 +922,7 @@ cgraph_finalize_compilation_unit (void) { cgraph_output_pending_asms (); cgraph_assemble_pending_functions (); - cgraph_varpool_output_debug_info (); + varpool_output_debug_info (); return; } @@ -1078,8 +936,8 @@ cgraph_finalize_compilation_unit (void) 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 (); + first_analyzed_var = varpool_nodes; + varpool_analyze_pending_decls (); if (cgraph_dump_file) { fprintf (cgraph_dump_file, "Initial entry points:"); @@ -1125,8 +983,8 @@ cgraph_finalize_compilation_unit (void) 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 (); + first_analyzed_var = varpool_nodes; + varpool_analyze_pending_decls (); } /* Collect entry points to the unit. */ @@ -1328,7 +1186,7 @@ struct cgraph_order_sort union { struct cgraph_node *f; - struct cgraph_varpool_node *v; + struct varpool_node *v; struct cgraph_asm_node *a; } u; }; @@ -1347,7 +1205,7 @@ cgraph_output_in_order (void) struct cgraph_order_sort *nodes; int i; struct cgraph_node *pf; - struct cgraph_varpool_node *pv; + struct varpool_node *pv; struct cgraph_asm_node *pa; max = cgraph_order; @@ -1355,7 +1213,7 @@ cgraph_output_in_order (void) nodes = (struct cgraph_order_sort *) alloca (size); memset (nodes, 0, size); - cgraph_varpool_analyze_pending_decls (); + varpool_analyze_pending_decls (); for (pf = cgraph_nodes; pf; pf = pf->next) { @@ -1368,7 +1226,7 @@ cgraph_output_in_order (void) } } - for (pv = cgraph_varpool_nodes_queue; pv; pv = pv->next_needed) + for (pv = varpool_nodes_queue; pv; pv = pv->next_needed) { i = pv->order; gcc_assert (nodes[i].kind == ORDER_UNDEFINED); @@ -1394,7 +1252,7 @@ cgraph_output_in_order (void) break; case ORDER_VAR: - cgraph_varpool_assemble_decl (nodes[i].u.v); + varpool_assemble_decl (nodes[i].u.v); break; case ORDER_ASM: @@ -1427,7 +1285,7 @@ static void cgraph_function_and_variable_visibility (void) { struct cgraph_node *node; - struct cgraph_varpool_node *vnode; + struct varpool_node *vnode; for (node = cgraph_nodes; node; node = node->next) { @@ -1447,7 +1305,7 @@ cgraph_function_and_variable_visibility (void) && !DECL_EXTERNAL (node->decl) && !node->local.externally_visible); } - for (vnode = cgraph_varpool_nodes_queue; vnode; vnode = vnode->next_needed) + for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed) { if (vnode->needed && !flag_whole_program @@ -1525,8 +1383,8 @@ cgraph_optimize (void) if (!flag_unit_at_a_time) { cgraph_output_pending_asms (); - cgraph_varpool_assemble_pending_decls (); - cgraph_varpool_output_debug_info (); + varpool_assemble_pending_decls (); + varpool_output_debug_info (); return; } @@ -1534,7 +1392,7 @@ cgraph_optimize (void) /* Frontend may output common variables after the unit has been finalized. It is safe to deal with them here as they are always zero initialized. */ - cgraph_varpool_analyze_pending_decls (); + varpool_analyze_pending_decls (); timevar_push (TV_CGRAPHOPT); if (!quiet_flag) @@ -1580,10 +1438,10 @@ cgraph_optimize (void) cgraph_output_pending_asms (); cgraph_expand_all_functions (); - cgraph_varpool_remove_unreferenced_decls (); + varpool_remove_unreferenced_decls (); - cgraph_varpool_assemble_pending_decls (); - cgraph_varpool_output_debug_info (); + varpool_assemble_pending_decls (); + varpool_output_debug_info (); } if (cgraph_dump_file) @@ -1627,10 +1485,10 @@ cgraph_increase_alignment (void) { if (flag_section_anchors && flag_tree_vectorize) { - struct cgraph_varpool_node *vnode; + struct varpool_node *vnode; /* Increase the alignment of all global arrays for vectorization. */ - for (vnode = cgraph_varpool_nodes_queue; + for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed) { @@ -1923,5 +1781,3 @@ save_inline_function_body (struct cgraph_node *node) #endif return first_clone; } - -#include "gt-cgraphunit.h" |