mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
9c69dcea0d
commit
575bfb0052
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
135
gcc/cp/call.c
135
gcc/cp/call.c
|
|
@ -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. */
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
85
gcc/cp/pt.c
85
gcc/cp/pt.c
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
52
gcc/toplev.c
52
gcc/toplev.c
|
|
@ -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. */
|
||||
|
|
|
|||
Loading…
Reference in New Issue