diff options
Diffstat (limited to 'gcc/toplev.c')
-rw-r--r-- | gcc/toplev.c | 78 |
1 files changed, 37 insertions, 41 deletions
diff --git a/gcc/toplev.c b/gcc/toplev.c index f38fb32c0db..fd2ac4e7f2e 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -492,15 +492,15 @@ wrapup_global_declarations (tree *vec, int len) return output_something; } -/* A subroutine of check_global_declarations. Issue appropriate warnings - for the global declaration DECL. */ +/* Issue appropriate warnings for the global declaration DECL. */ void -check_global_declaration_1 (tree decl) +check_global_declaration (tree decl) { /* Warn about any function declared static but not defined. We don't warn about variables, because many programs have static variables that exist only to get some text into the object file. */ + symtab_node *snode = symtab_node::get (decl); if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) == 0 && DECL_EXTERNAL (decl) @@ -508,9 +508,9 @@ check_global_declaration_1 (tree decl) && ! TREE_NO_WARNING (decl) && ! TREE_PUBLIC (decl) && (warn_unused_function - || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) + || snode->referred_to_p (/*include_self=*/false))) { - if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) + if (snode->referred_to_p (/*include_self=*/false)) pedwarn (input_location, 0, "%q+F used but never defined", decl); else warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl); @@ -525,6 +525,10 @@ check_global_declaration_1 (tree decl) || (warn_unused_variable && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl))) && ! DECL_IN_SYSTEM_HEADER (decl) + && ! snode->referred_to_p (/*include_self=*/false) + /* This TREE_USED check is needed in addition to referred_to_p + above, because the `__unused__' attribute is not being + considered for referred_to_p. */ && ! TREE_USED (decl) /* The TREE_USED bit for file-scope decls is kept in the identifier, to handle multiple external decls in different scopes. */ @@ -535,6 +539,10 @@ check_global_declaration_1 (tree decl) && ! TREE_THIS_VOLATILE (decl) /* Global register variables must be declared to reserve them. */ && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)) + /* Global ctors and dtors are called by the runtime. */ + && (TREE_CODE (decl) != FUNCTION_DECL + || (!DECL_STATIC_CONSTRUCTOR (decl) + && !DECL_STATIC_DESTRUCTOR (decl))) /* Otherwise, ask the language. */ && lang_hooks.decls.warn_unused_global (decl)) warning ((TREE_CODE (decl) == FUNCTION_DECL) @@ -543,38 +551,6 @@ check_global_declaration_1 (tree decl) "%q+D defined but not used", decl); } -/* Issue appropriate warnings for the global declarations in V (of - which there are LEN). */ - -void -check_global_declarations (tree *v, int len) -{ - int i; - - for (i = 0; i < len; i++) - check_global_declaration_1 (v[i]); -} - -/* Emit debugging information for all global declarations in VEC. */ - -void -emit_debug_global_declarations (tree *vec, int len) -{ - int i; - - /* Avoid confusing the debug information machinery when there are errors. */ - if (seen_error ()) - return; - /* No need for debug info in object files when producing slimLTO. */ - if (!in_lto_p && flag_lto && !flag_fat_lto_objects) - return; - - timevar_push (TV_SYMOUT); - for (i = 0; i < len; i++) - debug_hooks->global_decl (vec[i]); - timevar_pop (TV_SYMOUT); -} - /* Compile an entire translation unit. Write a file of assembly output and various debugging dumps. */ @@ -584,8 +560,7 @@ compile_file (void) timevar_start (TV_PHASE_PARSING); timevar_push (TV_PARSE_GLOBAL); - /* Call the parser, which parses the entire file (calling - rest_of_compilation for each function). */ + /* Parse entire file and generate initial debug information. */ lang_hooks.parse_file (); timevar_pop (TV_PARSE_GLOBAL); @@ -602,12 +577,33 @@ compile_file (void) ggc_protect_identifiers = false; - /* This must also call finalize_compilation_unit. */ - lang_hooks.decls.final_write_globals (); + /* Run the actual compilation process. */ + if (!in_lto_p) + { + timevar_start (TV_PHASE_OPT_GEN); + symtab->finalize_compilation_unit (); + timevar_stop (TV_PHASE_OPT_GEN); + } + + /* Perform any post compilation-proper parser cleanups and + processing. This is currently only needed for the C++ parser, + which can be hopefully cleaned up so this hook is no longer + necessary. */ + if (lang_hooks.decls.post_compilation_parsing_cleanups) + lang_hooks.decls.post_compilation_parsing_cleanups (); if (seen_error ()) return; + /* After the parser has generated debugging information, augment + this information with any new location/etc information that may + have become available after the compilation proper. */ + timevar_start (TV_PHASE_DBGINFO); + symtab_node *node; + FOR_EACH_DEFINED_SYMBOL (node) + debug_hooks->late_global_decl (node->decl); + timevar_stop (TV_PHASE_DBGINFO); + timevar_start (TV_PHASE_LATE_ASM); /* Compilation unit is finalized. When producing non-fat LTO object, we are |