From patchwork Thu Jan 27 01:42:24 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lawrence Crowl X-Patchwork-Id: 80575 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id C66461007D1 for ; Thu, 27 Jan 2011 12:42:56 +1100 (EST) Received: (qmail 31135 invoked by alias); 27 Jan 2011 01:42:54 -0000 Received: (qmail 31092 invoked by uid 22791); 27 Jan 2011 01:42:43 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL, BAYES_05, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FILL_THIS_FORM, SPF_HELO_PASS, TW_CX, TW_FN, TW_TM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 27 Jan 2011 01:42:30 +0000 Received: from kpbe17.cbf.corp.google.com (kpbe17.cbf.corp.google.com [172.25.105.81]) by smtp-out.google.com with ESMTP id p0R1gRE9009808 for ; Wed, 26 Jan 2011 17:42:27 -0800 Received: from pvc21 (pvc21.prod.google.com [10.241.209.149]) by kpbe17.cbf.corp.google.com with ESMTP id p0R1gPmV015125 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NOT) for ; Wed, 26 Jan 2011 17:42:25 -0800 Received: by pvc21 with SMTP id 21so217954pvc.17 for ; Wed, 26 Jan 2011 17:42:25 -0800 (PST) MIME-Version: 1.0 Received: by 10.142.194.2 with SMTP id r2mr1148824wff.139.1296092545111; Wed, 26 Jan 2011 17:42:25 -0800 (PST) Received: by 10.142.200.6 with HTTP; Wed, 26 Jan 2011 17:42:24 -0800 (PST) Date: Wed, 26 Jan 2011 17:42:24 -0800 Message-ID: Subject: [pph] Merge Timevar Changes From: Lawrence Crowl To: gcc-patches List X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch merges the timevar changes already mentioned into the PPH branch. Index: gcc/cp/ChangeLog.pph 2011-01-24 Lawrence Crowl Merge timevar patch. Index: gcc/ChangeLog.pph 2011-01-24 Lawrence Crowl Merge timevar patch. Index: gcc/toplev.c =================================================================== *** gcc/toplev.c (revision 169185) --- gcc/toplev.c (working copy) *************** compile_file (void) *** 564,569 **** --- 564,571 ---- { /* Initialize yet another pass. */ + timevar_start (TV_PHASE_PARSING); + ggc_protect_identifiers = true; init_cgraph (); *************** compile_file (void) *** 572,578 **** statistics_init (); invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); ! timevar_push (TV_PARSE); /* Call the parser, which parses the entire file (calling rest_of_compilation for each function). */ --- 574,580 ---- statistics_init (); invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); ! timevar_push (TV_PARSE_GLOBAL); /* Call the parser, which parses the entire file (calling rest_of_compilation for each function). */ *************** compile_file (void) *** 580,586 **** /* Compilation is now finished except for writing what's left of the symbol table output. */ ! timevar_pop (TV_PARSE); if (flag_syntax_only || flag_wpa) return; --- 582,590 ---- /* Compilation is now finished except for writing what's left of the symbol table output. */ ! timevar_pop (TV_PARSE_GLOBAL); ! ! timevar_stop (TV_PHASE_PARSING); if (flag_syntax_only || flag_wpa) return; *************** compile_file (void) *** 593,598 **** --- 597,604 ---- if (seen_error ()) return; + timevar_start (TV_PHASE_GENERATE); + varpool_assemble_pending_decls (); finish_aliases_2 (); *************** compile_file (void) *** 671,676 **** --- 677,684 ---- into the assembly file here, and hence we can not output anything to the assembly file after this point. */ targetm.asm_out.file_end (); + + timevar_stop (TV_PHASE_GENERATE); } /* Indexed by enum debug_info_type. */ *************** do_compile (void) *** 1860,1865 **** --- 1868,1875 ---- /* Don't do any more if an error has already occurred. */ if (!seen_error ()) { + timevar_start (TV_PHASE_SETUP); + /* This must be run always, because it is needed to compute the FP predefined macros, such as __LDBL_MAX__, for targets using non default FP formats. */ *************** do_compile (void) *** 1869,1879 **** --- 1879,1895 ---- if (!no_backend) backend_init (); + timevar_stop (TV_PHASE_SETUP); + /* Language-dependent initialization. Returns true on success. */ if (lang_dependent_init (main_input_filename)) compile_file (); + timevar_start (TV_PHASE_FINALIZE); + finalize (no_backend); + + timevar_stop (TV_PHASE_FINALIZE); } /* Stop timing and print the times. */ Index: gcc/cp/decl.c =================================================================== *** gcc/cp/decl.c (revision 169185) --- gcc/cp/decl.c (working copy) *************** poplevel (int keep, int reverse, int fun *** 554,560 **** unsigned ix; cp_label_binding *label_bind; ! timevar_push (TV_NAME_LOOKUP); restart: block = NULL_TREE; --- 554,560 ---- unsigned ix; cp_label_binding *label_bind; ! timevar_start (TV_NAME_LOOKUP); restart: block = NULL_TREE; *************** poplevel (int keep, int reverse, int fun *** 817,823 **** if (kind == sk_cleanup) goto restart; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, block); } /* Walk all the namespaces contained NAMESPACE, including NAMESPACE --- 817,824 ---- if (kind == sk_cleanup) goto restart; ! timevar_stop (TV_NAME_LOOKUP); ! return block; } /* Walk all the namespaces contained NAMESPACE, including NAMESPACE *************** push_local_name (tree decl) *** 901,907 **** size_t i, nelts; tree t, name; ! timevar_push (TV_NAME_LOOKUP); name = DECL_NAME (decl); --- 902,908 ---- size_t i, nelts; tree t, name; ! timevar_start (TV_NAME_LOOKUP); name = DECL_NAME (decl); *************** push_local_name (tree decl) *** 920,932 **** DECL_DISCRIMINATOR (decl) = 1; VEC_replace (tree, local_names, i, decl); ! timevar_pop (TV_NAME_LOOKUP); return; } } VEC_safe_push (tree, gc, local_names, decl); ! timevar_pop (TV_NAME_LOOKUP); } /* Subroutine of duplicate_decls: return truthvalue of whether --- 921,933 ---- DECL_DISCRIMINATOR (decl) = 1; VEC_replace (tree, local_names, i, decl); ! timevar_stop (TV_NAME_LOOKUP); return; } } VEC_safe_push (tree, gc, local_names, decl); ! timevar_stop (TV_NAME_LOOKUP); } /* Subroutine of duplicate_decls: return truthvalue of whether *************** make_label_decl (tree id, int local_p) *** 2552,2559 **** be found, create one. (We keep track of used, but undefined, labels, and complain about them at the end of a function.) */ ! tree ! lookup_label (tree id) { tree decl; --- 2553,2560 ---- be found, create one. (We keep track of used, but undefined, labels, and complain about them at the end of a function.) */ ! static tree ! lookup_label_1 (tree id) { tree decl; *************** lookup_label (tree id) *** 2562,2579 **** if (current_function_decl == NULL_TREE) { error ("label %qE referenced outside of any function", id); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); } /* See if we've already got this label. */ decl = IDENTIFIER_LABEL_VALUE (id); if (decl != NULL_TREE && DECL_CONTEXT (decl) == current_function_decl) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); decl = make_label_decl (id, /*local_p=*/0); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } /* Declare a local label named ID. */ tree --- 2563,2594 ---- if (current_function_decl == NULL_TREE) { error ("label %qE referenced outside of any function", id); ! return NULL_TREE; } /* See if we've already got this label. */ decl = IDENTIFIER_LABEL_VALUE (id); if (decl != NULL_TREE && DECL_CONTEXT (decl) == current_function_decl) ! return decl; decl = make_label_decl (id, /*local_p=*/0); ! return decl; } + /* Wrapper for lookup_label_1. */ + + tree + lookup_label (tree id) + { + tree ret; + bool subtime = timevar_cond_start (TV_NAME_LOOKUP); + ret = lookup_label_1 (id); + pph_catch_name_lookup (ret); + timevar_cond_stop (TV_NAME_LOOKUP, subtime); + return ret; + } + + /* Declare a local label named ID. */ tree *************** check_omp_return (void) *** 2844,2858 **** /* Define a label, specifying the location in the source file. Return the LABEL_DECL node for the label. */ ! tree ! define_label (location_t location, tree name) { struct named_label_entry *ent, dummy; struct cp_binding_level *p; tree decl; - timevar_push (TV_NAME_LOOKUP); - decl = lookup_label (name); dummy.label_decl = decl; --- 2859,2871 ---- /* Define a label, specifying the location in the source file. Return the LABEL_DECL node for the label. */ ! static tree ! define_label_1 (location_t location, tree name) { struct named_label_entry *ent, dummy; struct cp_binding_level *p; tree decl; decl = lookup_label (name); dummy.label_decl = decl; *************** define_label (location_t location, tree *** 2872,2878 **** if (DECL_INITIAL (decl) != NULL_TREE) { error ("duplicate label %qD", decl); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } else { --- 2885,2891 ---- if (DECL_INITIAL (decl) != NULL_TREE) { error ("duplicate label %qD", decl); ! return error_mark_node; } else { *************** define_label (location_t location, tree *** 2891,2899 **** ent->uses = NULL; } ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } struct cp_switch { struct cp_binding_level *level; --- 2904,2926 ---- ent->uses = NULL; } ! return decl; ! } ! ! /* Wrapper for define_label_1. */ ! ! tree ! define_label (location_t location, tree name) ! { ! tree ret; ! timevar_start (TV_NAME_LOOKUP); ! ret = define_label_1 (location, name); ! pph_catch_name_lookup (ret); ! timevar_stop (TV_NAME_LOOKUP); ! return ret; } + struct cp_switch { struct cp_binding_level *level; *************** lookup_and_check_tag (enum tag_types tag *** 11138,11153 **** TEMPLATE_HEADER_P is true when this declaration is preceded by a set of template parameters. */ ! tree ! xref_tag (enum tag_types tag_code, tree name, ! tag_scope scope, bool template_header_p) { enum tree_code code; tree t; tree context = NULL_TREE; - timevar_push (TV_NAME_LOOKUP); - gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); switch (tag_code) --- 11165,11178 ---- TEMPLATE_HEADER_P is true when this declaration is preceded by a set of template parameters. */ ! static tree ! xref_tag_1 (enum tag_types tag_code, tree name, ! tag_scope scope, bool template_header_p) { enum tree_code code; tree t; tree context = NULL_TREE; gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); switch (tag_code) *************** xref_tag (enum tag_types tag_code, tree *** 11175,11181 **** scope, template_header_p); if (t == error_mark_node) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); if (scope != ts_current && t && current_class_type && template_class_depth (current_class_type) --- 11200,11206 ---- scope, template_header_p); if (t == error_mark_node) ! return error_mark_node; if (scope != ts_current && t && current_class_type && template_class_depth (current_class_type) *************** xref_tag (enum tag_types tag_code, tree *** 11230,11236 **** if (code == ENUMERAL_TYPE) { error ("use of enum %q#D without previous declaration", name); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } else { --- 11255,11261 ---- if (code == ENUMERAL_TYPE) { error ("use of enum %q#D without previous declaration", name); ! return error_mark_node; } else { *************** xref_tag (enum tag_types tag_code, tree *** 11245,11251 **** if (template_header_p && MAYBE_CLASS_TYPE_P (t)) { if (!redeclare_class_template (t, current_template_parms)) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } else if (!processing_template_decl && CLASS_TYPE_P (t) --- 11270,11276 ---- if (template_header_p && MAYBE_CLASS_TYPE_P (t)) { if (!redeclare_class_template (t, current_template_parms)) ! return error_mark_node; } else if (!processing_template_decl && CLASS_TYPE_P (t) *************** xref_tag (enum tag_types tag_code, tree *** 11253,11259 **** { error ("redeclaration of %qT as a non-template", t); error ("previous declaration %q+D", t); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } /* Make injected friend class visible. */ --- 11278,11284 ---- { error ("redeclaration of %qT as a non-template", t); error ("previous declaration %q+D", t); ! return error_mark_node; } /* Make injected friend class visible. */ *************** xref_tag (enum tag_types tag_code, tree *** 11271,11279 **** } } ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } tree xref_tag_from_type (tree old, tree id, tag_scope scope) { --- 11296,11319 ---- } } ! return t; } + /* Wrapper for xref_tag_1. */ + + tree + xref_tag (enum tag_types tag_code, tree name, + tag_scope scope, bool template_header_p) + { + tree ret; + timevar_start (TV_NAME_LOOKUP); + ret = xref_tag_1 (tag_code, name, scope, template_header_p); + pph_catch_name_lookup (ret); + timevar_stop (TV_NAME_LOOKUP); + return ret; + } + + tree xref_tag_from_type (tree old, tree id, tag_scope scope) { Index: gcc/cp/Make-lang.in =================================================================== *** gcc/cp/Make-lang.in (revision 169185) --- gcc/cp/Make-lang.in (working copy) *************** cp/class.o: cp/class.c $(CXX_TREE_H) $(T *** 280,286 **** $(SPLAY_TREE_H) cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ $(DIAGNOSTIC_CORE_H) intl.h gt-cp-call.h convert.h $(TARGET_H) langhooks.h \ ! $(CXX_PPH_H) c-family/c-objc.h cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ $(EXCEPT_H) $(TARGET_H) --- 280,286 ---- $(SPLAY_TREE_H) cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ $(DIAGNOSTIC_CORE_H) intl.h gt-cp-call.h convert.h $(TARGET_H) langhooks.h \ ! $(TIMEVAR_H) $(CXX_PPH_H) c-family/c-objc.h cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ $(EXCEPT_H) $(TARGET_H) *************** cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $ *** 319,325 **** gt-cp-mangle.h $(TARGET_H) $(TM_P_H) $(CGRAPH_H) cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) $(DIAGNOSTIC_CORE_H) \ gt-cp-parser.h output.h $(TARGET_H) $(PLUGIN_H) intl.h \ ! c-family/c-objc.h \ pointer-set.h fixed-value.h $(MD5_H) $(HASHTAB_H) tree-pass.h \ $(TREE_INLINE_H) tree-pretty-print.h $(CXX_PARSER_H) \ $(CXX_PPH_H) --- 319,325 ---- gt-cp-mangle.h $(TARGET_H) $(TM_P_H) $(CGRAPH_H) cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) $(DIAGNOSTIC_CORE_H) \ gt-cp-parser.h output.h $(TARGET_H) $(PLUGIN_H) intl.h \ ! $(TIMEVAR_H) c-family/c-objc.h \ pointer-set.h fixed-value.h $(MD5_H) $(HASHTAB_H) tree-pass.h \ $(TREE_INLINE_H) tree-pretty-print.h $(CXX_PARSER_H) \ $(CXX_PPH_H) Index: gcc/cp/pt.c =================================================================== *** gcc/cp/pt.c (revision 169185) --- gcc/cp/pt.c (working copy) *************** maybe_get_template_decl_from_type_decl ( *** 6680,6692 **** that we want to avoid. It also causes some problems with argument coercion (see convert_nontype_argument for more information on this). */ ! tree ! lookup_template_class (tree d1, ! tree arglist, ! tree in_decl, ! tree context, ! int entering_scope, ! tsubst_flags_t complain) { tree templ = NULL_TREE, parmlist; tree t; --- 6680,6688 ---- that we want to avoid. It also causes some problems with argument coercion (see convert_nontype_argument for more information on this). */ ! static tree ! lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, ! int entering_scope, tsubst_flags_t complain) { tree templ = NULL_TREE, parmlist; tree t; *************** lookup_template_class (tree d1, *** 6695,6702 **** spec_entry elt; hashval_t hash; - timevar_push (TV_NAME_LOOKUP); - if (TREE_CODE (d1) == IDENTIFIER_NODE) { tree value = innermost_non_namespace_value (d1); --- 6691,6696 ---- *************** lookup_template_class (tree d1, *** 6749,6755 **** { if (complain & tf_error) error ("%qT is not a template", d1); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } if (TREE_CODE (templ) != TEMPLATE_DECL --- 6743,6749 ---- { if (complain & tf_error) error ("%qT is not a template", d1); ! return error_mark_node; } if (TREE_CODE (templ) != TEMPLATE_DECL *************** lookup_template_class (tree d1, *** 6764,6770 **** if (in_decl) error ("for template declaration %q+D", in_decl); } ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } complain &= ~tf_user; --- 6758,6764 ---- if (in_decl) error ("for template declaration %q+D", in_decl); } ! return error_mark_node; } complain &= ~tf_user; *************** lookup_template_class (tree d1, *** 6814,6823 **** if (arglist2 == error_mark_node || (!uses_template_parms (arglist2) && check_instantiated_args (templ, arglist2, complain))) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); parm = bind_template_template_parm (TREE_TYPE (templ), arglist2); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, parm); } else { --- 6808,6817 ---- if (arglist2 == error_mark_node || (!uses_template_parms (arglist2) && check_instantiated_args (templ, arglist2, complain))) ! return error_mark_node; parm = bind_template_template_parm (TREE_TYPE (templ), arglist2); ! return parm; } else { *************** lookup_template_class (tree d1, *** 6893,6899 **** { /* Restore the ARGLIST to its full size. */ TREE_VEC_LENGTH (arglist) = saved_depth; ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } SET_TMPL_ARGS_LEVEL (bound_args, i, a); --- 6887,6893 ---- { /* Restore the ARGLIST to its full size. */ TREE_VEC_LENGTH (arglist) = saved_depth; ! return error_mark_node; } SET_TMPL_ARGS_LEVEL (bound_args, i, a); *************** lookup_template_class (tree d1, *** 6921,6927 **** if (arglist == error_mark_node) /* We were unable to bind the arguments. */ ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); /* In the scope of a template class, explicit references to the template class refer to the type of the template, not any --- 6915,6921 ---- if (arglist == error_mark_node) /* We were unable to bind the arguments. */ ! return error_mark_node; /* In the scope of a template class, explicit references to the template class refer to the type of the template, not any *************** lookup_template_class (tree d1, *** 6937,6943 **** /* comp_template_args is expensive, check it last. */ && comp_template_args (TYPE_TI_ARGS (template_type), arglist)) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, template_type); /* If we already have this specialization, return it. */ elt.tmpl = gen_tmpl; --- 6931,6937 ---- /* comp_template_args is expensive, check it last. */ && comp_template_args (TYPE_TI_ARGS (template_type), arglist)) ! return template_type; /* If we already have this specialization, return it. */ elt.tmpl = gen_tmpl; *************** lookup_template_class (tree d1, *** 6947,6953 **** &elt, hash); if (entry) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, entry->spec); is_dependent_type = uses_template_parms (arglist); --- 6941,6947 ---- &elt, hash); if (entry) ! return entry->spec; is_dependent_type = uses_template_parms (arglist); *************** lookup_template_class (tree d1, *** 6957,6963 **** && check_instantiated_args (gen_tmpl, INNERMOST_TEMPLATE_ARGS (arglist), complain)) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); if (!is_dependent_type && !PRIMARY_TEMPLATE_P (gen_tmpl) --- 6951,6957 ---- && check_instantiated_args (gen_tmpl, INNERMOST_TEMPLATE_ARGS (arglist), complain)) ! return error_mark_node; if (!is_dependent_type && !PRIMARY_TEMPLATE_P (gen_tmpl) *************** lookup_template_class (tree d1, *** 6967,6973 **** found = xref_tag_from_type (TREE_TYPE (gen_tmpl), DECL_NAME (gen_tmpl), /*tag_scope=*/ts_global); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found); } context = tsubst (DECL_CONTEXT (gen_tmpl), arglist, --- 6961,6967 ---- found = xref_tag_from_type (TREE_TYPE (gen_tmpl), DECL_NAME (gen_tmpl), /*tag_scope=*/ts_global); ! return found; } context = tsubst (DECL_CONTEXT (gen_tmpl), arglist, *************** lookup_template_class (tree d1, *** 7158,7166 **** TREE_PUBLIC (type_decl) = 1; determine_visibility (type_decl); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } ! timevar_pop (TV_NAME_LOOKUP); } struct pair_fn_data --- 7152,7174 ---- TREE_PUBLIC (type_decl) = 1; determine_visibility (type_decl); ! return t; } ! } ! ! /* Wrapper for lookup_template_class_1. */ ! ! tree ! lookup_template_class (tree d1, tree arglist, tree in_decl, tree context, ! int entering_scope, tsubst_flags_t complain) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = lookup_template_class_1 (d1, arglist, in_decl, context, ! entering_scope, complain); ! pph_catch_name_lookup (ret); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } struct pair_fn_data *************** perform_typedefs_access_check (tree tmpl *** 8097,8104 **** input_location = saved_location; } ! tree ! instantiate_class_template (tree type) { tree templ, args, pattern, t, member; tree typedecl; --- 8105,8112 ---- input_location = saved_location; } ! static tree ! instantiate_class_template_1 (tree type) { tree templ, args, pattern, t, member; tree typedecl; *************** instantiate_class_template (tree type) *** 8592,8597 **** --- 8600,8617 ---- return type; } + /* Wrapper for instantiate_class_template_1. */ + + tree + instantiate_class_template (tree type) + { + tree ret; + timevar_push (TV_INSTANTIATE_TEMPLATE); + ret = instantiate_class_template_1 (type); + timevar_pop (TV_INSTANTIATE_TEMPLATE); + return ret; + } + static tree tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl) { *************** check_instantiated_args (tree tmpl, tree *** 13431,13438 **** /* Instantiate the indicated variable or function template TMPL with the template arguments in TARG_PTR. */ ! tree ! instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain) { tree targ_ptr = orig_args; tree fndecl; --- 13451,13458 ---- /* Instantiate the indicated variable or function template TMPL with the template arguments in TARG_PTR. */ ! static tree ! instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) { tree targ_ptr = orig_args; tree fndecl; *************** instantiate_template (tree tmpl, tree or *** 13541,13546 **** --- 13561,13578 ---- return fndecl; } + /* Wrapper for instantiate_template_1. */ + + tree + instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain) + { + tree ret; + timevar_push (TV_INSTANTIATE_TEMPLATE); + ret = instantiate_template_1 (tmpl, orig_args, complain); + timevar_pop (TV_INSTANTIATE_TEMPLATE); + return ret; + } + /* The FN is a TEMPLATE_DECL for a function. ARGS is an array with NARGS elements of the arguments that are being used when calling it. TARGS is a vector into which the deduced template arguments *************** instantiate_decl (tree d, int defer_ok, *** 17117,17123 **** if (! push_tinst_level (d)) return d; ! timevar_push (TV_PARSE); /* Set TD to the template whose DECL_TEMPLATE_RESULT is the pattern for the instantiation. */ --- 17149,17155 ---- if (! push_tinst_level (d)) return d; ! timevar_push (TV_PARSE_GLOBAL); /* Set TD to the template whose DECL_TEMPLATE_RESULT is the pattern for the instantiation. */ *************** out: *** 17405,17411 **** pop_deferring_access_checks (); pop_tinst_level (); ! timevar_pop (TV_PARSE); return d; } --- 17437,17443 ---- pop_deferring_access_checks (); pop_tinst_level (); ! timevar_pop (TV_PARSE_GLOBAL); return d; } Index: gcc/cp/decl2.c =================================================================== *** gcc/cp/decl2.c (revision 169185) --- gcc/cp/decl2.c (working copy) *************** cp_write_global_declarations (void) *** 3649,3654 **** --- 3649,3656 ---- /* FIXME - huh? was input_line -= 1;*/ + timevar_start (TV_PHASE_DEFERRED); + /* We now have to write out all the stuff we put off writing out. These include: *************** cp_write_global_declarations (void) *** 3665,3672 **** generating the initializer for an object may cause templates to be instantiated, etc., etc. */ - timevar_push (TV_VARCONST); - emit_support_tinfos (); do --- 3667,3672 ---- *************** cp_write_global_declarations (void) *** 3973,3980 **** --- 3973,3986 ---- /* Collect candidates for Java hidden aliases. */ candidates = collect_candidates_for_java_method_aliases (); + timevar_stop (TV_PHASE_DEFERRED); + timevar_start (TV_PHASE_CGRAPH); + cgraph_finalize_compilation_unit (); + timevar_stop (TV_PHASE_CGRAPH); + timevar_start (TV_PHASE_CHECK_AND_GEN_DEBUG); + /* Now, issue warnings about static, but not defined, functions, etc., and emit debugging information. */ walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider); *************** cp_write_global_declarations (void) *** 4010,4017 **** } } - timevar_pop (TV_VARCONST); - if (flag_detailed_statistics) { dump_tree_statistics (); --- 4016,4021 ---- *************** cp_write_global_declarations (void) *** 4022,4027 **** --- 4026,4033 ---- #ifdef ENABLE_CHECKING validate_conversion_obstack (); #endif /* ENABLE_CHECKING */ + + timevar_stop (TV_PHASE_CHECK_DBG); } /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the Index: gcc/cp/parser.c =================================================================== *** gcc/cp/parser.c (revision 169185) --- gcc/cp/parser.c (working copy) *************** along with GCC; see the file COPYING3. *** 23,28 **** --- 23,29 ---- #include "system.h" #include "coretypes.h" #include "tm.h" + #include "timevar.h" #include "cpplib.h" #include "tree.h" #include "cp-tree.h" *************** cp_parser_explicit_instantiation (cp_par *** 12133,12138 **** --- 12134,12141 ---- cp_decl_specifier_seq decl_specifiers; tree extension_specifier = NULL_TREE; + timevar_push (TV_INSTANTIATE_TEMPLATE); + /* Look for an (optional) storage-class-specifier or function-specifier. */ if (cp_parser_allow_gnu_extensions_p (parser)) *************** cp_parser_explicit_instantiation (cp_par *** 12216,12221 **** --- 12219,12226 ---- end_explicit_instantiation (); cp_parser_consume_semicolon_at_end_of_statement (parser); + + timevar_pop (TV_INSTANTIATE_TEMPLATE); } /* Parse an explicit-specialization. *************** cp_parser_enum_specifier (cp_parser* par *** 13419,13424 **** --- 13424,13430 ---- elaborated-type-specifier. */ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) { + timevar_push (TV_PARSE_ENUM); if (nested_name_specifier) { /* The following catches invalid code such as: *************** cp_parser_enum_specifier (cp_parser* par *** 13480,13485 **** --- 13486,13492 ---- if (scoped_enum_p) finish_scope (); + timevar_pop (TV_PARSE_ENUM); } else { *************** cp_parser_class_specifier (cp_parser* pa *** 16716,16721 **** --- 16723,16729 ---- tree scope = NULL_TREE; tree bases; + timevar_push (TV_PARSE_STRUCT); push_deferring_access_checks (dk_no_deferred); /* Parse the class-head. */ *************** cp_parser_class_specifier (cp_parser* pa *** 16729,16734 **** --- 16737,16743 ---- { cp_parser_skip_to_end_of_block_or_statement (parser); pop_deferring_access_checks (); + timevar_pop (TV_PARSE_STRUCT); return error_mark_node; } *************** cp_parser_class_specifier (cp_parser* pa *** 16736,16741 **** --- 16745,16751 ---- if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE)) { pop_deferring_access_checks (); + timevar_pop (TV_PARSE_STRUCT); return error_mark_node; } *************** cp_parser_class_specifier (cp_parser* pa *** 16750,16755 **** --- 16760,16766 ---- if (cp_parser_skip_to_closing_brace (parser)) cp_lexer_consume_token (parser->lexer); pop_deferring_access_checks (); + timevar_pop (TV_PARSE_STRUCT); return error_mark_node; } *************** cp_parser_class_specifier (cp_parser* pa *** 16968,16973 **** --- 16979,16985 ---- = saved_in_unbraced_linkage_specification_p; /* FIXME pph: check to see if still in same token hunk. */ + timevar_pop (TV_PARSE_STRUCT); return type; } *************** cp_parser_function_definition_from_speci *** 19606,19611 **** --- 19618,19624 ---- { tree fn; bool success_p; + timevar_push (TV_PARSE_FUNC); /* Begin the function-definition. */ success_p = start_function (decl_specifiers, declarator, attributes); *************** cp_parser_function_definition_from_speci *** 19640,19645 **** --- 19653,19659 ---- fn = cp_parser_function_definition_after_declarator (parser, /*inline_p=*/false); + timevar_pop (TV_PARSE_FUNC); return fn; } *************** cp_parser_enclosed_template_argument_lis *** 20242,20247 **** --- 20256,20262 ---- static void cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function) { + timevar_push (TV_PARSE_INMETH); /* If this member is a template, get the underlying FUNCTION_DECL. */ if (DECL_FUNCTION_TEMPLATE_P (member_function)) *************** cp_parser_late_parsing_for_member (cp_pa *** 20308,20313 **** --- 20323,20329 ---- /* Restore the queue. */ pop_unparsed_function_queues (parser); + timevar_pop (TV_PARSE_INMETH); } /* If DECL contains any default args, remember it on the unparsed Index: gcc/cp/call.c =================================================================== *** gcc/cp/call.c (revision 169185) --- gcc/cp/call.c (working copy) *************** along with GCC; see the file COPYING3. *** 40,45 **** --- 40,46 ---- #include "langhooks.h" #include "pph.h" #include "c-family/c-objc.h" + #include "timevar.h" /* The various kinds of conversion. */ *************** perform_overload_resolution (tree fn, *** 3505,3512 **** bool *any_viable_p) { struct z_candidate *cand; ! tree explicit_targs = NULL_TREE; ! int template_only = 0; *candidates = NULL; *any_viable_p = true; --- 3506,3518 ---- bool *any_viable_p) { struct z_candidate *cand; ! tree explicit_targs; ! int template_only; ! ! timevar_start (TV_RESOLVE_OVERLOAD); ! ! explicit_targs = NULL_TREE; ! template_only = 0; *candidates = NULL; *any_viable_p = true; *************** perform_overload_resolution (tree fn, *** 3533,3542 **** candidates); *candidates = splice_viable (*candidates, pedantic, any_viable_p); ! if (!*any_viable_p) ! return NULL; ! cand = tourney (*candidates); return cand; } --- 3539,3550 ---- candidates); *candidates = splice_viable (*candidates, pedantic, any_viable_p); ! if (*any_viable_p) ! cand = tourney (*candidates); ! else ! cand = NULL; ! timevar_stop (TV_RESOLVE_OVERLOAD); return cand; } Index: gcc/cp/name-lookup.c =================================================================== *** gcc/cp/name-lookup.c (revision 169185) --- gcc/cp/name-lookup.c (working copy) *************** pop_binding (tree id, tree decl) *** 436,447 **** was successful. */ static bool ! supplement_binding (cxx_binding *binding, tree decl) { tree bval = binding->value; bool ok = true; - timevar_push (TV_NAME_LOOKUP); if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)) /* The new name is the type name. */ binding->type = decl; --- 436,446 ---- was successful. */ static bool ! supplement_binding_1 (cxx_binding *binding, tree decl) { tree bval = binding->value; bool ok = true; if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)) /* The new name is the type name. */ binding->type = decl; *************** supplement_binding (cxx_binding *binding *** 528,534 **** ok = false; } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ok); } /* Add DECL to the list of things declared in B. */ --- 527,545 ---- ok = false; } ! return ok; ! } ! ! /* Wrapper for supplement_binding_1. */ ! ! static bool ! supplement_binding (cxx_binding *binding, tree decl) ! { ! bool ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = supplement_binding_1 (binding, decl); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Add DECL to the list of things declared in B. */ *************** add_decl_to_level (tree decl, cxx_scope *** 584,600 **** If an old decl is returned, it may have been smashed to agree with what X says. */ ! tree ! pushdecl_maybe_friend (tree x, bool is_friend) { tree t; tree name; int need_new_binding; - timevar_push (TV_NAME_LOOKUP); - if (x == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); need_new_binding = 1; --- 595,609 ---- If an old decl is returned, it may have been smashed to agree with what X says. */ ! static tree ! pushdecl_maybe_friend_1 (tree x, bool is_friend) { tree t; tree name; int need_new_binding; if (x == error_mark_node) ! return error_mark_node; need_new_binding = 1; *************** pushdecl_maybe_friend (tree x, bool is_f *** 730,736 **** /* Check for duplicate params. */ tree d = duplicate_decls (x, t, is_friend); if (d) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, d); } else if ((DECL_EXTERN_C_FUNCTION_P (x) || DECL_FUNCTION_TEMPLATE_P (x)) --- 739,745 ---- /* Check for duplicate params. */ tree d = duplicate_decls (x, t, is_friend); if (d) ! return d; } else if ((DECL_EXTERN_C_FUNCTION_P (x) || DECL_FUNCTION_TEMPLATE_P (x)) *************** pushdecl_maybe_friend (tree x, bool is_f *** 743,749 **** TREE_TYPE (x)); /* Throw away the redeclaration. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } else { --- 752,758 ---- TREE_TYPE (x)); /* Throw away the redeclaration. */ ! return t; } else { *************** pushdecl_maybe_friend (tree x, bool is_f *** 752,765 **** /* If the redeclaration failed, we can stop at this point. */ if (olddecl == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); if (olddecl) { if (TREE_CODE (t) == TYPE_DECL) SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t)); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } else if (DECL_MAIN_P (x) && TREE_CODE (t) == FUNCTION_DECL) { --- 761,774 ---- /* If the redeclaration failed, we can stop at this point. */ if (olddecl == error_mark_node) ! return error_mark_node; if (olddecl) { if (TREE_CODE (t) == TYPE_DECL) SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t)); ! return t; } else if (DECL_MAIN_P (x) && TREE_CODE (t) == FUNCTION_DECL) { *************** pushdecl_maybe_friend (tree x, bool is_f *** 773,779 **** error ("as %qD", x); /* We don't try to push this declaration since that causes a crash. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); } } } --- 782,788 ---- error ("as %qD", x); /* We don't try to push this declaration since that causes a crash. */ ! return x; } } } *************** pushdecl_maybe_friend (tree x, bool is_f *** 816,827 **** x_exception_spec, ce_normal)) { ! pedwarn (input_location, 0, "declaration of %q#D with C language linkage", x); ! pedwarn (input_location, 0, "conflicts with previous declaration %q+#D", previous); ! pedwarn (input_location, 0, "due to different exception specifications"); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } } else --- 825,839 ---- x_exception_spec, ce_normal)) { ! pedwarn (input_location, 0, ! "declaration of %q#D with C language linkage", x); ! pedwarn (input_location, 0, ! "conflicts with previous declaration %q+#D", previous); ! pedwarn (input_location, 0, ! "due to different exception specifications"); ! return error_mark_node; } } else *************** pushdecl_maybe_friend (tree x, bool is_f *** 866,872 **** check_default_args (t); if (t != x || DECL_FUNCTION_TEMPLATE_P (t)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); /* If declaring a type as a typedef, copy the type (unless we're at line 0), and install this TYPE_DECL as the new type's typedef --- 878,884 ---- check_default_args (t); if (t != x || DECL_FUNCTION_TEMPLATE_P (t)) ! return t; /* If declaring a type as a typedef, copy the type (unless we're at line 0), and install this TYPE_DECL as the new type's typedef *************** pushdecl_maybe_friend (tree x, bool is_f *** 1153,1159 **** ? NAMESPACE_LEVEL (CP_DECL_CONTEXT (x)) : current_binding_level); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); } /* Record a decl-node X as belonging to the current lexical scope. */ --- 1165,1183 ---- ? NAMESPACE_LEVEL (CP_DECL_CONTEXT (x)) : current_binding_level); ! return x; ! } ! ! /* Wrapper for pushdecl_maybe_friend_1. */ ! ! tree ! pushdecl_maybe_friend (tree x, bool is_friend) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = pushdecl_maybe_friend_1 (x, is_friend); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Record a decl-node X as belonging to the current lexical scope. */ *************** print_binding_stack (void) *** 1750,1757 **** /* Return the type associated with id. */ ! tree ! identifier_type_value (tree id) { timevar_push (TV_NAME_LOOKUP); /* There is no type with that name, anywhere. */ --- 1774,1781 ---- /* Return the type associated with id. */ ! static tree ! identifier_type_value_1 (tree id) { timevar_push (TV_NAME_LOOKUP); /* There is no type with that name, anywhere. */ *************** identifier_type_value (tree id) *** 1759,1773 **** PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); /* This is not the type marker, but the real thing. */ if (REAL_IDENTIFIER_TYPE_VALUE (id) != global_type_node) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, REAL_IDENTIFIER_TYPE_VALUE (id)); /* Have to search for it. It must be on the global level, now. Ask lookup_name not to return non-types. */ id = lookup_name_real (id, 2, 1, /*block_p=*/true, 0, LOOKUP_COMPLAIN); if (id) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, TREE_TYPE (id)); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); } /* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++. */ --- 1783,1811 ---- PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); /* This is not the type marker, but the real thing. */ if (REAL_IDENTIFIER_TYPE_VALUE (id) != global_type_node) ! return REAL_IDENTIFIER_TYPE_VALUE (id); /* Have to search for it. It must be on the global level, now. Ask lookup_name not to return non-types. */ id = lookup_name_real (id, 2, 1, /*block_p=*/true, 0, LOOKUP_COMPLAIN); if (id) ! return TREE_TYPE (id); ! return NULL_TREE; } + /* Wrapper for identifier_type_value_1. */ + + tree + identifier_type_value (tree id) + { + tree ret; + timevar_start (TV_NAME_LOOKUP); + ret = identifier_type_value_1 (id); + pph_catch_name_lookup (ret); + timevar_stop (TV_NAME_LOOKUP); + return ret; + } + + /* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++. */ *************** make_lambda_name (void) *** 1908,1920 **** static inline cxx_binding * find_binding (cxx_scope *scope, cxx_binding *binding) { - timevar_push (TV_NAME_LOOKUP); - for (; binding != NULL; binding = binding->previous) if (binding->scope == scope) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, binding); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (cxx_binding *)0); } /* Return the binding for NAME in SCOPE, if any. Otherwise, return NULL. */ --- 1946,1956 ---- static inline cxx_binding * find_binding (cxx_scope *scope, cxx_binding *binding) { for (; binding != NULL; binding = binding->previous) if (binding->scope == scope) ! return binding; ! return (cxx_binding *)0; } /* Return the binding for NAME in SCOPE, if any. Otherwise, return NULL. */ *************** lookup_extern_c_fun_binding_in_all_ns (t *** 1993,2028 **** scope, a using decl might extend any previous bindings). */ static tree ! push_using_decl (tree scope, tree name) { tree decl; - timevar_push (TV_NAME_LOOKUP); gcc_assert (TREE_CODE (scope) == NAMESPACE_DECL); gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); for (decl = current_binding_level->usings; decl; decl = DECL_CHAIN (decl)) if (USING_DECL_SCOPE (decl) == scope && DECL_NAME (decl) == name) break; if (decl) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ! namespace_bindings_p () ? decl : NULL_TREE); decl = build_lang_decl (USING_DECL, name, NULL_TREE); USING_DECL_SCOPE (decl) = scope; DECL_CHAIN (decl) = current_binding_level->usings; current_binding_level->usings = decl; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } /* Same as pushdecl, but define X in binding-level LEVEL. We rely on the caller to set DECL_CONTEXT properly. */ ! tree ! pushdecl_with_scope (tree x, cxx_scope *level, bool is_friend) { struct cp_binding_level *b; tree function_decl = current_function_decl; - timevar_push (TV_NAME_LOOKUP); current_function_decl = NULL_TREE; if (level->kind == sk_class) { --- 2029,2073 ---- scope, a using decl might extend any previous bindings). */ static tree ! push_using_decl_1 (tree scope, tree name) { tree decl; gcc_assert (TREE_CODE (scope) == NAMESPACE_DECL); gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); for (decl = current_binding_level->usings; decl; decl = DECL_CHAIN (decl)) if (USING_DECL_SCOPE (decl) == scope && DECL_NAME (decl) == name) break; if (decl) ! return namespace_bindings_p () ? decl : NULL_TREE; decl = build_lang_decl (USING_DECL, name, NULL_TREE); USING_DECL_SCOPE (decl) = scope; DECL_CHAIN (decl) = current_binding_level->usings; current_binding_level->usings = decl; ! return decl; ! } ! ! /* Wrapper for push_using_decl_1. */ ! ! static tree ! push_using_decl (tree scope, tree name) ! { ! tree ret; ! timevar_start (TV_NAME_LOOKUP); ! ret = push_using_decl_1 (scope, name); ! timevar_stop (TV_NAME_LOOKUP); ! return ret; } /* Same as pushdecl, but define X in binding-level LEVEL. We rely on the caller to set DECL_CONTEXT properly. */ ! static tree ! pushdecl_with_scope_1 (tree x, cxx_scope *level, bool is_friend) { struct cp_binding_level *b; tree function_decl = current_function_decl; current_function_decl = NULL_TREE; if (level->kind == sk_class) { *************** pushdecl_with_scope (tree x, cxx_scope * *** 2039,2047 **** current_binding_level = b; } current_function_decl = function_decl; ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); } /* DECL is a FUNCTION_DECL for a non-member function, which may have other definitions already in place. We get around this by making the value of the identifier point to a list of all the things that --- 2084,2106 ---- current_binding_level = b; } current_function_decl = function_decl; ! return x; } + /* Wrapper for pushdecl_with_scope_1. */ + + tree + pushdecl_with_scope (tree x, cxx_scope *level, bool is_friend) + { + tree ret; + bool subtime = timevar_cond_start (TV_NAME_LOOKUP); + ret = pushdecl_with_scope_1 (x, level, is_friend); + pph_catch_name_lookup (ret); + timevar_cond_stop (TV_NAME_LOOKUP, subtime); + return ret; + } + + /* DECL is a FUNCTION_DECL for a non-member function, which may have other definitions already in place. We get around this by making the value of the identifier point to a list of all the things that *************** pushdecl_with_scope (tree x, cxx_scope * *** 2064,2077 **** it's always DECL (and never something that's not a _DECL). */ static tree ! push_overloaded_decl (tree decl, int flags, bool is_friend) { tree name = DECL_NAME (decl); tree old; tree new_binding; int doing_global = (namespace_bindings_p () || !(flags & PUSH_LOCAL)); - timevar_push (TV_NAME_LOOKUP); if (doing_global) old = namespace_binding (name, DECL_CONTEXT (decl)); else --- 2123,2135 ---- it's always DECL (and never something that's not a _DECL). */ static tree ! push_overloaded_decl_1 (tree decl, int flags, bool is_friend) { tree name = DECL_NAME (decl); tree old; tree new_binding; int doing_global = (namespace_bindings_p () || !(flags & PUSH_LOCAL)); if (doing_global) old = namespace_binding (name, DECL_CONTEXT (decl)); else *************** push_overloaded_decl (tree decl, int fla *** 2109,2115 **** /* If DECL was a redeclaration of FN -- even an invalid one -- pass that information along to our caller. */ if (dup == fn || dup == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, dup); } /* We don't overload implicit built-ins. duplicate_decls() --- 2167,2173 ---- /* If DECL was a redeclaration of FN -- even an invalid one -- pass that information along to our caller. */ if (dup == fn || dup == error_mark_node) ! return dup; } /* We don't overload implicit built-ins. duplicate_decls() *************** push_overloaded_decl (tree decl, int fla *** 2127,2133 **** { error ("previous non-function declaration %q+#D", old); error ("conflicts with function declaration %q#D", decl); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } } --- 2185,2191 ---- { error ("previous non-function declaration %q+#D", old); error ("conflicts with function declaration %q#D", decl); ! return decl; } } *************** push_overloaded_decl (tree decl, int fla *** 2179,2185 **** /* And update the cxx_binding node. */ IDENTIFIER_BINDING (name)->value = new_binding; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } /* We should always find a previous binding in this case. */ --- 2237,2243 ---- /* And update the cxx_binding node. */ IDENTIFIER_BINDING (name)->value = new_binding; ! return decl; } /* We should always find a previous binding in this case. */ *************** push_overloaded_decl (tree decl, int fla *** 2190,2196 **** push_local_binding (name, new_binding, flags); } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } /* Check a non-member using-declaration. Return the name and scope --- 2248,2266 ---- push_local_binding (name, new_binding, flags); } ! return decl; ! } ! ! /* Wrapper for push_overloaded_decl_1. */ ! ! static tree ! push_overloaded_decl (tree decl, int flags, bool is_friend) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = push_overloaded_decl_1 (decl, flags, is_friend); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Check a non-member using-declaration. Return the name and scope *************** poplevel_class (void) *** 2637,2643 **** size_t i; tree shadowed; ! timevar_push (TV_NAME_LOOKUP); gcc_assert (level != 0); /* If we're leaving a toplevel class, cache its binding level. */ --- 2707,2713 ---- size_t i; tree shadowed; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); gcc_assert (level != 0); /* If we're leaving a toplevel class, cache its binding level. */ *************** poplevel_class (void) *** 2661,2667 **** `pushlevel_class' routine. */ gcc_assert (current_binding_level == level); leave_scope (); ! timevar_pop (TV_NAME_LOOKUP); } /* Set INHERITED_VALUE_BINDING_P on BINDING to true or false, as --- 2731,2737 ---- `pushlevel_class' routine. */ gcc_assert (current_binding_level == level); leave_scope (); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Set INHERITED_VALUE_BINDING_P on BINDING to true or false, as *************** pushdecl_class_level (tree x) *** 2705,2717 **** { tree name; bool is_valid = true; /* Do nothing if we're adding to an outer lambda closure type, outer_binding will add it later if it's needed. */ if (current_class_type != class_binding_level->this_entity) return true; ! timevar_push (TV_NAME_LOOKUP); /* Get the name of X. */ if (TREE_CODE (x) == OVERLOAD) name = DECL_NAME (get_first_fn (x)); --- 2775,2788 ---- { tree name; bool is_valid = true; + bool subtime; /* Do nothing if we're adding to an outer lambda closure type, outer_binding will add it later if it's needed. */ if (current_class_type != class_binding_level->this_entity) return true; ! subtime = timevar_cond_start (TV_NAME_LOOKUP); /* Get the name of X. */ if (TREE_CODE (x) == OVERLOAD) name = DECL_NAME (get_first_fn (x)); *************** pushdecl_class_level (tree x) *** 2740,2746 **** input_location = save_location; } } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, is_valid); } /* Return the BINDING (if any) for NAME in SCOPE, which is a class --- 2811,2818 ---- input_location = save_location; } } ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return is_valid; } /* Return the BINDING (if any) for NAME in SCOPE, which is a class *************** get_class_binding (tree name, cxx_scope *** 2807,2827 **** /* Make the declaration(s) of X appear in CLASS scope under the name NAME. Returns true if the binding is valid. */ ! bool ! push_class_level_binding (tree name, tree x) { cxx_binding *binding; tree decl = x; bool ok; - timevar_push (TV_NAME_LOOKUP); /* The class_binding_level will be NULL if x is a template parameter name in a member template. */ if (!class_binding_level) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); if (name == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false); /* Check for invalid member names. */ gcc_assert (TYPE_BEING_DEFINED (current_class_type)); --- 2879,2898 ---- /* Make the declaration(s) of X appear in CLASS scope under the name NAME. Returns true if the binding is valid. */ ! static bool ! push_class_level_binding_1 (tree name, tree x) { cxx_binding *binding; tree decl = x; bool ok; /* The class_binding_level will be NULL if x is a template parameter name in a member template. */ if (!class_binding_level) ! return true; if (name == error_mark_node) ! return false; /* Check for invalid member names. */ gcc_assert (TYPE_BEING_DEFINED (current_class_type)); *************** push_class_level_binding (tree name, tre *** 2836,2842 **** decl = TREE_VALUE (decl); if (!check_template_shadow (decl)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false); /* [class.mem] --- 2907,2913 ---- decl = TREE_VALUE (decl); if (!check_template_shadow (decl)) ! return false; /* [class.mem] *************** push_class_level_binding (tree name, tre *** 2870,2876 **** error ("%qD has the same name as the class in which it is " "declared", x); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false); } } --- 2941,2947 ---- error ("%qD has the same name as the class in which it is " "declared", x); ! return false; } } *************** push_class_level_binding (tree name, tre *** 2921,2931 **** else if (TREE_CODE (x) == OVERLOAD && is_overloaded_fn (bval)) old_decl = bval; else if (TREE_CODE (x) == USING_DECL && TREE_CODE (bval) == USING_DECL) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); else if (TREE_CODE (x) == USING_DECL && is_overloaded_fn (bval)) old_decl = bval; else if (TREE_CODE (bval) == USING_DECL && is_overloaded_fn (x)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); if (old_decl && binding->scope == class_binding_level) { --- 2992,3002 ---- else if (TREE_CODE (x) == OVERLOAD && is_overloaded_fn (bval)) old_decl = bval; else if (TREE_CODE (x) == USING_DECL && TREE_CODE (bval) == USING_DECL) ! return true; else if (TREE_CODE (x) == USING_DECL && is_overloaded_fn (bval)) old_decl = bval; else if (TREE_CODE (bval) == USING_DECL && is_overloaded_fn (x)) ! return true; if (old_decl && binding->scope == class_binding_level) { *************** push_class_level_binding (tree name, tre *** 2934,2940 **** here. This function is only used to register bindings from with the class definition itself. */ INHERITED_VALUE_BINDING_P (binding) = 0; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); } } --- 3005,3011 ---- here. This function is only used to register bindings from with the class definition itself. */ INHERITED_VALUE_BINDING_P (binding) = 0; ! return true; } } *************** push_class_level_binding (tree name, tre *** 2956,2962 **** ok = true; } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ok); } /* Process "using SCOPE::NAME" in a class scope. Return the --- 3027,3045 ---- ok = true; } ! return ok; ! } ! ! /* Wrapper for push_class_level_binding_1. */ ! ! bool ! push_class_level_binding (tree name, tree x) ! { ! bool ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = push_class_level_binding_1 (name, x); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Process "using SCOPE::NAME" in a class scope. Return the *************** do_class_using_decl (tree scope, tree na *** 3074,3081 **** /* Return the binding value for name in scope. */ ! tree ! namespace_binding (tree name, tree scope) { cxx_binding *binding; --- 3157,3165 ---- /* Return the binding value for name in scope. */ ! ! static tree ! namespace_binding_1 (tree name, tree scope) { cxx_binding *binding; *************** namespace_binding (tree name, tree scope *** 3090,3103 **** return binding ? binding->value : NULL_TREE; } /* Set the binding value for name in scope. */ ! void ! set_namespace_binding (tree name, tree scope, tree val) { cxx_binding *b; - timevar_push (TV_NAME_LOOKUP); if (scope == NULL_TREE) scope = global_namespace; b = binding_for_name (NAMESPACE_LEVEL (scope), name); --- 3174,3196 ---- return binding ? binding->value : NULL_TREE; } + tree + namespace_binding (tree name, tree scope) + { + tree ret; + bool subtime = timevar_cond_start (TV_NAME_LOOKUP); + ret = namespace_binding_1 (name, scope); + timevar_cond_stop (TV_NAME_LOOKUP, subtime); + return ret; + } + /* Set the binding value for name in scope. */ ! static void ! set_namespace_binding_1 (tree name, tree scope, tree val) { cxx_binding *b; if (scope == NULL_TREE) scope = global_namespace; b = binding_for_name (NAMESPACE_LEVEL (scope), name); *************** set_namespace_binding (tree name, tree s *** 3105,3111 **** b->value = val; else supplement_binding (b, val); ! timevar_pop (TV_NAME_LOOKUP); } /* Set the context of a declaration to scope. Complain if we are not --- 3198,3213 ---- b->value = val; else supplement_binding (b, val); ! } ! ! /* Wrapper for set_namespace_binding_1. */ ! ! void ! set_namespace_binding (tree name, tree scope, tree val) ! { ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! set_namespace_binding_1 (name, scope, val); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Set the context of a declaration to scope. Complain if we are not *************** push_namespace (tree name) *** 3291,3297 **** int implicit_use = 0; bool anon = !name; ! timevar_push (TV_NAME_LOOKUP); /* We should not get here if the global_namespace is not yet constructed nor if NAME designates the global namespace: The global scope is --- 3393,3399 ---- int implicit_use = 0; bool anon = !name; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); /* We should not get here if the global_namespace is not yet constructed nor if NAME designates the global namespace: The global scope is *************** push_namespace (tree name) *** 3351,3357 **** /* Enter the name space. */ current_namespace = d; ! timevar_pop (TV_NAME_LOOKUP); } /* Pop from the scope of the current namespace. */ --- 3453,3459 ---- /* Enter the name space. */ current_namespace = d; ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Pop from the scope of the current namespace. */ *************** push_nested_namespace (tree ns) *** 3386,3392 **** void pop_nested_namespace (tree ns) { ! timevar_push (TV_NAME_LOOKUP); gcc_assert (current_namespace == ns); while (ns != global_namespace) { --- 3488,3494 ---- void pop_nested_namespace (tree ns) { ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); gcc_assert (current_namespace == ns); while (ns != global_namespace) { *************** pop_nested_namespace (tree ns) *** 3395,3401 **** } pop_from_top_level (); ! timevar_pop (TV_NAME_LOOKUP); } /* Temporarily set the namespace for the current declaration. */ --- 3497,3503 ---- } pop_from_top_level (); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Temporarily set the namespace for the current declaration. */ *************** pop_decl_namespace (void) *** 3420,3432 **** of two given namespaces. */ static tree ! namespace_ancestor (tree ns1, tree ns2) { ! timevar_push (TV_NAME_LOOKUP); if (is_ancestor (ns1, ns2)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ns1); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ! namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2)); } /* Process a namespace-alias declaration. */ --- 3522,3547 ---- of two given namespaces. */ static tree ! namespace_ancestor_1 (tree ns1, tree ns2) { ! tree nsr; if (is_ancestor (ns1, ns2)) ! nsr = ns1; ! else ! nsr = namespace_ancestor_1 (CP_DECL_CONTEXT (ns1), ns2); ! return nsr; ! } ! ! /* Wrapper for namespace_ancestor_1. */ ! ! static tree ! namespace_ancestor (tree ns1, tree ns2) ! { ! tree nsr; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! nsr = namespace_ancestor_1 (ns1, ns2); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return nsr; } /* Process a namespace-alias declaration. */ *************** pushdecl_namespace_level (tree x, bool i *** 3462,3468 **** struct cp_binding_level *b = current_binding_level; tree t; ! timevar_push (TV_NAME_LOOKUP); t = pushdecl_with_scope (x, NAMESPACE_LEVEL (current_namespace), is_friend); /* Now, the type_shadowed stack may screw us. Munge it so it does --- 3577,3583 ---- struct cp_binding_level *b = current_binding_level; tree t; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); t = pushdecl_with_scope (x, NAMESPACE_LEVEL (current_namespace), is_friend); /* Now, the type_shadowed stack may screw us. Munge it so it does *************** pushdecl_namespace_level (tree x, bool i *** 3496,3518 **** *ptr = newval; } } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } /* Insert USED into the using list of USER. Set INDIRECT_flag if this directive is not directly from the source. Also find the common ancestor and let our users know about the new namespace */ static void ! add_using_namespace (tree user, tree used, bool indirect) { tree t; - timevar_push (TV_NAME_LOOKUP); /* Using oneself is a no-op. */ if (user == used) ! { ! timevar_pop (TV_NAME_LOOKUP); ! return; ! } gcc_assert (TREE_CODE (user) == NAMESPACE_DECL); gcc_assert (TREE_CODE (used) == NAMESPACE_DECL); /* Check if we already have this. */ --- 3611,3631 ---- *ptr = newval; } } ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return t; } /* Insert USED into the using list of USER. Set INDIRECT_flag if this directive is not directly from the source. Also find the common ancestor and let our users know about the new namespace */ + static void ! add_using_namespace_1 (tree user, tree used, bool indirect) { tree t; /* Using oneself is a no-op. */ if (user == used) ! return; gcc_assert (TREE_CODE (user) == NAMESPACE_DECL); gcc_assert (TREE_CODE (used) == NAMESPACE_DECL); /* Check if we already have this. */ *************** add_using_namespace (tree user, tree use *** 3522,3528 **** if (!indirect) /* Promote to direct usage. */ TREE_INDIRECT_USING (t) = 0; - timevar_pop (TV_NAME_LOOKUP); return; } --- 3635,3640 ---- *************** add_using_namespace (tree user, tree use *** 3540,3551 **** /* Recursively add all namespaces used. */ for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t)) /* indirect usage */ ! add_using_namespace (user, TREE_PURPOSE (t), 1); /* Tell everyone using us about the new used namespaces. */ for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t)) ! add_using_namespace (TREE_PURPOSE (t), used, 1); ! timevar_pop (TV_NAME_LOOKUP); } /* Process a using-declaration not appearing in class or local scope. */ --- 3652,3672 ---- /* Recursively add all namespaces used. */ for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t)) /* indirect usage */ ! add_using_namespace_1 (user, TREE_PURPOSE (t), 1); /* Tell everyone using us about the new used namespaces. */ for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t)) ! add_using_namespace_1 (TREE_PURPOSE (t), used, 1); ! } ! ! /* Wrapper for add_using_namespace_1. */ ! ! static void ! add_using_namespace (tree user, tree used, bool indirect) ! { ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! add_using_namespace_1 (user, used, indirect); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Process a using-declaration not appearing in class or local scope. */ *************** parse_using_directive (tree name_space, *** 3652,3664 **** static tree pushdecl_top_level_1 (tree x, tree *init, bool is_friend) { ! timevar_push (TV_NAME_LOOKUP); push_to_top_level (); x = pushdecl_namespace_level (x, is_friend); if (init) cp_finish_decl (x, *init, false, NULL_TREE, 0); pop_from_top_level (); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); } /* Like pushdecl, only it places X in the global scope if appropriate. */ --- 3773,3786 ---- static tree pushdecl_top_level_1 (tree x, tree *init, bool is_friend) { ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); push_to_top_level (); x = pushdecl_namespace_level (x, is_friend); if (init) cp_finish_decl (x, *init, false, NULL_TREE, 0); pop_from_top_level (); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return x; } /* Like pushdecl, only it places X in the global scope if appropriate. */ *************** suggest_alternatives_for (location_t loc *** 3994,4000 **** considering using-directives. */ static tree ! unqualified_namespace_lookup (tree name, int flags) { tree initial = current_decl_namespace (); tree scope = initial; --- 4116,4122 ---- considering using-directives. */ static tree ! unqualified_namespace_lookup_1 (tree name, int flags) { tree initial = current_decl_namespace (); tree scope = initial; *************** unqualified_namespace_lookup (tree name, *** 4002,4009 **** struct cp_binding_level *level; tree val = NULL_TREE; - timevar_push (TV_NAME_LOOKUP); - for (; !val; scope = CP_DECL_CONTEXT (scope)) { struct scope_binding binding = EMPTY_SCOPE_BINDING; --- 4124,4129 ---- *************** unqualified_namespace_lookup (tree name, *** 4020,4026 **** if (!lookup_using_namespace (name, &binding, level->using_directives, scope, flags)) /* Give up because of error. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); /* Add all _DECLs seen through global using-directives. */ /* XXX local and global using lists should work equally. */ --- 4140,4146 ---- if (!lookup_using_namespace (name, &binding, level->using_directives, scope, flags)) /* Give up because of error. */ ! return error_mark_node; /* Add all _DECLs seen through global using-directives. */ /* XXX local and global using lists should work equally. */ *************** unqualified_namespace_lookup (tree name, *** 4031,4037 **** DECL_NAMESPACE_USING (siter), scope, flags)) /* Give up because of error. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); if (siter == scope) break; siter = CP_DECL_CONTEXT (siter); } --- 4151,4157 ---- DECL_NAMESPACE_USING (siter), scope, flags)) /* Give up because of error. */ ! return error_mark_node; if (siter == scope) break; siter = CP_DECL_CONTEXT (siter); } *************** unqualified_namespace_lookup (tree name, *** 4040,4046 **** if (scope == global_namespace) break; } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); } /* Look up NAME (an IDENTIFIER_NODE) in SCOPE (either a NAMESPACE_DECL --- 4160,4178 ---- if (scope == global_namespace) break; } ! return val; ! } ! ! /* Wrapper for unqualified_namespace_lookup_1. */ ! ! static tree ! unqualified_namespace_lookup (tree name, int flags) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = unqualified_namespace_lookup_1 (name, flags); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Look up NAME (an IDENTIFIER_NODE) in SCOPE (either a NAMESPACE_DECL *************** lookup_using_namespace (tree name, struc *** 4090,4096 **** tree usings, tree scope, int flags) { tree iter; ! timevar_push (TV_NAME_LOOKUP); /* Iterate over all used namespaces in current, searching for using directives of scope. */ for (iter = usings; iter; iter = TREE_CHAIN (iter)) --- 4222,4228 ---- tree usings, tree scope, int flags) { tree iter; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); /* Iterate over all used namespaces in current, searching for using directives of scope. */ for (iter = usings; iter; iter = TREE_CHAIN (iter)) *************** lookup_using_namespace (tree name, struc *** 4103,4109 **** if (val1) ambiguous_decl (val, val1, flags); } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val->value != error_mark_node); } /* Returns true iff VEC contains TARGET. */ --- 4235,4242 ---- if (val1) ambiguous_decl (val, val1, flags); } ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return val->value != error_mark_node; } /* Returns true iff VEC contains TARGET. */ *************** qualified_lookup_using_namespace (tree n *** 4136,4142 **** VEC(tree,gc) *todo_maybe = NULL; VEC(tree,gc) *todo_inline = NULL; tree usings; ! timevar_push (TV_NAME_LOOKUP); /* Look through namespace aliases. */ scope = ORIGINAL_NAMESPACE (scope); --- 4269,4275 ---- VEC(tree,gc) *todo_maybe = NULL; VEC(tree,gc) *todo_inline = NULL; tree usings; ! timevar_start (TV_NAME_LOOKUP); /* Look through namespace aliases. */ scope = ORIGINAL_NAMESPACE (scope); *************** qualified_lookup_using_namespace (tree n *** 4195,4201 **** VEC_free (tree,gc,todo_inline); VEC_free (tree,gc,seen); VEC_free (tree,gc,seen_inline); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, result->value != error_mark_node); } /* Subroutine of outer_binding. --- 4328,4335 ---- VEC_free (tree,gc,todo_inline); VEC_free (tree,gc,seen); VEC_free (tree,gc,seen_inline); ! timevar_stop (TV_NAME_LOOKUP); ! return result->value != error_mark_node; } /* Subroutine of outer_binding. *************** innermost_non_namespace_value (tree name *** 4315,4328 **** If NONCLASS is nonzero, bindings in class scopes are ignored. If BLOCK_P is false, bindings in block scopes are ignored. */ ! tree ! lookup_name_real (tree name, int prefer_type, int nonclass, bool block_p, ! int namespaces_only, int flags) { cxx_binding *iter; tree val = NULL_TREE; - timevar_push (TV_NAME_LOOKUP); /* Conversion operators are handled specially because ordinary unqualified name lookup will not find template conversion operators. */ --- 4449,4461 ---- If NONCLASS is nonzero, bindings in class scopes are ignored. If BLOCK_P is false, bindings in block scopes are ignored. */ ! static tree ! lookup_name_real_1 (tree name, int prefer_type, int nonclass, bool block_p, ! int namespaces_only, int flags) { cxx_binding *iter; tree val = NULL_TREE; /* Conversion operators are handled specially because ordinary unqualified name lookup will not find template conversion operators. */ *************** lookup_name_real (tree name, int prefer_ *** 4346,4355 **** class_type = level->this_entity; operators = lookup_fnfields (class_type, name, /*protect=*/0); if (operators) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, operators); } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); } flags |= lookup_flags (prefer_type, namespaces_only); --- 4479,4488 ---- class_type = level->this_entity; operators = lookup_fnfields (class_type, name, /*protect=*/0); if (operators) ! return operators; } ! return NULL_TREE; } flags |= lookup_flags (prefer_type, namespaces_only); *************** lookup_name_real (tree name, int prefer_ *** 4444,4450 **** if (val && TREE_CODE (val) == OVERLOAD && !really_overloaded_fn (val)) val = OVL_FUNCTION (val); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); } tree --- 4577,4597 ---- if (val && TREE_CODE (val) == OVERLOAD && !really_overloaded_fn (val)) val = OVL_FUNCTION (val); ! return val; ! } ! ! /* Wrapper for lookup_name_real_1. */ ! ! tree ! lookup_name_real (tree name, int prefer_type, int nonclass, bool block_p, ! int namespaces_only, int flags) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = lookup_name_real_1 (name, prefer_type, nonclass, block_p, ! namespaces_only, flags); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } tree *************** lookup_name_prefer_type (tree name, int *** 4491,4504 **** A TYPE_DECL best matching the NAME is returned. Catching error and issuing diagnostics are caller's responsibility. */ ! tree ! lookup_type_scope (tree name, tag_scope scope) { cxx_binding *iter = NULL; tree val = NULL_TREE; - timevar_push (TV_NAME_LOOKUP); - /* Look in non-namespace scope first. */ if (current_binding_level->kind != sk_namespace) iter = outer_binding (name, NULL, /*class_p=*/ true); --- 4638,4649 ---- A TYPE_DECL best matching the NAME is returned. Catching error and issuing diagnostics are caller's responsibility. */ ! static tree ! lookup_type_scope_1 (tree name, tag_scope scope) { cxx_binding *iter = NULL; tree val = NULL_TREE; /* Look in non-namespace scope first. */ if (current_binding_level->kind != sk_namespace) iter = outer_binding (name, NULL, /*class_p=*/ true); *************** lookup_type_scope (tree name, tag_scope *** 4553,4559 **** while (b) { if (iter->scope == b) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); if (b->kind == sk_cleanup || b->kind == sk_template_parms || b->kind == sk_function_parms) --- 4698,4704 ---- while (b) { if (iter->scope == b) ! return val; if (b->kind == sk_cleanup || b->kind == sk_template_parms || b->kind == sk_function_parms) *************** lookup_type_scope (tree name, tag_scope *** 4566,4579 **** } } ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); } /* Similar to `lookup_name' but look only in the innermost non-class binding level. */ ! tree ! lookup_name_innermost_nonclass_level (tree name) { struct cp_binding_level *b; tree t = NULL_TREE; --- 4711,4738 ---- } } ! return NULL_TREE; ! } ! ! /* Wrapper for lookup_type_scope_1. */ ! ! tree ! lookup_type_scope (tree name, tag_scope scope) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = lookup_type_scope_1 (name, scope); ! pph_catch_name_lookup (ret); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } + /* Similar to `lookup_name' but look only in the innermost non-class binding level. */ ! static tree ! lookup_name_innermost_nonclass_level_1 (tree name) { struct cp_binding_level *b; tree t = NULL_TREE; *************** lookup_name_innermost_nonclass_level (tr *** 4599,4605 **** if (binding->scope == b && !(TREE_CODE (binding->value) == VAR_DECL && DECL_DEAD_FOR_LOCAL (binding->value))) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, binding->value); if (b->kind == sk_cleanup) b = b->level_chain; --- 4758,4764 ---- if (binding->scope == b && !(TREE_CODE (binding->value) == VAR_DECL && DECL_DEAD_FOR_LOCAL (binding->value))) ! return binding->value; if (b->kind == sk_cleanup) b = b->level_chain; *************** lookup_name_innermost_nonclass_level (tr *** 4608,4616 **** } } ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } /* Returns true iff DECL is a block-scope extern declaration of a function or variable. */ --- 4767,4789 ---- } } ! return t; ! } ! ! /* Wrapper for lookup_name_innermost_nonclass_level_1. */ ! ! tree ! lookup_name_innermost_nonclass_level (tree name) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = lookup_name_innermost_nonclass_level_1 (name); ! pph_catch_name_lookup (ret); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } + /* Returns true iff DECL is a block-scope extern declaration of a function or variable. */ *************** lookup_type_current_level (tree name) *** 4646,4652 **** { tree t = NULL_TREE; ! timevar_push (TV_NAME_LOOKUP); gcc_assert (current_binding_level->kind != sk_namespace); if (REAL_IDENTIFIER_TYPE_VALUE (name) != NULL_TREE --- 4819,4825 ---- { tree t = NULL_TREE; ! timevar_start (TV_NAME_LOOKUP); gcc_assert (current_binding_level->kind != sk_namespace); if (REAL_IDENTIFIER_TYPE_VALUE (name) != NULL_TREE *************** lookup_type_current_level (tree name) *** 4656,4663 **** while (1) { if (purpose_member (name, b->type_shadowed)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ! REAL_IDENTIFIER_TYPE_VALUE (name)); if (b->kind == sk_cleanup) b = b->level_chain; else --- 4829,4838 ---- while (1) { if (purpose_member (name, b->type_shadowed)) ! { ! t = REAL_IDENTIFIER_TYPE_VALUE (name); ! break; ! } if (b->kind == sk_cleanup) b = b->level_chain; else *************** lookup_type_current_level (tree name) *** 4665,4671 **** } } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } /* [basic.lookup.koenig] */ --- 4840,4847 ---- } } ! timevar_stop (TV_NAME_LOOKUP); ! return t; } /* [basic.lookup.koenig] */ *************** arg_assoc (struct arg_lookup *k, tree n) *** 5133,5146 **** /* Performs Koenig lookup depending on arguments, where fns are the functions found in normal lookup. */ ! tree ! lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args, ! bool include_std) { struct arg_lookup k; - timevar_push (TV_NAME_LOOKUP); - /* Remove any hidden friend functions from the list of functions found so far. They will be added back by arg_assoc_class as appropriate. */ --- 5309,5320 ---- /* Performs Koenig lookup depending on arguments, where fns are the functions found in normal lookup. */ ! static tree ! lookup_arg_dependent_1 (tree name, tree fns, VEC(tree,gc) *args, ! bool include_std) { struct arg_lookup k; /* Remove any hidden friend functions from the list of functions found so far. They will be added back by arg_assoc_class as appropriate. */ *************** lookup_arg_dependent (tree name, tree fn *** 5176,5198 **** release_tree_vector (k.classes); release_tree_vector (k.namespaces); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fns); } /* Add namespace to using_directives. Return NULL_TREE if nothing was changed (i.e. there was already a directive), or the fresh TREE_LIST otherwise. */ static tree ! push_using_directive (tree used) { tree ud = current_binding_level->using_directives; tree iter, ancestor; - timevar_push (TV_NAME_LOOKUP); /* Check if we already have this. */ if (purpose_member (used, ud) != NULL_TREE) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ancestor = namespace_ancestor (current_decl_namespace (), used); ud = current_binding_level->using_directives; --- 5350,5386 ---- release_tree_vector (k.classes); release_tree_vector (k.namespaces); ! return fns; ! } ! ! /* Wrapper for lookup_arg_dependent_1. */ ! ! tree ! lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args, ! bool include_std) ! { ! tree ret; ! timevar_start (TV_NAME_LOOKUP); ! ret = lookup_arg_dependent_1 (name, fns, args, include_std); ! pph_catch_name_lookup (ret); ! timevar_stop (TV_NAME_LOOKUP); ! return ret; } + /* Add namespace to using_directives. Return NULL_TREE if nothing was changed (i.e. there was already a directive), or the fresh TREE_LIST otherwise. */ static tree ! push_using_directive_1 (tree used) { tree ud = current_binding_level->using_directives; tree iter, ancestor; /* Check if we already have this. */ if (purpose_member (used, ud) != NULL_TREE) ! return NULL_TREE; ancestor = namespace_ancestor (current_decl_namespace (), used); ud = current_binding_level->using_directives; *************** push_using_directive (tree used) *** 5203,5209 **** for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter)) push_using_directive (TREE_PURPOSE (iter)); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ud); } /* The type TYPE is being declared. If it is a class template, or a --- 5391,5410 ---- for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter)) push_using_directive (TREE_PURPOSE (iter)); ! return ud; ! } ! ! /* Wrapper for push_using_directive_1. */ ! ! static tree ! push_using_directive (tree used) ! { ! tree ret; ! timevar_start (TV_NAME_LOOKUP); ! ret = push_using_directive_1 (used); ! pph_catch_name_lookup (ret); ! timevar_stop (TV_NAME_LOOKUP); ! return ret; } /* The type TYPE is being declared. If it is a class template, or a *************** maybe_process_template_type_declaration *** 5296,5308 **** Returns TYPE upon success and ERROR_MARK_NODE otherwise. */ ! tree ! pushtag (tree name, tree type, tag_scope scope) { struct cp_binding_level *b; tree decl; - timevar_push (TV_NAME_LOOKUP); b = current_binding_level; while (/* Cleanup scopes are not scopes from the point of view of the language. */ --- 5497,5508 ---- Returns TYPE upon success and ERROR_MARK_NODE otherwise. */ ! static tree ! pushtag_1 (tree name, tree type, tag_scope scope) { struct cp_binding_level *b; tree decl; b = current_binding_level; while (/* Cleanup scopes are not scopes from the point of view of the language. */ *************** pushtag (tree name, tree type, tag_scope *** 5327,5333 **** gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); /* Do C++ gratuitous typedefing. */ ! if (IDENTIFIER_TYPE_VALUE (name) != type) { tree tdef; int in_class = 0; --- 5527,5533 ---- gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); /* Do C++ gratuitous typedefing. */ ! if (identifier_type_value_1 (name) != type) { tree tdef; int in_class = 0; *************** pushtag (tree name, tree type, tag_scope *** 5373,5384 **** decl = maybe_process_template_type_declaration (type, scope == ts_within_enclosing_non_class, b); if (decl == error_mark_node) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); if (b->kind == sk_class) { if (!TYPE_BEING_DEFINED (current_class_type)) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); if (!PROCESSING_REAL_TEMPLATE_DECL_P ()) /* Put this TYPE_DECL on the TYPE_FIELDS list for the --- 5573,5584 ---- decl = maybe_process_template_type_declaration (type, scope == ts_within_enclosing_non_class, b); if (decl == error_mark_node) ! return decl; if (b->kind == sk_class) { if (!TYPE_BEING_DEFINED (current_class_type)) ! return error_mark_node; if (!PROCESSING_REAL_TEMPLATE_DECL_P ()) /* Put this TYPE_DECL on the TYPE_FIELDS list for the *************** pushtag (tree name, tree type, tag_scope *** 5393,5399 **** { decl = pushdecl_with_scope (decl, b, /*is_friend=*/false); if (decl == error_mark_node) ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } if (! in_class) --- 5593,5599 ---- { decl = pushdecl_with_scope (decl, b, /*is_friend=*/false); if (decl == error_mark_node) ! return decl; } if (! in_class) *************** pushtag (tree name, tree type, tag_scope *** 5432,5438 **** TREE_PUBLIC (decl) = 1; determine_visibility (decl); ! PPH_POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, type); } /* Subroutines for reverting temporarily to top-level for instantiation --- 5632,5651 ---- TREE_PUBLIC (decl) = 1; determine_visibility (decl); ! return type; ! } ! ! /* Wrapper for pushtag_1. */ ! ! tree ! pushtag (tree name, tree type, tag_scope scope) ! { ! tree ret; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); ! ret = pushtag_1 (name, type, scope); ! pph_catch_name_lookup (ret); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); ! return ret; } /* Subroutines for reverting temporarily to top-level for instantiation *************** store_bindings (tree names, VEC(cxx_save *** 5470,5476 **** { tree t; ! timevar_push (TV_NAME_LOOKUP); for (t = names; t; t = TREE_CHAIN (t)) { tree id; --- 5683,5689 ---- { tree t; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); for (t = names; t; t = TREE_CHAIN (t)) { tree id; *************** store_bindings (tree names, VEC(cxx_save *** 5482,5488 **** store_binding (id, old_bindings); } ! timevar_pop (TV_NAME_LOOKUP); } /* Like store_bindings, but NAMES is a vector of cp_class_binding --- 5695,5701 ---- store_binding (id, old_bindings); } ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } /* Like store_bindings, but NAMES is a vector of cp_class_binding *************** store_class_bindings (VEC(cp_class_bindi *** 5495,5504 **** size_t i; cp_class_binding *cb; ! timevar_push (TV_NAME_LOOKUP); for (i = 0; VEC_iterate(cp_class_binding, names, i, cb); ++i) store_binding (cb->identifier, old_bindings); ! timevar_pop (TV_NAME_LOOKUP); } void --- 5708,5717 ---- size_t i; cp_class_binding *cb; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); for (i = 0; VEC_iterate(cp_class_binding, names, i, cb); ++i) store_binding (cb->identifier, old_bindings); ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } void *************** push_to_top_level (void) *** 5510,5516 **** size_t i; bool need_pop; ! timevar_push (TV_NAME_LOOKUP); s = ggc_alloc_cleared_saved_scope (); b = scope_chain ? current_binding_level : 0; --- 5723,5729 ---- size_t i; bool need_pop; ! bool subtime = timevar_cond_start (TV_NAME_LOOKUP); s = ggc_alloc_cleared_saved_scope (); b = scope_chain ? current_binding_level : 0; *************** push_to_top_level (void) *** 5570,5586 **** push_class_stack (); cp_unevaluated_operand = 0; c_inhibit_evaluation_warnings = 0; ! timevar_pop (TV_NAME_LOOKUP); } ! void ! pop_from_top_level (void) { struct saved_scope *s = scope_chain; cxx_saved_binding *saved; size_t i; - timevar_push (TV_NAME_LOOKUP); /* Clear out class-level bindings cache. */ if (previous_class_level) invalidate_class_lookup_cache (); --- 5783,5798 ---- push_class_stack (); cp_unevaluated_operand = 0; c_inhibit_evaluation_warnings = 0; ! timevar_cond_stop (TV_NAME_LOOKUP, subtime); } ! static void ! pop_from_top_level_1 (void) { struct saved_scope *s = scope_chain; cxx_saved_binding *saved; size_t i; /* Clear out class-level bindings cache. */ if (previous_class_level) invalidate_class_lookup_cache (); *************** pop_from_top_level (void) *** 5604,5612 **** current_function_decl = s->function_decl; cp_unevaluated_operand = s->unevaluated_operand; c_inhibit_evaluation_warnings = s->inhibit_evaluation_warnings; - timevar_pop (TV_NAME_LOOKUP); } /* Pop off extraneous binding levels left over due to syntax errors. We don't pop past namespaces, as they might be valid. */ --- 5816,5834 ---- current_function_decl = s->function_decl; cp_unevaluated_operand = s->unevaluated_operand; c_inhibit_evaluation_warnings = s->inhibit_evaluation_warnings; } + /* Wrapper for pop_from_top_level_1. */ + + void + pop_from_top_level (void) + { + bool subtime = timevar_cond_start (TV_NAME_LOOKUP); + pop_from_top_level_1 (); + timevar_cond_stop (TV_NAME_LOOKUP, subtime); + } + + /* Pop off extraneous binding levels left over due to syntax errors. We don't pop past namespaces, as they might be valid. */ Index: gcc/timevar.def =================================================================== *** gcc/timevar.def (revision 169185) --- gcc/timevar.def (working copy) *************** *** 33,41 **** /* The total execution time. */ DEFTIMEVAR (TV_TOTAL , "total time") /* Time spent garbage-collecting. */ ! DEFTIMEVAR (TV_GC , "garbage collection") /* Time spent generating dump files. */ DEFTIMEVAR (TV_DUMP , "dump files") --- 33,50 ---- /* The total execution time. */ DEFTIMEVAR (TV_TOTAL , "total time") + DEFTIMEVAR (TV_PHASE_SETUP , "phase setup") + DEFTIMEVAR (TV_PHASE_PARSING , "phase parsing") + DEFTIMEVAR (TV_PHASE_C_WRAPUP_CHECK , "phase C wrapup & check") + DEFTIMEVAR (TV_PHASE_CP_DEFERRED , "phase C++ deferred") + DEFTIMEVAR (TV_PHASE_CGRAPH , "phase cgraph") + DEFTIMEVAR (TV_PHASE_DBGINFO , "phase debug info") + DEFTIMEVAR (TV_PHASE_CHECK_DBGINFO , "phase check & debug info") + DEFTIMEVAR (TV_PHASE_GENERATE , "phase generate") + DEFTIMEVAR (TV_PHASE_FINALIZE , "phase finalize") /* Time spent garbage-collecting. */ ! DEFTIMEVAR (TV_GC , "|garbage collection") /* Time spent generating dump files. */ DEFTIMEVAR (TV_DUMP , "dump files") *************** DEFTIMEVAR (TV_REBUILD_JUMP , "rebu *** 117,124 **** /* Timing in various stages of the compiler. */ DEFTIMEVAR (TV_CPP , "preprocessing") DEFTIMEVAR (TV_LEX , "lexical analysis") ! DEFTIMEVAR (TV_PARSE , "parser") ! DEFTIMEVAR (TV_NAME_LOOKUP , "name lookup") DEFTIMEVAR (TV_INLINE_HEURISTICS , "inline heuristics") DEFTIMEVAR (TV_INTEGRATION , "integration") DEFTIMEVAR (TV_TREE_GIMPLIFY , "tree gimplify") --- 126,139 ---- /* Timing in various stages of the compiler. */ DEFTIMEVAR (TV_CPP , "preprocessing") DEFTIMEVAR (TV_LEX , "lexical analysis") ! DEFTIMEVAR (TV_PARSE_GLOBAL , "parser (global)") ! DEFTIMEVAR (TV_PARSE_STRUCT , "parser struct body") ! DEFTIMEVAR (TV_PARSE_ENUM , "parser enumerator list") ! DEFTIMEVAR (TV_PARSE_FUNC , "parser function body") ! DEFTIMEVAR (TV_PARSE_INMETH , "parser inl. meth. body") ! DEFTIMEVAR (TV_INSTANTIATE_TEMPLATE , "instantiate template") ! DEFTIMEVAR (TV_NAME_LOOKUP , "|name lookup") ! DEFTIMEVAR (TV_RESOLVE_OVERLOAD , "|overload resolution") DEFTIMEVAR (TV_INLINE_HEURISTICS , "inline heuristics") DEFTIMEVAR (TV_INTEGRATION , "integration") DEFTIMEVAR (TV_TREE_GIMPLIFY , "tree gimplify") *************** DEFTIMEVAR (TV_CGRAPH_VERIFY , " *** 185,192 **** DEFTIMEVAR (TV_DOM_FRONTIERS , "dominance frontiers") DEFTIMEVAR (TV_DOMINANCE , "dominance computation") DEFTIMEVAR (TV_CONTROL_DEPENDENCES , "control dependences") - DEFTIMEVAR (TV_OVERLOAD , "overload resolution") - DEFTIMEVAR (TV_TEMPLATE_INSTANTIATION, "template instantiation") DEFTIMEVAR (TV_OUT_OF_SSA , "out of ssa") DEFTIMEVAR (TV_VAR_EXPAND , "expand vars") DEFTIMEVAR (TV_EXPAND , "expand") --- 200,205 ---- Index: gcc/timevar.c =================================================================== *** gcc/timevar.c (revision 169185) --- gcc/timevar.c (working copy) *************** timevar_stop (timevar_id_t timevar) *** 361,366 **** --- 361,419 ---- /* TIMEVAR must have been started via timevar_start. */ gcc_assert (tv->standalone); + tv->standalone = 0; /* Enable a restart. */ + + get_time (&now); + timevar_accumulate (&tv->elapsed, &tv->start_time, &now); + } + + /* Conditionally start timing TIMEVAR independently of the timing stack. + If the timer is already running, leave it running and return true. + Otherwise, start the timer and return false. + Elapsed time until the corresponding timevar_cond_stop + is called for the same timing variable is attributed to TIMEVAR. */ + + bool + timevar_cond_start (timevar_id_t timevar) + { + struct timevar_def *tv = &timevars[timevar]; + + if (!timevar_enable) + return false; + + /* Mark this timing variable as used. */ + tv->used = 1; + + if (tv->standalone) + return true; /* The timevar is already running. */ + + /* Don't allow the same timing variable + to be unconditionally started more than once. */ + tv->standalone = 1; + + get_time (&tv->start_time); + return false; /* The timevar was not already running. */ + } + + /* Conditionally stop timing TIMEVAR. The RUNNING parameter must come + from the return value of a dynamically matching timevar_cond_start. + If the timer had already been RUNNING, do nothing. Otherwise, time + elapsed since timevar_cond_start was called is attributed to it. */ + + void + timevar_cond_stop (timevar_id_t timevar, bool running) + { + struct timevar_def *tv; + struct timevar_time_def now; + + if (!timevar_enable || running) + return; + + tv = &timevars[timevar]; + + /* TIMEVAR must have been started via timevar_cond_start. */ + gcc_assert (tv->standalone); + tv->standalone = 0; /* Enable a restart. */ get_time (&now); timevar_accumulate (&tv->elapsed, &tv->start_time, &now); Index: gcc/timevar.h =================================================================== *** gcc/timevar.h (revision 169185) --- gcc/timevar.h (working copy) *************** extern bool timevar_enable; *** 87,100 **** /* Total amount of memory allocated by garbage collector. */ extern size_t timevar_ggc_mem_total; - /* Execute the sequence: timevar_pop (TV), return (E); */ - #define POP_TIMEVAR_AND_RETURN(TV, E) do { timevar_pop (TV); return (E); }while(0) - extern void timevar_init (void); extern void timevar_push_1 (timevar_id_t); extern void timevar_pop_1 (timevar_id_t); extern void timevar_start (timevar_id_t); extern void timevar_stop (timevar_id_t); extern void timevar_print (FILE *); /* Provided for backward compatibility. */ --- 87,99 ---- /* Total amount of memory allocated by garbage collector. */ extern size_t timevar_ggc_mem_total; extern void timevar_init (void); extern void timevar_push_1 (timevar_id_t); extern void timevar_pop_1 (timevar_id_t); extern void timevar_start (timevar_id_t); extern void timevar_stop (timevar_id_t); + extern bool timevar_cond_start (timevar_id_t); + extern void timevar_cond_stop (timevar_id_t, bool); extern void timevar_print (FILE *); /* Provided for backward compatibility. */ Index: gcc/c-decl.c =================================================================== *** gcc/c-decl.c (revision 169185) --- gcc/c-decl.c (working copy) *************** c_write_global_declarations (void) *** 9797,9802 **** --- 9797,9804 ---- if (pch_file) return; + timevar_start (TV_PHASE_C_WRAPUP_CHECK); + /* Do the Objective-C stuff. This is where all the Objective-C module stuff gets generated (symtab, class/protocol/selector lists etc). */ *************** c_write_global_declarations (void) *** 9838,9847 **** --- 9840,9855 ---- c_write_global_declarations_1 (BLOCK_VARS (DECL_INITIAL (t))); c_write_global_declarations_1 (BLOCK_VARS (ext_block)); + timevar_stop (TV_PHASE_C_WRAPUP_CHECK); + timevar_start (TV_PHASE_CGRAPH); + /* We're done parsing; proceed to optimize and emit assembly. FIXME: shouldn't be the front end's responsibility to call this. */ cgraph_finalize_compilation_unit (); + timevar_stop (TV_PHASE_CGRAPH); + timevar_start (TV_PHASE_DBGINFO); + /* After cgraph has had a chance to emit everything that's going to be emitted, output debug information for globals. */ if (!seen_error ()) *************** c_write_global_declarations (void) *** 9854,9859 **** --- 9862,9868 ---- } ext_block = NULL; + timevar_stop (TV_PHASE_DBGINFO); } /* Register reserved keyword WORD as qualifier for address space AS. */ Index: gcc/ggc-zone.c =================================================================== *** gcc/ggc-zone.c (revision 169185) --- gcc/ggc-zone.c (working copy) *************** ggc_collect (void) *** 1984,1990 **** struct alloc_zone *zone; bool marked = false; ! timevar_push (TV_GC); if (!ggc_force_collect) { --- 1984,1990 ---- struct alloc_zone *zone; bool marked = false; ! timevar_start (TV_GC); if (!ggc_force_collect) { *************** ggc_collect (void) *** 2003,2009 **** if (allocated < allocated_last_gc + min_expand) { ! timevar_pop (TV_GC); return; } } --- 2003,2009 ---- if (allocated < allocated_last_gc + min_expand) { ! timevar_stop (TV_GC); return; } } *************** ggc_collect (void) *** 2076,2082 **** invoke_plugin_callbacks (PLUGIN_GGC_END, NULL); ! timevar_pop (TV_GC); } /* Print allocation statistics. */ --- 2076,2082 ---- invoke_plugin_callbacks (PLUGIN_GGC_END, NULL); ! timevar_stop (TV_GC); } /* Print allocation statistics. */ Index: gcc/ggc-page.c =================================================================== *** gcc/ggc-page.c (revision 169185) --- gcc/ggc-page.c (working copy) *************** ggc_collect (void) *** 1911,1917 **** if (G.allocated < allocated_last_gc + min_expand && !ggc_force_collect) return; ! timevar_push (TV_GC); if (!quiet_flag) fprintf (stderr, " {GC %luk -> ", (unsigned long) G.allocated / 1024); if (GGC_DEBUG_LEVEL >= 2) --- 1911,1917 ---- if (G.allocated < allocated_last_gc + min_expand && !ggc_force_collect) return; ! timevar_start (TV_GC); if (!quiet_flag) fprintf (stderr, " {GC %luk -> ", (unsigned long) G.allocated / 1024); if (GGC_DEBUG_LEVEL >= 2) *************** ggc_collect (void) *** 1943,1949 **** invoke_plugin_callbacks (PLUGIN_GGC_END, NULL); ! timevar_pop (TV_GC); if (!quiet_flag) fprintf (stderr, "%luk}", (unsigned long) G.allocated / 1024); --- 1943,1949 ---- invoke_plugin_callbacks (PLUGIN_GGC_END, NULL); ! timevar_stop (TV_GC); if (!quiet_flag) fprintf (stderr, "%luk}", (unsigned long) G.allocated / 1024); Index: gcc/c-parser.c =================================================================== *** gcc/c-parser.c (revision 169185) --- gcc/c-parser.c (working copy) *************** c_parser_declaration_or_fndef (c_parser *** 1681,1686 **** --- 1681,1687 ---- return; } /* Function definition (nested or otherwise). */ + timevar_push (TV_PARSE_FUNC); if (nested) { pedwarn (here, OPT_pedantic, "ISO C forbids nested functions"); *************** c_parser_declaration_or_fndef (c_parser *** 1735,1740 **** --- 1736,1742 ---- add_stmt (fnbody); finish_function (); } + timevar_pop (TV_PARSE_FUNC); break; } } *************** c_parser_enum_specifier (c_parser *parse *** 2187,2197 **** { /* Parse an enum definition. */ struct c_enum_contents the_enum; ! tree type = start_enum (enum_loc, &the_enum, ident); tree postfix_attrs; /* We chain the enumerators in reverse order, then put them in forward order at the end. */ ! tree values = NULL_TREE; c_parser_consume_token (parser); while (true) { --- 2189,2202 ---- { /* Parse an enum definition. */ struct c_enum_contents the_enum; ! tree type; tree postfix_attrs; /* We chain the enumerators in reverse order, then put them in forward order at the end. */ ! tree values; ! timevar_push (TV_PARSE_ENUM); ! type = start_enum (enum_loc, &the_enum, ident); ! values = NULL_TREE; c_parser_consume_token (parser); while (true) { *************** c_parser_enum_specifier (c_parser *parse *** 2255,2260 **** --- 2260,2266 ---- ret.kind = ctsk_tagdef; ret.expr = NULL_TREE; ret.expr_const_operands = true; + timevar_pop (TV_PARSE_ENUM); return ret; } else if (!ident) *************** c_parser_struct_or_union_specifier (c_pa *** 2368,2374 **** semicolon separated fields than comma separated fields, and so we'll be minimizing the number of node traversals required by chainon. */ ! tree contents = NULL_TREE; c_parser_consume_token (parser); /* Handle the Objective-C @defs construct, e.g. foo(sizeof(struct{ @defs(ClassName) }));. */ --- 2374,2382 ---- semicolon separated fields than comma separated fields, and so we'll be minimizing the number of node traversals required by chainon. */ ! tree contents; ! timevar_push (TV_PARSE_STRUCT); ! contents = NULL_TREE; c_parser_consume_token (parser); /* Handle the Objective-C @defs construct, e.g. foo(sizeof(struct{ @defs(ClassName) }));. */ *************** c_parser_struct_or_union_specifier (c_pa *** 2455,2460 **** --- 2463,2469 ---- ret.kind = ctsk_tagdef; ret.expr = NULL_TREE; ret.expr_const_operands = true; + timevar_pop (TV_PARSE_STRUCT); return ret; } else if (!ident)