This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[pph] Merge Timevar Changes
- From: Lawrence Crowl <crowl at google dot com>
- To: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 26 Jan 2011 17:42:24 -0800
- Subject: [pph] Merge Timevar Changes
This patch merges the timevar changes already mentioned
into the PPH branch.
Index: gcc/cp/ChangeLog.pph
2011-01-24 Lawrence Crowl <crowl@google.com>
Merge timevar patch.
Index: gcc/ChangeLog.pph
2011-01-24 Lawrence Crowl <crowl@google.com>
Merge timevar patch.
--
Lawrence Crowl
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)