Upgrade the utility of timevars.

Index: gcc/ChangeLog

2011-04-27  Lawrence Crowl  <crowl@google.com>

	* timevar.h (timevar_cond_start): Remove unused POP_TIMEVAR_AND_RETURN.
	(timevar_cond_start): New for starting a timer only when it is not
	already running.
	(timevar_cond_stop): New for stopping a timer when it was not already
	running.

	* timevar.c (timevar_stop): Enable start/stop timers to start again.
	(timevar_cond_start): New as above.
	(timevar_cond_stop): New as above.

	* timevar.def: Add start/stop timers for compiler phases,
	TV_PHASE_SETUP, TV_PHASE_PARSING, TV_PHASE_DEFERRED, TV_PHASE_CGRAPH,
	TV_PHASE_DBGINFO (C), TV_PHASE_CHECK_DBGINFO (C++), TV_PHASE_GENERATE,
	and TV_PHASE_FINALIZE.
	Change push/pop timer TV_PARSE to TV_PARSE_GLOBAL.
	Add push/pop timers TV_PARSE_STRUCT, TV_PARSE_ENUM, TV_PARSE_FUNC,
	TV_PARSE_INLINE, TV_PARSE_INMETH, TV_TEMPLATE_INST.
	Change push/pop timer TV_NAME_LOOKUP into a start/stop timer.
	Make unused TV_OVERLOAD into a start/stop timer.

	Remove unused timers TV_OVERLOAD, TV_TEMPLATE_INSTANTIATION.
	Mark the strings for TV_NAME_LOOKUP and TV_OVERLOAD with a "|"
	to indicate that they are start/stop timers.

	* toplev.c (compile_file): Change TV_PARSE to TV_PARSE_GLOBAL.
	Add start/stop timers TV_PHASE_PARSING and TV_PHASE_GENERATE.
	Move initialization to do_compile.
	(do_compile): Add initialization from above.
	Add start/stop timers TV_PHASE_SETUP and TV_PHASE_FINALIZE.

	* c-decl.c (c_write_global_declarations): Add start/stop of
	TV_PHASE_DEFERRED, TV_PHASE_CGRAPH, TV_PHASE_DBGINFO.

	* c-parser.c (c_parser_declaration_or_fndef): Push/pop TV_PARSE_FUNC
	or TV_PARSE_INLINE, as appropriate.
	(c_parser_enum_specifier): Push/pop TV_PARSE_ENUM.
	(c_parser_struct_or_union_specifier): Push/pop TV_PARSE_STRUCT.

Index: gcc/cp/ChangeLog

2011-04-27  Lawrence Crowl  <crowl@google.com>

	* decl.c: (push_local_name): Change TV_NAME_LOOKUP to start/stop.
	(poplevel): Refactor POP_TIMEVAR_AND_RETURN to plain code.
	Change TV_NAME_LOOKUP to start/stop.
	(define_label): Refactor timevar calls out to a wrapper function.
	Change TV_NAME_LOOKUP to start/stop.
	(xref_tag): Likewise.
	(lookup_label): Refactor timevar calls out to a wrapper function.
	Change TV_NAME_LOOKUP to start_cond/stop_cond.

        * pt.c: (instantiate_class_template): Add a wrapper to push/pop new
	TV_TEMPLATE_INST.
	(instantiate_template): Add a wrapper to push/pop new TV_TEMPLATE_INST.
	(lookup_template_class): Refactor timevar calls out to a wrapper
	function.  Change use of TV_NAME_LOOKUP to TV_TEMPLATE_INST.
	(instantiate_decl): Change TV_PARSE to TV_TEMPLATE_INST.

	* name-lookup.c: (store_bindings): Change TV_NAME_LOOKUP to start/stop.
	(poplevel_class): Change TV_NAME_LOOKUP to start_cond/stop_cond.
	(push_namespace): Likewise.
	(pop_nested_namespace): Likewise.
	(pushdecl_namespace_level): Likewise.
	(store_class_bindings): Likewise.
	(push_to_top_level): Likewise.
	(identifier_type_value): Refactor timevar calls out to a wrapper
	function.  Change TV_NAME_LOOKUP to start/stop.
	(find_binding): Likewise.
	(push_using_decl): Likewise.
	(lookup_arg_dependent): Likewise.
	(push_using_directive): Likewise.
	(qualified_lookup_using_namespace): Refactor POP_TIMEVAR_AND_RETURN
	to plain code.  Change TV_NAME_LOOKUP to start/stop.
	(lookup_type_current_level): Likewise.  Refactor inner return to
	break.
	(pushdecl_class_level): Refactor POP_TIMEVAR_AND_RETURN to plain
	code.  Change TV_NAME_LOOKUP to start_cond/stop_cond.
	(pushdecl_top_level_1): Likewise.
	(lookup_using_namespace): Likewise.
	(pushdecl_with_scope): Refactor timevar calls out to a wrapper
	function.  Change TV_NAME_LOOKUP to start_cond/stop_cond.
	(push_overloaded_decl): Likewise.
	(push_class_level_binding): Likewise.
	(namespace_binding): Likewise.
	(set_namespace_binding): Likewise.
	(supplement_binding): Likewise.
	(unqualified_namespace_lookup): Likewise.
	(lookup_name_real): Likewise.
	(lookup_type_scope): Likewise.
	(namespace_ancestor): Likewise.
	(lookup_name_innermost_nonclass_level): Likewise.
	(pushtag): Likewise.
	(pop_from_top_level): Likewise.
	(pushdecl_maybe_friend): Refactor timevar calls out to a wrapper
	function.  Change TV_NAME_LOOKUP to start_cond/stop_cond.  Wrap long
	lines.
	(add_using_namespace): Refactor timevar calls out to a wrapper
	function.  Change TV_NAME_LOOKUP to start_cond/stop_cond.  Bypass
	wrapper on call to self.

	* decl2.c: (cp_write_global_declarations):  Add start/stop of
	new TV_PHASE_DEFERRED, TV_PHASE_CGRAPH, TV_PHASE_CHECK_DBGINFO.
	Remove push/pop calls to TV_VARCONST.

	* parser.c: Add include of "timevar.h".
	(cp_parser_explicit_instantiation): Add push/pop calls to
	TV_TEMPLATE_INST.
	(cp_parser_enum_specifier): Add push/pop calls to new TV_PARSE_ENUM.
	(cp_parser_class_specifier): Add wrapper to add push/pop calls to
	TV_PARSE_STRUCT.
	(cp_parser_function_definition_from_specifiers_and_declarator): Add
	push/pop calls to new TV_PARSE_FUNC or TV_PARSE_INLINE.
	(cp_parser_late_parsing_for_member):  Add push/pop calls to
	new TV_PARSE_INMETH.

	* call.c: Add include of "timevar.h".
        (convert_class_to_reference): Wrap and add push/pop calls to 
	TV_OVERLOAD.
	(build_op_call): Likewise.
	(build_conditional_expr): Likewise.
	(build_new_op): Likewise.
	(build_new_method_call): Likewise.
        (build_user_type_conversion): Reorganize to single return and add
	push/pop calls to TV_OVERLOAD.
        (perform_overload_resolution): Likewise.

	* Make-lang.in: Add dependence of call.o and parser.o on $(TIMEVAR_H).

From-SVN: r173277
This commit is contained in:
Lawrence Crowl 2011-05-02 22:19:48 +00:00 committed by Lawrence Crowl
parent 9c69dcea0d
commit 575bfb0052
15 changed files with 907 additions and 262 deletions

View File

@ -1,3 +1,43 @@
2011-05-02 Lawrence Crowl <crowl@google.com>
* timevar.h (timevar_cond_start): Remove unused POP_TIMEVAR_AND_RETURN.
(timevar_cond_start): New for starting a timer only when it is not
already running.
(timevar_cond_stop): New for stopping a timer when it was not already
running.
* timevar.c (timevar_stop): Enable start/stop timers to start again.
(timevar_cond_start): New as above.
(timevar_cond_stop): New as above.
* timevar.def: Add start/stop timers for compiler phases,
TV_PHASE_SETUP, TV_PHASE_PARSING, TV_PHASE_DEFERRED, TV_PHASE_CGRAPH,
TV_PHASE_DBGINFO (C), TV_PHASE_CHECK_DBGINFO (C++), TV_PHASE_GENERATE,
and TV_PHASE_FINALIZE.
Change push/pop timer TV_PARSE to TV_PARSE_GLOBAL.
Add push/pop timers TV_PARSE_STRUCT, TV_PARSE_ENUM, TV_PARSE_FUNC,
TV_PARSE_INLINE, TV_PARSE_INMETH, TV_TEMPLATE_INST.
Change push/pop timer TV_NAME_LOOKUP into a start/stop timer.
Make unused TV_OVERLOAD into a start/stop timer.
Remove unused timers TV_OVERLOAD, TV_TEMPLATE_INSTANTIATION.
Mark the strings for TV_NAME_LOOKUP and TV_OVERLOAD with a "|"
to indicate that they are start/stop timers.
* toplev.c (compile_file): Change TV_PARSE to TV_PARSE_GLOBAL.
Add start/stop timers TV_PHASE_PARSING and TV_PHASE_GENERATE.
Move initialization to do_compile.
(do_compile): Add initialization from above.
Add start/stop timers TV_PHASE_SETUP and TV_PHASE_FINALIZE.
* c-decl.c (c_write_global_declarations): Add start/stop of
TV_PHASE_DEFERRED, TV_PHASE_CGRAPH, TV_PHASE_DBGINFO.
* c-parser.c (c_parser_declaration_or_fndef): Push/pop TV_PARSE_FUNC
or TV_PARSE_INLINE, as appropriate.
(c_parser_enum_specifier): Push/pop TV_PARSE_ENUM.
(c_parser_struct_or_union_specifier): Push/pop TV_PARSE_STRUCT.
2011-05-02 Jason Merrill <jason@redhat.com>
PR c++/40975

View File

@ -9837,6 +9837,8 @@ c_write_global_declarations (void)
if (pch_file)
return;
timevar_start (TV_PHASE_DEFERRED);
/* Do the Objective-C stuff. This is where all the Objective-C
module stuff gets generated (symtab, class/protocol/selector
lists etc). */
@ -9878,10 +9880,16 @@ c_write_global_declarations (void)
c_write_global_declarations_1 (BLOCK_VARS (DECL_INITIAL (t)));
c_write_global_declarations_1 (BLOCK_VARS (ext_block));
timevar_stop (TV_PHASE_DEFERRED);
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 ())
@ -9894,6 +9902,7 @@ c_write_global_declarations (void)
}
ext_block = NULL;
timevar_stop (TV_PHASE_DBGINFO);
}
/* Register reserved keyword WORD as qualifier for address space AS. */

View File

@ -1570,6 +1570,7 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
{
struct c_declarator *declarator;
bool dummy = false;
timevar_id_t tv;
tree fnbody;
/* Declaring either one or more declarators (in which case we
should diagnose if there were no declaration specifiers) or a
@ -1699,6 +1700,13 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
c_pop_function_context ();
break;
}
if (DECL_DECLARED_INLINE_P (current_function_decl))
tv = TV_PARSE_INLINE;
else
tv = TV_PARSE_FUNC;
timevar_push (tv);
/* Parse old-style parameter declarations. ??? Attributes are
not allowed to start declaration specifiers here because of a
syntax conflict between a function declaration with attribute
@ -1737,6 +1745,8 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
add_stmt (fnbody);
finish_function ();
}
timevar_pop (tv);
break;
}
}
@ -2189,11 +2199,14 @@ c_parser_enum_specifier (c_parser *parser)
{
/* Parse an enum definition. */
struct c_enum_contents the_enum;
tree type = start_enum (enum_loc, &the_enum, ident);
tree type;
tree postfix_attrs;
/* We chain the enumerators in reverse order, then put them in
forward order at the end. */
tree values = NULL_TREE;
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)
{
@ -2257,6 +2270,7 @@ c_parser_enum_specifier (c_parser *parser)
ret.kind = ctsk_tagdef;
ret.expr = NULL_TREE;
ret.expr_const_operands = true;
timevar_pop (TV_PARSE_ENUM);
return ret;
}
else if (!ident)
@ -2370,7 +2384,9 @@ c_parser_struct_or_union_specifier (c_parser *parser)
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;
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) }));. */
@ -2457,6 +2473,7 @@ c_parser_struct_or_union_specifier (c_parser *parser)
ret.kind = ctsk_tagdef;
ret.expr = NULL_TREE;
ret.expr_const_operands = true;
timevar_pop (TV_PARSE_STRUCT);
return ret;
}
else if (!ident)

View File

@ -1,3 +1,91 @@
2011-05-02 Lawrence Crowl <crowl@google.com>
* decl.c: (push_local_name): Change TV_NAME_LOOKUP to start/stop.
(poplevel): Refactor POP_TIMEVAR_AND_RETURN to plain code.
Change TV_NAME_LOOKUP to start/stop.
(define_label): Refactor timevar calls out to a wrapper function.
Change TV_NAME_LOOKUP to start/stop.
(xref_tag): Likewise.
(lookup_label): Refactor timevar calls out to a wrapper function.
Change TV_NAME_LOOKUP to start_cond/stop_cond.
* pt.c: (instantiate_class_template): Add a wrapper to push/pop new
TV_TEMPLATE_INST.
(instantiate_template): Add a wrapper to push/pop new TV_TEMPLATE_INST.
(lookup_template_class): Refactor timevar calls out to a wrapper
function. Change use of TV_NAME_LOOKUP to TV_TEMPLATE_INST.
(instantiate_decl): Change TV_PARSE to TV_TEMPLATE_INST.
* name-lookup.c: (store_bindings): Change TV_NAME_LOOKUP to start/stop.
(poplevel_class): Change TV_NAME_LOOKUP to start_cond/stop_cond.
(push_namespace): Likewise.
(pop_nested_namespace): Likewise.
(pushdecl_namespace_level): Likewise.
(store_class_bindings): Likewise.
(push_to_top_level): Likewise.
(identifier_type_value): Refactor timevar calls out to a wrapper
function. Change TV_NAME_LOOKUP to start/stop.
(find_binding): Likewise.
(push_using_decl): Likewise.
(lookup_arg_dependent): Likewise.
(push_using_directive): Likewise.
(qualified_lookup_using_namespace): Refactor POP_TIMEVAR_AND_RETURN
to plain code. Change TV_NAME_LOOKUP to start/stop.
(lookup_type_current_level): Likewise. Refactor inner return to
break.
(pushdecl_class_level): Refactor POP_TIMEVAR_AND_RETURN to plain
code. Change TV_NAME_LOOKUP to start_cond/stop_cond.
(pushdecl_top_level_1): Likewise.
(lookup_using_namespace): Likewise.
(pushdecl_with_scope): Refactor timevar calls out to a wrapper
function. Change TV_NAME_LOOKUP to start_cond/stop_cond.
(push_overloaded_decl): Likewise.
(push_class_level_binding): Likewise.
(namespace_binding): Likewise.
(set_namespace_binding): Likewise.
(supplement_binding): Likewise.
(unqualified_namespace_lookup): Likewise.
(lookup_name_real): Likewise.
(lookup_type_scope): Likewise.
(namespace_ancestor): Likewise.
(lookup_name_innermost_nonclass_level): Likewise.
(pushtag): Likewise.
(pop_from_top_level): Likewise.
(pushdecl_maybe_friend): Refactor timevar calls out to a wrapper
function. Change TV_NAME_LOOKUP to start_cond/stop_cond. Wrap long
lines.
(add_using_namespace): Refactor timevar calls out to a wrapper
function. Change TV_NAME_LOOKUP to start_cond/stop_cond. Bypass
wrapper on call to self.
* decl2.c: (cp_write_global_declarations): Add start/stop of
new TV_PHASE_DEFERRED, TV_PHASE_CGRAPH, TV_PHASE_CHECK_DBGINFO.
Remove push/pop calls to TV_VARCONST.
* parser.c: Add include of "timevar.h".
(cp_parser_explicit_instantiation): Add push/pop calls to
TV_TEMPLATE_INST.
(cp_parser_enum_specifier): Add push/pop calls to new TV_PARSE_ENUM.
(cp_parser_class_specifier): Add wrapper to add push/pop calls to
TV_PARSE_STRUCT.
(cp_parser_function_definition_from_specifiers_and_declarator): Add
push/pop calls to new TV_PARSE_FUNC or TV_PARSE_INLINE.
(cp_parser_late_parsing_for_member): Add push/pop calls to
new TV_PARSE_INMETH.
* call.c: Add include of "timevar.h".
(convert_class_to_reference): Wrap and add push/pop calls to
TV_OVERLOAD.
(build_op_call): Likewise.
(build_conditional_expr): Likewise.
(build_new_op): Likewise.
(build_new_method_call): Likewise.
(build_user_type_conversion): Reorganize to single return and add
push/pop calls to TV_OVERLOAD.
(perform_overload_resolution): Likewise.
* Make-lang.in: Add dependence of call.o and parser.o on $(TIMEVAR_H).
2011-05-02 Jason Merrill <jason@redhat.com>
* tree.c (build_vec_init_expr): Take complain parm.

View File

@ -287,7 +287,7 @@ cp/class.o: cp/class.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \
$(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 \
c-family/c-objc.h
$(TIMEVAR_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)
@ -326,7 +326,7 @@ cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $(TM_H) $(REAL_H) \
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 tree-pretty-print.h $(CXX_PARSER_H)
c-family/c-objc.h tree-pretty-print.h $(CXX_PARSER_H) $(TIMEVAR.H)
cp/cp-gimplify.o: cp/cp-gimplify.c $(CXX_TREE_H) $(C_COMMON_H) \
$(TM_H) coretypes.h pointer-set.h tree-iterator.h

View File

@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see
#include "convert.h"
#include "langhooks.h"
#include "c-family/c-objc.h"
#include "timevar.h"
/* The various kinds of conversion. */
@ -1263,7 +1264,7 @@ reference_compatible_p (tree t1, tree t2)
converted to T as in [over.match.ref]. */
static conversion *
convert_class_to_reference (tree reference_type, tree s, tree expr, int flags)
convert_class_to_reference_1 (tree reference_type, tree s, tree expr, int flags)
{
tree conversions;
tree first_arg;
@ -1399,6 +1400,18 @@ convert_class_to_reference (tree reference_type, tree s, tree expr, int flags)
return cand->second_conv;
}
/* Wrapper for above. */
static conversion *
convert_class_to_reference (tree reference_type, tree s, tree expr, int flags)
{
conversion *ret;
bool subtime = timevar_cond_start (TV_OVERLOAD);
ret = convert_class_to_reference_1 (reference_type, s, expr, flags);
timevar_cond_stop (TV_OVERLOAD, subtime);
return ret;
}
/* A reference of the indicated TYPE is being bound directly to the
expression represented by the implicit conversion sequence CONV.
Return a conversion sequence for this binding. */
@ -3493,20 +3506,32 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
return cand;
}
/* Wrapper for above. */
tree
build_user_type_conversion (tree totype, tree expr, int flags)
{
struct z_candidate *cand
= build_user_type_conversion_1 (totype, expr, flags);
struct z_candidate *cand;
tree ret;
timevar_start (TV_OVERLOAD);
cand = build_user_type_conversion_1 (totype, expr, flags);
if (cand)
{
if (cand->second_conv->kind == ck_ambig)
return error_mark_node;
expr = convert_like (cand->second_conv, expr, tf_warning_or_error);
return convert_from_reference (expr);
ret = error_mark_node;
else
{
expr = convert_like (cand->second_conv, expr, tf_warning_or_error);
ret = convert_from_reference (expr);
}
}
return NULL_TREE;
else
ret = NULL_TREE;
timevar_stop (TV_OVERLOAD);
return ret;
}
/* Subroutine of convert_nontype_argument.
@ -3622,8 +3647,13 @@ perform_overload_resolution (tree fn,
bool *any_viable_p)
{
struct z_candidate *cand;
tree explicit_targs = NULL_TREE;
int template_only = 0;
tree explicit_targs;
int template_only;
bool subtime = timevar_cond_start (TV_OVERLOAD);
explicit_targs = NULL_TREE;
template_only = 0;
*candidates = NULL;
*any_viable_p = true;
@ -3650,10 +3680,12 @@ perform_overload_resolution (tree fn,
candidates);
*candidates = splice_viable (*candidates, pedantic, any_viable_p);
if (!*any_viable_p)
return NULL;
if (*any_viable_p)
cand = tourney (*candidates);
else
cand = NULL;
cand = tourney (*candidates);
timevar_cond_stop (TV_OVERLOAD, subtime);
return cand;
}
@ -3852,8 +3884,8 @@ build_operator_new_call (tree fnname, VEC(tree,gc) **args,
/* Build a new call to operator(). This may change ARGS. */
tree
build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain)
static tree
build_op_call_1 (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain)
{
struct z_candidate *candidates = 0, *cand;
tree fns, convs, first_mem_arg = NULL_TREE;
@ -3984,6 +4016,18 @@ build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain)
return result;
}
/* Wrapper for above. */
tree
build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain)
{
tree ret;
timevar_start (TV_OVERLOAD);
ret = build_op_call_1 (obj, args, complain);
timevar_stop (TV_OVERLOAD);
return ret;
}
static void
op_error (enum tree_code code, enum tree_code code2,
tree arg1, tree arg2, tree arg3, bool match)
@ -4121,9 +4165,9 @@ conditional_conversion (tree e1, tree e2)
/* Implement [expr.cond]. ARG1, ARG2, and ARG3 are the three
arguments to the conditional expression. */
tree
build_conditional_expr (tree arg1, tree arg2, tree arg3,
tsubst_flags_t complain)
static tree
build_conditional_expr_1 (tree arg1, tree arg2, tree arg3,
tsubst_flags_t complain)
{
tree arg2_type;
tree arg3_type;
@ -4552,6 +4596,19 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3,
return result;
}
/* Wrapper for above. */
tree
build_conditional_expr (tree arg1, tree arg2, tree arg3,
tsubst_flags_t complain)
{
tree ret;
bool subtime = timevar_cond_start (TV_OVERLOAD);
ret = build_conditional_expr_1 (arg1, arg2, arg3, complain);
timevar_cond_stop (TV_OVERLOAD, subtime);
return ret;
}
/* OPERAND is an operand to an expression. Perform necessary steps
required before using it. If OPERAND is NULL_TREE, NULL_TREE is
returned. */
@ -4720,8 +4777,8 @@ avoid_sign_compare_warnings (tree orig_arg, tree arg)
TREE_NO_WARNING (arg) = 1;
}
tree
build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
static tree
build_new_op_1 (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
bool *overloaded_p, tsubst_flags_t complain)
{
tree orig_arg1 = arg1;
@ -4888,8 +4945,8 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
code = PREINCREMENT_EXPR;
else
code = PREDECREMENT_EXPR;
result = build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE,
overloaded_p, complain);
result = build_new_op_1 (code, flags, arg1, NULL_TREE, NULL_TREE,
overloaded_p, complain);
break;
/* The caller will deal with these. */
@ -5092,6 +5149,19 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
return NULL_TREE;
}
/* Wrapper for above. */
tree
build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
bool *overloaded_p, tsubst_flags_t complain)
{
tree ret;
bool subtime = timevar_cond_start (TV_OVERLOAD);
ret = build_new_op_1 (code, flags, arg1, arg2, arg3, overloaded_p, complain);
timevar_cond_stop (TV_OVERLOAD, subtime);
return ret;
}
/* Returns true iff T, an element of an OVERLOAD chain, is a usual
deallocation function (3.7.4.2 [basic.stc.dynamic.deallocation]). */
@ -6862,10 +6932,10 @@ name_as_c_string (tree name, tree type, bool *free_p)
be set, upon return, to the function called. ARGS may be NULL.
This may change ARGS. */
tree
build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
tree conversion_path, int flags,
tree *fn_p, tsubst_flags_t complain)
static tree
build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args,
tree conversion_path, int flags,
tree *fn_p, tsubst_flags_t complain)
{
struct z_candidate *candidates = 0, *cand;
tree explicit_targs = NULL_TREE;
@ -7171,6 +7241,21 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
return call;
}
/* Wrapper for above. */
tree
build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
tree conversion_path, int flags,
tree *fn_p, tsubst_flags_t complain)
{
tree ret;
bool subtime = timevar_cond_start (TV_OVERLOAD);
ret = build_new_method_call_1 (instance, fns, args, conversion_path, flags,
fn_p, complain);
timevar_cond_stop (TV_OVERLOAD, subtime);
return ret;
}
/* Returns true iff standard conversion sequence ICS1 is a proper
subsequence of ICS2. */

View File

@ -552,7 +552,7 @@ poplevel (int keep, int reverse, int functionbody)
unsigned ix;
cp_label_binding *label_bind;
timevar_push (TV_NAME_LOOKUP);
timevar_start (TV_NAME_LOOKUP);
restart:
block = NULL_TREE;
@ -815,7 +815,8 @@ poplevel (int keep, int reverse, int functionbody)
if (kind == sk_cleanup)
goto restart;
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, block);
timevar_stop (TV_NAME_LOOKUP);
return block;
}
/* Walk all the namespaces contained NAMESPACE, including NAMESPACE
@ -899,7 +900,7 @@ push_local_name (tree decl)
size_t i, nelts;
tree t, name;
timevar_push (TV_NAME_LOOKUP);
timevar_start (TV_NAME_LOOKUP);
name = DECL_NAME (decl);
@ -918,13 +919,13 @@ push_local_name (tree decl)
DECL_DISCRIMINATOR (decl) = 1;
VEC_replace (tree, local_names, i, decl);
timevar_pop (TV_NAME_LOOKUP);
timevar_stop (TV_NAME_LOOKUP);
return;
}
}
VEC_safe_push (tree, gc, local_names, decl);
timevar_pop (TV_NAME_LOOKUP);
timevar_stop (TV_NAME_LOOKUP);
}
/* Subroutine of duplicate_decls: return truthvalue of whether
@ -2535,26 +2536,37 @@ make_label_decl (tree id, int local_p)
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)
static tree
lookup_label_1 (tree id)
{
tree decl;
timevar_push (TV_NAME_LOOKUP);
/* You can't use labels at global scope. */
if (current_function_decl == NULL_TREE)
{
error ("label %qE referenced outside of any function", id);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE);
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)
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
return decl;
decl = make_label_decl (id, /*local_p=*/0);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
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);
timevar_cond_stop (TV_NAME_LOOKUP, subtime);
return ret;
}
/* Declare a local label named ID. */
@ -2827,15 +2839,13 @@ check_omp_return (void)
/* 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)
static tree
define_label_1 (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;
@ -2855,7 +2865,7 @@ define_label (location_t location, tree name)
if (DECL_INITIAL (decl) != NULL_TREE)
{
error ("duplicate label %qD", decl);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
else
{
@ -2874,9 +2884,22 @@ define_label (location_t location, tree name)
ent->uses = NULL;
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
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);
timevar_stop (TV_NAME_LOOKUP);
return ret;
}
struct cp_switch
{
struct cp_binding_level *level;
@ -11262,16 +11285,14 @@ lookup_and_check_tag (enum tag_types tag_code, tree name,
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)
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;
timevar_push (TV_NAME_LOOKUP);
gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
switch (tag_code)
@ -11299,7 +11320,7 @@ xref_tag (enum tag_types tag_code, tree name,
scope, template_header_p);
if (t == error_mark_node)
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
if (scope != ts_current && t && current_class_type
&& template_class_depth (current_class_type)
@ -11354,7 +11375,7 @@ xref_tag (enum tag_types tag_code, tree name,
if (code == ENUMERAL_TYPE)
{
error ("use of enum %q#D without previous declaration", name);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
else
{
@ -11368,7 +11389,7 @@ xref_tag (enum tag_types tag_code, tree name,
if (template_header_p && MAYBE_CLASS_TYPE_P (t))
{
if (!redeclare_class_template (t, current_template_parms))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
else if (!processing_template_decl
&& CLASS_TYPE_P (t)
@ -11376,7 +11397,7 @@ xref_tag (enum tag_types tag_code, tree name,
{
error ("redeclaration of %qT as a non-template", t);
error ("previous declaration %q+D", t);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
/* Make injected friend class visible. */
@ -11394,9 +11415,23 @@ xref_tag (enum tag_types tag_code, tree name,
}
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
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);
timevar_stop (TV_NAME_LOOKUP);
return ret;
}
tree
xref_tag_from_type (tree old, tree id, tag_scope scope)
{

View File

@ -3678,6 +3678,8 @@ cp_write_global_declarations (void)
/* 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:
@ -3694,8 +3696,6 @@ cp_write_global_declarations (void)
generating the initializer for an object may cause templates to be
instantiated, etc., etc. */
timevar_push (TV_VARCONST);
emit_support_tinfos ();
do
@ -4002,8 +4002,14 @@ cp_write_global_declarations (void)
/* 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_DBGINFO);
/* Now, issue warnings about static, but not defined, functions,
etc., and emit debugging information. */
walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
@ -4039,8 +4045,6 @@ cp_write_global_declarations (void)
}
}
timevar_pop (TV_VARCONST);
if (flag_detailed_statistics)
{
dump_tree_statistics ();
@ -4051,6 +4055,8 @@ cp_write_global_declarations (void)
#ifdef ENABLE_CHECKING
validate_conversion_obstack ();
#endif /* ENABLE_CHECKING */
timevar_stop (TV_PHASE_CHECK_DBGINFO);
}
/* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "timevar.h"
#include "cpplib.h"
#include "tree.h"
#include "cp-tree.h"
@ -12152,6 +12153,8 @@ cp_parser_explicit_instantiation (cp_parser* parser)
cp_decl_specifier_seq decl_specifiers;
tree extension_specifier = NULL_TREE;
timevar_push (TV_TEMPLATE_INST);
/* Look for an (optional) storage-class-specifier or
function-specifier. */
if (cp_parser_allow_gnu_extensions_p (parser))
@ -12235,6 +12238,8 @@ cp_parser_explicit_instantiation (cp_parser* parser)
end_explicit_instantiation ();
cp_parser_consume_semicolon_at_end_of_statement (parser);
timevar_pop (TV_TEMPLATE_INST);
}
/* Parse an explicit-specialization.
@ -13446,6 +13451,7 @@ cp_parser_enum_specifier (cp_parser* parser)
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:
@ -13507,6 +13513,7 @@ cp_parser_enum_specifier (cp_parser* parser)
if (scoped_enum_p)
finish_scope ();
timevar_pop (TV_PARSE_ENUM);
}
else
{
@ -16742,7 +16749,7 @@ cp_parser_class_name (cp_parser *parser,
Returns the TREE_TYPE representing the class. */
static tree
cp_parser_class_specifier (cp_parser* parser)
cp_parser_class_specifier_1 (cp_parser* parser)
{
tree type;
tree attributes = NULL_TREE;
@ -17005,6 +17012,16 @@ cp_parser_class_specifier (cp_parser* parser)
return type;
}
static tree
cp_parser_class_specifier (cp_parser* parser)
{
tree ret;
timevar_push (TV_PARSE_STRUCT);
ret = cp_parser_class_specifier_1 (parser);
timevar_pop (TV_PARSE_STRUCT);
return ret;
}
/* Parse a class-head.
class-head:
@ -19650,8 +19667,17 @@ cp_parser_function_definition_from_specifiers_and_declarator
pop_nested_class ();
}
else
fn = cp_parser_function_definition_after_declarator (parser,
{
timevar_id_t tv;
if (DECL_DECLARED_INLINE_P (current_function_decl))
tv = TV_PARSE_INLINE;
else
tv = TV_PARSE_FUNC;
timevar_push (tv);
fn = cp_parser_function_definition_after_declarator (parser,
/*inline_p=*/false);
timevar_pop (tv);
}
return fn;
}
@ -20268,6 +20294,7 @@ cp_parser_enclosed_template_argument_list (cp_parser* parser)
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))
@ -20334,6 +20361,7 @@ cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
/* Restore the queue. */
pop_unparsed_function_queues (parser);
timevar_pop (TV_PARSE_INMETH);
}
/* If DECL contains any default args, remember it on the unparsed

View File

@ -6682,13 +6682,9 @@ maybe_get_template_decl_from_type_decl (tree decl)
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)
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;
@ -6697,8 +6693,6 @@ lookup_template_class (tree d1,
spec_entry elt;
hashval_t hash;
timevar_push (TV_NAME_LOOKUP);
if (TREE_CODE (d1) == IDENTIFIER_NODE)
{
tree value = innermost_non_namespace_value (d1);
@ -6751,7 +6745,7 @@ lookup_template_class (tree d1,
{
if (complain & tf_error)
error ("%qT is not a template", d1);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
if (TREE_CODE (templ) != TEMPLATE_DECL
@ -6766,7 +6760,7 @@ lookup_template_class (tree d1,
if (in_decl)
error ("for template declaration %q+D", in_decl);
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
complain &= ~tf_user;
@ -6816,10 +6810,10 @@ lookup_template_class (tree d1,
if (arglist2 == error_mark_node
|| (!uses_template_parms (arglist2)
&& check_instantiated_args (templ, arglist2, complain)))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
parm = bind_template_template_parm (TREE_TYPE (templ), arglist2);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, parm);
return parm;
}
else
{
@ -6895,7 +6889,7 @@ lookup_template_class (tree d1,
{
/* Restore the ARGLIST to its full size. */
TREE_VEC_LENGTH (arglist) = saved_depth;
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
}
SET_TMPL_ARGS_LEVEL (bound_args, i, a);
@ -6923,7 +6917,7 @@ lookup_template_class (tree d1,
if (arglist == error_mark_node)
/* We were unable to bind the arguments. */
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
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
@ -6939,7 +6933,7 @@ lookup_template_class (tree d1,
/* comp_template_args is expensive, check it last. */
&& comp_template_args (TYPE_TI_ARGS (template_type),
arglist))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, template_type);
return template_type;
/* If we already have this specialization, return it. */
elt.tmpl = gen_tmpl;
@ -6949,7 +6943,7 @@ lookup_template_class (tree d1,
&elt, hash);
if (entry)
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, entry->spec);
return entry->spec;
is_dependent_type = uses_template_parms (arglist);
@ -6959,7 +6953,7 @@ lookup_template_class (tree d1,
&& check_instantiated_args (gen_tmpl,
INNERMOST_TEMPLATE_ARGS (arglist),
complain))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
return error_mark_node;
if (!is_dependent_type
&& !PRIMARY_TEMPLATE_P (gen_tmpl)
@ -6969,7 +6963,7 @@ lookup_template_class (tree d1,
found = xref_tag_from_type (TREE_TYPE (gen_tmpl),
DECL_NAME (gen_tmpl),
/*tag_scope=*/ts_global);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found);
return found;
}
context = tsubst (DECL_CONTEXT (gen_tmpl), arglist,
@ -7162,9 +7156,22 @@ lookup_template_class (tree d1,
TREE_PUBLIC (type_decl) = 1;
determine_visibility (type_decl);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
return t;
}
timevar_pop (TV_NAME_LOOKUP);
}
/* 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;
timevar_push (TV_TEMPLATE_INST);
ret = lookup_template_class_1 (d1, arglist, in_decl, context,
entering_scope, complain);
timevar_pop (TV_TEMPLATE_INST);
return ret;
}
struct pair_fn_data
@ -8102,8 +8109,8 @@ perform_typedefs_access_check (tree tmpl, tree targs)
input_location = saved_location;
}
tree
instantiate_class_template (tree type)
static tree
instantiate_class_template_1 (tree type)
{
tree templ, args, pattern, t, member;
tree typedecl;
@ -8597,6 +8604,18 @@ instantiate_class_template (tree type)
return type;
}
/* Wrapper for instantiate_class_template_1. */
tree
instantiate_class_template (tree type)
{
tree ret;
timevar_push (TV_TEMPLATE_INST);
ret = instantiate_class_template_1 (type);
timevar_pop (TV_TEMPLATE_INST);
return ret;
}
static tree
tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
@ -13505,8 +13524,8 @@ check_instantiated_args (tree tmpl, tree args, tsubst_flags_t complain)
/* 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)
static tree
instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
{
tree targ_ptr = orig_args;
tree fndecl;
@ -13615,6 +13634,18 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain)
return fndecl;
}
/* Wrapper for instantiate_template_1. */
tree
instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain)
{
tree ret;
timevar_push (TV_TEMPLATE_INST);
ret = instantiate_template_1 (tmpl, orig_args, complain);
timevar_pop (TV_TEMPLATE_INST);
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
@ -17204,7 +17235,7 @@ instantiate_decl (tree d, int defer_ok,
if (! push_tinst_level (d))
return d;
timevar_push (TV_PARSE);
timevar_push (TV_TEMPLATE_INST);
/* Set TD to the template whose DECL_TEMPLATE_RESULT is the pattern
for the instantiation. */
@ -17497,7 +17528,7 @@ out:
pop_deferring_access_checks ();
pop_tinst_level ();
timevar_pop (TV_PARSE);
timevar_pop (TV_TEMPLATE_INST);
return d;
}

View File

@ -361,11 +361,66 @@ timevar_stop (timevar_id_t timevar)
/* 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);
}
/* Summarize timing variables to FP. The timing variable TV_TOTAL has
a special meaning -- it's considered to be the total elapsed time,
for normalizing the others, and is displayed last. */

View File

@ -33,6 +33,18 @@
/* The total execution time. */
DEFTIMEVAR (TV_TOTAL , "total time")
DEFTIMEVAR (TV_PHASE_SETUP , "phase setup")
DEFTIMEVAR (TV_PHASE_PARSING , "phase parsing")
DEFTIMEVAR (TV_PHASE_DEFERRED , "phase lang. 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")
/* Concurrent timers, indicated by "|". */
DEFTIMEVAR (TV_NAME_LOOKUP , "|name lookup")
DEFTIMEVAR (TV_OVERLOAD , "|overload resolution")
/* Time spent garbage-collecting. */
DEFTIMEVAR (TV_GC , "garbage collection")
@ -102,8 +114,13 @@ DEFTIMEVAR (TV_REBUILD_JUMP , "rebuild jump labels")
/* 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_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_INLINE , "parser inl. func. body")
DEFTIMEVAR (TV_PARSE_INMETH , "parser inl. meth. body")
DEFTIMEVAR (TV_TEMPLATE_INST , "template instantiation")
DEFTIMEVAR (TV_INLINE_HEURISTICS , "inline heuristics")
DEFTIMEVAR (TV_INTEGRATION , "integration")
DEFTIMEVAR (TV_TREE_GIMPLIFY , "tree gimplify")
@ -170,8 +187,6 @@ DEFTIMEVAR (TV_CGRAPH_VERIFY , "callgraph verifier")
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")

View File

@ -87,14 +87,13 @@ extern bool timevar_enable;
/* 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 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. */

View File

@ -562,36 +562,34 @@ emit_debug_global_declarations (tree *vec, int len)
static void
compile_file (void)
{
/* Initialize yet another pass. */
ggc_protect_identifiers = true;
init_cgraph ();
init_final (main_input_filename);
coverage_init (aux_base_name);
statistics_init ();
invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
timevar_push (TV_PARSE);
timevar_start (TV_PHASE_PARSING);
timevar_push (TV_PARSE_GLOBAL);
/* Call the parser, which parses the entire file (calling
rest_of_compilation for each function). */
lang_hooks.parse_file ();
timevar_pop (TV_PARSE_GLOBAL);
timevar_stop (TV_PHASE_PARSING);
/* 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;
timevar_start (TV_PHASE_GENERATE);
ggc_protect_identifiers = false;
/* This must also call cgraph_finalize_compilation_unit. */
lang_hooks.decls.final_write_globals ();
if (seen_error ())
return;
{
timevar_stop (TV_PHASE_GENERATE);
return;
}
varpool_assemble_pending_decls ();
finish_aliases_2 ();
@ -671,6 +669,8 @@ compile_file (void)
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. */
@ -1899,6 +1899,8 @@ do_compile (void)
/* 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. */
@ -1910,9 +1912,31 @@ do_compile (void)
/* Language-dependent initialization. Returns true on success. */
if (lang_dependent_init (main_input_filename))
compile_file ();
{
/* Initialize yet another pass. */
ggc_protect_identifiers = true;
init_cgraph ();
init_final (main_input_filename);
coverage_init (aux_base_name);
statistics_init ();
invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
timevar_stop (TV_PHASE_SETUP);
compile_file ();
}
else
{
timevar_stop (TV_PHASE_SETUP);
}
timevar_start (TV_PHASE_FINALIZE);
finalize (no_backend);
timevar_stop (TV_PHASE_FINALIZE);
}
/* Stop timing and print the times. */