diff mbox series

[RFA] timevar: Add auto_cond_timevar class

Message ID 20211018142244.721838-1-jason@redhat.com
State New
Headers show
Series [RFA] timevar: Add auto_cond_timevar class | expand

Commit Message

Jason Merrill Oct. 18, 2021, 2:22 p.m. UTC
The auto_timevar sentinel class for starting and stopping timevars was added
in 2014, but doesn't work for the many uses of timevar_cond_start/stop in
the C++ front end.  So let's add one that does.

This allows us to remove a lot of wrapper functions that were just used to
call timevar_cond_stop on all exits from the function.

Tested x86_64-pc-linux-gnu, OK for trunk?

gcc/ChangeLog:

	* timevar.h (class auto_cond_timevar): New.

gcc/cp/ChangeLog:

	* call.c
	* decl.c
	* name-lookup.c:
	Use auto_cond_timevar instead of timevar_cond_start/stop.
	Remove wrapper functions.
---
 gcc/timevar.h        |  46 ++++++++-
 gcc/cp/call.c        | 106 +++++--------------
 gcc/cp/decl.c        |  51 +++------
 gcc/cp/name-lookup.c | 240 ++++++++++++-------------------------------
 4 files changed, 150 insertions(+), 293 deletions(-)


base-commit: 582d43a48cb28e6ed36ea6388ca92f3d5d786a26

Comments

Richard Biener Oct. 19, 2021, 6:53 a.m. UTC | #1
On Mon, Oct 18, 2021 at 4:23 PM Jason Merrill via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> The auto_timevar sentinel class for starting and stopping timevars was added
> in 2014, but doesn't work for the many uses of timevar_cond_start/stop in
> the C++ front end.  So let's add one that does.
>
> This allows us to remove a lot of wrapper functions that were just used to
> call timevar_cond_stop on all exits from the function.
>
> Tested x86_64-pc-linux-gnu, OK for trunk?

OK.

> gcc/ChangeLog:
>
>         * timevar.h (class auto_cond_timevar): New.
>
> gcc/cp/ChangeLog:
>
>         * call.c
>         * decl.c
>         * name-lookup.c:
>         Use auto_cond_timevar instead of timevar_cond_start/stop.
>         Remove wrapper functions.
> ---
>  gcc/timevar.h        |  46 ++++++++-
>  gcc/cp/call.c        | 106 +++++--------------
>  gcc/cp/decl.c        |  51 +++------
>  gcc/cp/name-lookup.c | 240 ++++++++++++-------------------------------
>  4 files changed, 150 insertions(+), 293 deletions(-)
>
> diff --git a/gcc/timevar.h b/gcc/timevar.h
> index 72e31adb9e6..ccaa42e5904 100644
> --- a/gcc/timevar.h
> +++ b/gcc/timevar.h
> @@ -247,13 +247,53 @@ class auto_timevar
>        m_timer->pop (m_tv);
>    }
>
> - private:
> +  // Disallow copies.
> +  auto_timevar (const auto_timevar &) = delete;
>
> -  // Private to disallow copies.
> -  auto_timevar (const auto_timevar &);
> + private:
> +  timer *m_timer;
> +  timevar_id_t m_tv;
> +};
> +
> +// As above, but use cond_start/stop.
> +class auto_cond_timevar
> +{
> + public:
> +  auto_cond_timevar (timer *t, timevar_id_t tv)
> +    : m_timer (t),
> +      m_tv (tv)
> +  {
> +    start ();
> +  }
> +
> +  explicit auto_cond_timevar (timevar_id_t tv)
> +    : m_timer (g_timer)
> +    , m_tv (tv)
> +  {
> +    start ();
> +  }
> +
> +  ~auto_cond_timevar ()
> +  {
> +    if (m_timer && !already_running)
> +      m_timer->cond_stop (m_tv);
> +  }
> +
> +  // Disallow copies.
> +  auto_cond_timevar (const auto_cond_timevar &) = delete;
> +
> + private:
> +  void start()
> +  {
> +    if (m_timer)
> +      already_running = m_timer->cond_start (m_tv);
> +    else
> +      already_running = false;
> +  }
>
>    timer *m_timer;
>    timevar_id_t m_tv;
> +  bool already_running;
>  };
>
>  extern void print_time (const char *, long);
> diff --git a/gcc/cp/call.c b/gcc/cp/call.c
> index c5601d96ab8..80e618622fb 100644
> --- a/gcc/cp/call.c
> +++ b/gcc/cp/call.c
> @@ -4436,7 +4436,7 @@ build_user_type_conversion (tree totype, tree expr, int flags,
>    struct z_candidate *cand;
>    tree ret;
>
> -  bool subtime = timevar_cond_start (TV_OVERLOAD);
> +  auto_cond_timevar tv (TV_OVERLOAD);
>    cand = build_user_type_conversion_1 (totype, expr, flags, complain);
>
>    if (cand)
> @@ -4452,7 +4452,6 @@ build_user_type_conversion (tree totype, tree expr, int flags,
>    else
>      ret = NULL_TREE;
>
> -  timevar_cond_stop (TV_OVERLOAD, subtime);
>    return ret;
>  }
>
> @@ -4692,7 +4691,7 @@ perform_overload_resolution (tree fn,
>    tree explicit_targs;
>    int template_only;
>
> -  bool subtime = timevar_cond_start (TV_OVERLOAD);
> +  auto_cond_timevar tv (TV_OVERLOAD);
>
>    explicit_targs = NULL_TREE;
>    template_only = 0;
> @@ -4724,7 +4723,6 @@ perform_overload_resolution (tree fn,
>    else
>      cand = NULL;
>
> -  timevar_cond_stop (TV_OVERLOAD, subtime);
>    return cand;
>  }
>
> @@ -4989,8 +4987,8 @@ build_operator_new_call (tree fnname, vec<tree, va_gc> **args,
>
>  /* Build a new call to operator().  This may change ARGS.  */
>
> -static tree
> -build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
> +tree
> +build_op_call (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
>  {
>    struct z_candidate *candidates = 0, *cand;
>    tree fns, convs, first_mem_arg = NULL_TREE;
> @@ -4998,6 +4996,8 @@ build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
>    tree result = NULL_TREE;
>    void *p;
>
> +  auto_cond_timevar tv (TV_OVERLOAD);
> +
>    obj = mark_lvalue_use (obj);
>
>    if (error_operand_p (obj))
> @@ -5127,18 +5127,6 @@ build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
>    return result;
>  }
>
> -/* Wrapper for above.  */
> -
> -tree
> -build_op_call (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
> -{
> -  tree ret;
> -  bool subtime = timevar_cond_start (TV_OVERLOAD);
> -  ret = build_op_call_1 (obj, args, complain);
> -  timevar_cond_stop (TV_OVERLOAD, subtime);
> -  return ret;
> -}
> -
>  /* Called by op_error to prepare format strings suitable for the error
>     function.  It concatenates a prefix (controlled by MATCH), ERRMSG,
>     and a suffix (controlled by NTYPES).  */
> @@ -5330,10 +5318,10 @@ conditional_conversion (tree e1, tree e2, tsubst_flags_t complain)
>  /* Implement [expr.cond].  ARG1, ARG2, and ARG3 are the three
>     arguments to the conditional expression.  */
>
> -static tree
> -build_conditional_expr_1 (const op_location_t &loc,
> -                         tree arg1, tree arg2, tree arg3,
> -                          tsubst_flags_t complain)
> +tree
> +build_conditional_expr (const op_location_t &loc,
> +                       tree arg1, tree arg2, tree arg3,
> +                       tsubst_flags_t complain)
>  {
>    tree arg2_type;
>    tree arg3_type;
> @@ -5345,6 +5333,8 @@ build_conditional_expr_1 (const op_location_t &loc,
>    void *p;
>    tree orig_arg2, orig_arg3;
>
> +  auto_cond_timevar tv (TV_OVERLOAD);
> +
>    /* As a G++ extension, the second argument to the conditional can be
>       omitted.  (So that `a ? : c' is roughly equivalent to `a ? a :
>       c'.)  If the second operand is omitted, make sure it is
> @@ -5410,8 +5400,8 @@ build_conditional_expr_1 (const op_location_t &loc,
>           && !VECTOR_TYPE_P (arg3_type))
>         {
>           /* Rely on the error messages of the scalar version.  */
> -         tree scal = build_conditional_expr_1 (loc, integer_one_node,
> -                                               orig_arg2, orig_arg3, complain);
> +         tree scal = build_conditional_expr (loc, integer_one_node,
> +                                             orig_arg2, orig_arg3, complain);
>           if (scal == error_mark_node)
>             return error_mark_node;
>           tree stype = TREE_TYPE (scal);
> @@ -5968,20 +5958,6 @@ build_conditional_expr_1 (const op_location_t &loc,
>    return result;
>  }
>
> -/* Wrapper for above.  */
> -
> -tree
> -build_conditional_expr (const op_location_t &loc,
> -                       tree arg1, tree arg2, tree arg3,
> -                        tsubst_flags_t complain)
> -{
> -  tree ret;
> -  bool subtime = timevar_cond_start (TV_OVERLOAD);
> -  ret = build_conditional_expr_1 (loc, 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.  */
> @@ -6483,10 +6459,10 @@ add_operator_candidates (z_candidate **candidates,
>    return NULL_TREE;
>  }
>
> -static tree
> -build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
> -               tree arg1, tree arg2, tree arg3, tree *overload,
> -               tsubst_flags_t complain)
> +tree
> +build_new_op (const op_location_t &loc, enum tree_code code, int flags,
> +             tree arg1, tree arg2, tree arg3, tree *overload,
> +             tsubst_flags_t complain)
>  {
>    struct z_candidate *candidates = 0, *cand;
>    vec<tree, va_gc> *arglist;
> @@ -6500,6 +6476,8 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
>    bool strict_p;
>    bool any_viable_p;
>
> +  auto_cond_timevar tv (TV_OVERLOAD);
> +
>    if (error_operand_p (arg1)
>        || error_operand_p (arg2)
>        || error_operand_p (arg3))
> @@ -6635,8 +6613,8 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
>             code = PREINCREMENT_EXPR;
>           else
>             code = PREDECREMENT_EXPR;
> -         result = build_new_op_1 (loc, code, flags, arg1, NULL_TREE,
> -                                  NULL_TREE, overload, complain);
> +         result = build_new_op (loc, code, flags, arg1, NULL_TREE,
> +                                NULL_TREE, overload, complain);
>           break;
>
>           /* The caller will deal with these.  */
> @@ -6958,21 +6936,6 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
>    return NULL_TREE;
>  }
>
> -/* Wrapper for above.  */
> -
> -tree
> -build_new_op (const op_location_t &loc, enum tree_code code, int flags,
> -             tree arg1, tree arg2, tree arg3,
> -             tree *overload, tsubst_flags_t complain)
> -{
> -  tree ret;
> -  bool subtime = timevar_cond_start (TV_OVERLOAD);
> -  ret = build_new_op_1 (loc, code, flags, arg1, arg2, arg3,
> -                       overload, complain);
> -  timevar_cond_stop (TV_OVERLOAD, subtime);
> -  return ret;
> -}
> -
>  /* CALL was returned by some call-building function; extract the actual
>     CALL_EXPR from any bits that have been tacked on, e.g. by
>     convert_from_reference.  */
> @@ -10670,10 +10633,10 @@ complain_about_no_candidates_for_method_call (tree instance,
>     be set, upon return, to the function called.  ARGS may be NULL.
>     This may change ARGS.  */
>
> -static tree
> -build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
> -                        tree conversion_path, int flags,
> -                        tree *fn_p, tsubst_flags_t complain)
> +tree
> +build_new_method_call (tree instance, tree fns, vec<tree, va_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;
> @@ -10693,6 +10656,8 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
>    vec<tree, va_gc> *orig_args = NULL;
>    void *p;
>
> +  auto_cond_timevar tv (TV_OVERLOAD);
> +
>    gcc_assert (instance != NULL_TREE);
>
>    /* We don't know what function we're going to call, yet.  */
> @@ -11072,21 +11037,6 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
>    return call;
>  }
>
> -/* Wrapper for above.  */
> -
> -tree
> -build_new_method_call (tree instance, tree fns, vec<tree, va_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.  */
>
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 242429d9ef4..2ff3845dcd4 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -597,7 +597,7 @@ poplevel (int keep, int reverse, int functionbody)
>    tree decl;
>    scope_kind kind;
>
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>   restart:
>
>    block = NULL_TREE;
> @@ -829,7 +829,6 @@ poplevel (int keep, int reverse, int functionbody)
>    if (kind == sk_cleanup)
>      goto restart;
>
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return block;
>  }
>
> @@ -908,7 +907,7 @@ static GTY((deletable)) vec<tree, va_gc> *local_entities;
>  void
>  determine_local_discriminator (tree decl)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    retrofit_lang_decl (decl);
>    tree ctx = DECL_CONTEXT (decl);
>    tree name = (TREE_CODE (decl) == TYPE_DECL
> @@ -943,8 +942,6 @@ determine_local_discriminator (tree decl)
>        local_entities->quick_push (decl);
>        local_entities->quick_push (name);
>      }
> -
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>  }
>
>
> @@ -3277,6 +3274,8 @@ named_label_hash::equal (const value_type entry, compare_type name)
>  static named_label_entry *
>  lookup_label_1 (tree id, bool making_local_p)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    /* You can't use labels at global scope.  */
>    if (current_function_decl == NULL_TREE)
>      {
> @@ -3339,18 +3338,14 @@ lookup_label_1 (tree id, bool making_local_p)
>  tree
>  lookup_label (tree id)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
>    named_label_entry *ent = lookup_label_1 (id, false);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return ent ? ent->label_decl : NULL_TREE;
>  }
>
>  tree
>  declare_local_label (tree id)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
>    named_label_entry *ent = lookup_label_1 (id, true);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return ent ? ent->label_decl : NULL_TREE;
>  }
>
> @@ -3681,9 +3676,11 @@ check_omp_return (void)
>  /* Define a label, specifying the location in the source file.
>     Return the LABEL_DECL node for the label.  */
>
> -static tree
> -define_label_1 (location_t location, tree name)
> +tree
> +define_label (location_t location, tree name)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    /* After labels, make any new cleanups in the function go into their
>       own new (temporary) binding contour.  */
>    for (cp_binding_level *p = current_binding_level;
> @@ -3717,18 +3714,6 @@ define_label_1 (location_t location, tree name)
>    return decl;
>  }
>
> -/* Wrapper for define_label_1.  */
> -
> -tree
> -define_label (location_t location, tree name)
> -{
> -  bool running = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = define_label_1 (location, name);
> -  timevar_cond_stop (TV_NAME_LOOKUP, running);
> -  return ret;
> -}
> -
> -
>  struct cp_switch
>  {
>    cp_binding_level *level;
> @@ -15499,13 +15484,15 @@ 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.  */
>
> -static tree
> -xref_tag_1 (enum tag_types tag_code, tree name,
> -            TAG_how how, bool template_header_p)
> +tree
> +xref_tag (enum tag_types tag_code, tree name,
> +         TAG_how how, bool template_header_p)
>  {
>    enum tree_code code;
>    tree context = NULL_TREE;
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    gcc_assert (identifier_p (name));
>
>    switch (tag_code)
> @@ -15654,18 +15641,6 @@ xref_tag_1 (enum tag_types tag_code, tree name,
>    return t;
>  }
>
> -/* Wrapper for xref_tag_1.  */
> -
> -tree
> -xref_tag (enum tag_types tag_code, tree name,
> -         TAG_how how, bool template_header_p)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = xref_tag_1 (tag_code, name, how, template_header_p);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  /* Create the binfo hierarchy for REF with (possibly NULL) base list
>     BASE_LIST.  For each element on BASE_LIST the TREE_PURPOSE is an
>     access_* node, and the TREE_VALUE is the type of the base-class.
> diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
> index c414a1091b4..b4c636d551a 100644
> --- a/gcc/cp/name-lookup.c
> +++ b/gcc/cp/name-lookup.c
> @@ -39,7 +39,6 @@ along with GCC; see the file COPYING3.  If not see
>
>  static cxx_binding *cxx_binding_make (tree value, tree type);
>  static cp_binding_level *innermost_nonclass_level (void);
> -static tree do_pushdecl (tree decl, bool hiding);
>  static void set_identifier_type_value_with_scope (tree id, tree decl,
>                                                   cp_binding_level *b);
>  static name_hint maybe_suggest_missing_std_header (location_t location,
> @@ -1725,11 +1724,9 @@ static void diagnose_name_conflict (tree, tree);
>  tree
>  lookup_arg_dependent (tree name, tree fns, vec<tree, va_gc> *args)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    name_lookup lookup (name);
> -  fns = lookup.search_adl (fns, args);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return fns;
> +  return lookup.search_adl (fns, args);
>  }
>
>  /* FNS is an overload set of conversion functions.  Return the
> @@ -2595,8 +2592,10 @@ anticipated_builtin_p (tree ovl)
>     was successful.  */
>
>  static bool
> -supplement_binding_1 (cxx_binding *binding, tree decl)
> +supplement_binding (cxx_binding *binding, tree decl)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    tree bval = binding->value;
>    bool ok = true;
>    tree target_bval = strip_using_decl (bval);
> @@ -2736,18 +2735,6 @@ diagnose_name_conflict (tree decl, tree bval)
>    inform (location_of (bval), "previous declaration %q#D", bval);
>  }
>
> -/* Wrapper for supplement_binding_1.  */
> -
> -static bool
> -supplement_binding (cxx_binding *binding, tree decl)
> -{
> -  bool ret;
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  ret = supplement_binding_1 (binding, decl);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  /* Replace BINDING's current value on its scope's name list with
>     NEWVAL.  */
>
> @@ -3472,7 +3459,7 @@ push_local_extern_decl_alias (tree decl)
>           /* Expected default linkage is from the namespace.  */
>           TREE_PUBLIC (alias) = TREE_PUBLIC (ns);
>           push_nested_namespace (ns);
> -         alias = do_pushdecl (alias, /* hiding= */true);
> +         alias = pushdecl (alias, /* hiding= */true);
>           pop_nested_namespace (ns);
>           if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl))
>             set_decl_tls_model (alias, DECL_TLS_MODEL (decl));
> @@ -3618,16 +3605,20 @@ check_module_override (tree decl, tree mvec, bool hiding,
>
>  /* Record DECL as belonging to the current lexical scope.  Check for
>     errors (such as an incompatible declaration for the same name
> -   already seen in the same scope).  IS_FRIEND is true if DECL is
> -   declared as a friend.
> +   already seen in the same scope).
> +
> +   The new binding is hidden if HIDING is true (an anticipated builtin
> +   or hidden friend).
>
>     Returns either DECL or an old decl for the same name.  If an old
>     decl is returned, it may have been smashed to agree with what DECL
>     says.  */
>
> -static tree
> -do_pushdecl (tree decl, bool hiding)
> +tree
> +pushdecl (tree decl, bool hiding)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    if (decl == error_mark_node)
>      return error_mark_node;
>
> @@ -3843,19 +3834,6 @@ do_pushdecl (tree decl, bool hiding)
>    return decl;
>  }
>
> -/* Record a decl-node X as belonging to the current lexical scope.
> -   The new binding is hidden if HIDING is true (an anticipated builtin
> -   or hidden friend).   */
> -
> -tree
> -pushdecl (tree x, bool hiding)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = do_pushdecl (x, hiding);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  /* A mergeable entity is being loaded into namespace NS slot NAME.
>     Create and return the appropriate vector slot for that.  Either a
>     GMF slot or a module-specific one.  */
> @@ -4784,7 +4762,7 @@ do_pushdecl_with_scope (tree x, cp_binding_level *level, bool hiding = false)
>         current_function_decl = NULL_TREE;
>        b = current_binding_level;
>        current_binding_level = level;
> -      x = do_pushdecl (x, hiding);
> +      x = pushdecl (x, hiding);
>        current_binding_level = b;
>        current_function_decl = function_decl;
>      }
> @@ -4797,17 +4775,14 @@ tree
>  pushdecl_outermost_localscope (tree x)
>  {
>    cp_binding_level *b = NULL;
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>
>    /* Find the scope just inside the function parms.  */
>    for (cp_binding_level *n = current_binding_level;
>         n->kind != sk_function_parms; n = b->level_chain)
>      b = n;
>
> -  tree ret = b ? do_pushdecl_with_scope (x, b) : error_mark_node;
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -
> -  return ret;
> +  return b ? do_pushdecl_with_scope (x, b) : error_mark_node;
>  }
>
>  /* Process a local-scope or namespace-scope using declaration.  LOOKUP
> @@ -5196,7 +5171,7 @@ poplevel_class (void)
>    size_t i;
>    tree shadowed;
>
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    gcc_assert (level != 0);
>
>    /* If we're leaving a toplevel class, cache its binding level.  */
> @@ -5223,7 +5198,6 @@ poplevel_class (void)
>       `pushlevel_class' routine.  */
>    gcc_assert (current_binding_level == level);
>    leave_scope ();
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>  }
>
>  /* Set INHERITED_VALUE_BINDING_P on BINDING to true or false, as
> @@ -5266,14 +5240,13 @@ bool
>  pushdecl_class_level (tree x)
>  {
>    bool is_valid = true;
> -  bool subtime;
>
>    /* Do nothing if we're adding to an outer lambda closure type,
>       outer_binding will add it later if it's needed.  */
>    if (current_class_type != class_binding_level->this_entity)
>      return true;
>
> -  subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    /* Get the name of X.  */
>    tree name = OVL_NAME (x);
>
> @@ -5313,7 +5286,6 @@ pushdecl_class_level (tree x)
>             }
>        input_location = save_location;
>      }
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return is_valid;
>  }
>
> @@ -5359,13 +5331,15 @@ get_class_binding (tree name, cp_binding_level *scope)
>  /* Make the declaration(s) of X appear in CLASS scope under the name
>     NAME.  Returns true if the binding is valid.  */
>
> -static bool
> -push_class_level_binding_1 (tree name, tree x)
> +bool
> +push_class_level_binding (tree name, tree x)
>  {
>    cxx_binding *binding;
>    tree decl = x;
>    bool ok;
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    /* The class_binding_level will be NULL if x is a template
>       parameter name in a member template.  */
>    if (!class_binding_level)
> @@ -5537,18 +5511,6 @@ push_class_level_binding_1 (tree name, tree x)
>    return ok;
>  }
>
> -/* Wrapper for push_class_level_binding_1.  */
> -
> -bool
> -push_class_level_binding (tree name, tree x)
> -{
> -  bool ret;
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  ret = push_class_level_binding_1 (name, x);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  /* Process and lookup a using decl SCOPE::lookup.name, filling in
>     lookup.values & lookup.type.  Return a USING_DECL, or NULL_TREE on
>     failure.  */
> @@ -5792,7 +5754,7 @@ do_class_using_decl (tree scope, tree name)
>  tree
>  get_namespace_binding (tree ns, tree name)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    if (!ns)
>      ns = global_namespace;
>    gcc_checking_assert (!DECL_NAMESPACE_ALIAS (ns));
> @@ -5808,7 +5770,6 @@ get_namespace_binding (tree ns, tree name)
>         ret = MAYBE_STAT_DECL (ret);
>      }
>
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return ret;
>  }
>
> @@ -5819,7 +5780,7 @@ get_namespace_binding (tree ns, tree name)
>  void
>  set_global_binding (tree decl)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>
>    tree *slot = find_namespace_slot (global_namespace, DECL_NAME (decl), true);
>
> @@ -5829,8 +5790,6 @@ set_global_binding (tree decl)
>
>    /* Force the binding, so compiler internals continue to work.  */
>    *slot = decl;
> -
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>  }
>
>  /* Set the context of a declaration to scope. Complain if we are not
> @@ -6123,11 +6082,9 @@ do_namespace_alias (tree alias, tree name_space)
>  tree
>  pushdecl_namespace_level (tree decl, bool hiding)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree res = do_pushdecl_with_scope (decl, NAMESPACE_LEVEL (current_namespace),
> -                                    hiding);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return res;
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +  return do_pushdecl_with_scope (decl, NAMESPACE_LEVEL (current_namespace),
> +                                hiding);
>  }
>
>  /* Wrapper around push_local_binding to push the bindings for
> @@ -7690,11 +7647,13 @@ innermost_non_namespace_value (tree name)
>     WANT can also have LOOK_want::HIDDEN_FRIEND or
>     LOOK_want::HIDDEN_LAMBDa added to it.  */
>
> -static tree
> -lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
> +tree
> +lookup_name (tree name, LOOK_where where, LOOK_want want)
>  {
>    tree val = NULL_TREE;
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    gcc_checking_assert (unsigned (where) != 0);
>    /* If we're looking for hidden lambda things, we shouldn't be
>       looking in namespace scope.  */
> @@ -7795,17 +7754,6 @@ lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
>    return val;
>  }
>
> -/* Wrapper for lookup_name_1.  */
> -
> -tree
> -lookup_name (tree name, LOOK_where where, LOOK_want want)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = lookup_name_1 (name, where, want);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  tree
>  lookup_name (tree name)
>  {
> @@ -7825,9 +7773,11 @@ lookup_name (tree name)
>     A TYPE_DECL best matching the NAME is returned.  Catching error
>     and issuing diagnostics are caller's responsibility.  */
>
> -static tree
> -lookup_elaborated_type_1 (tree name, TAG_how how)
> +tree
> +lookup_elaborated_type (tree name, TAG_how how)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    cp_binding_level *b = current_binding_level;
>
>    if (b->kind != sk_namespace)
> @@ -8011,17 +7961,6 @@ lookup_elaborated_type_1 (tree name, TAG_how how)
>    return NULL_TREE;
>  }
>
> -/* Wrapper for lookup_type_scope_1.  */
> -
> -tree
> -lookup_elaborated_type (tree name, TAG_how how)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = lookup_elaborated_type_1 (name, how);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>  /* The type TYPE is being declared.  If it is a class template, or a
>     specialization of a class template, do any processing required and
>     perform error-checking.  If IS_FRIEND is nonzero, this TYPE is
> @@ -8099,13 +8038,15 @@ maybe_process_template_type_declaration (tree type, int is_friend,
>
>     Returns TYPE upon success and ERROR_MARK_NODE otherwise.  */
>
> -static tree
> -do_pushtag (tree name, tree type, TAG_how how)
> +tree
> +pushtag (tree name, tree type, TAG_how how)
>  {
>    tree decl;
>
>    gcc_assert (identifier_p (name));
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    cp_binding_level *b = current_binding_level;
>    while (true)
>      {
> @@ -8249,18 +8190,6 @@ do_pushtag (tree name, tree type, TAG_how how)
>
>    return type;
>  }
> -
> -/* Wrapper for do_pushtag.  */
> -
> -tree
> -pushtag (tree name, tree type, TAG_how how)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  tree ret = do_pushtag (name, type, how);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -  return ret;
> -}
> -
>
>  /* Subroutines for reverting temporarily to top-level for instantiation
>     of templates and such.  We actually need to clear out the class- and
> @@ -8309,7 +8238,7 @@ store_bindings (tree names, vec<cxx_saved_binding, va_gc> **old_bindings)
>    tree t, id;
>    size_t i;
>
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    for (t = names; t; t = TREE_CHAIN (t))
>      {
>        if (TREE_CODE (t) == TREE_LIST)
> @@ -8331,7 +8260,6 @@ store_bindings (tree names, vec<cxx_saved_binding, va_gc> **old_bindings)
>         }
>        bindings_need_stored.truncate (0);
>      }
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>  }
>
>  /* Like store_bindings, but NAMES is a vector of cp_class_binding
> @@ -8362,8 +8290,8 @@ store_class_bindings (vec<cp_class_binding, va_gc> *names,
>
>  static GTY((deletable)) struct saved_scope *free_saved_scope;
>
> -static void
> -do_push_to_top_level (void)
> +void
> +push_to_top_level (void)
>  {
>    struct saved_scope *s;
>    cp_binding_level *b;
> @@ -8371,6 +8299,8 @@ do_push_to_top_level (void)
>    size_t i;
>    bool need_pop;
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    /* Reuse or create a new structure for this saved scope.  */
>    if (free_saved_scope != NULL)
>      {
> @@ -8448,13 +8378,15 @@ do_push_to_top_level (void)
>    suppress_location_wrappers = 0;
>  }
>
> -static void
> -do_pop_from_top_level (void)
> +void
> +pop_from_top_level (void)
>  {
>    struct saved_scope *s = scope_chain;
>    cxx_saved_binding *saved;
>    size_t i;
>
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +
>    /* Clear out class-level bindings cache.  */
>    if (previous_class_level)
>      invalidate_class_lookup_cache ();
> @@ -8489,14 +8421,15 @@ do_pop_from_top_level (void)
>  /* Push into the scope of the namespace NS, even if it is deeply
>     nested within another namespace.  */
>
> -static void
> -do_push_nested_namespace (tree ns)
> +void
> +push_nested_namespace (tree ns)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    if (ns == global_namespace)
> -    do_push_to_top_level ();
> +    push_to_top_level ();
>    else
>      {
> -      do_push_nested_namespace (CP_DECL_CONTEXT (ns));
> +      push_nested_namespace (CP_DECL_CONTEXT (ns));
>        resume_scope (NAMESPACE_LEVEL (ns));
>        current_namespace = ns;
>      }
> @@ -8505,9 +8438,10 @@ do_push_nested_namespace (tree ns)
>  /* Pop back from the scope of the namespace NS, which was previously
>     entered with push_nested_namespace.  */
>
> -static void
> -do_pop_nested_namespace (tree ns)
> +void
> +pop_nested_namespace (tree ns)
>  {
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    while (ns != global_namespace)
>      {
>        ns = CP_DECL_CONTEXT (ns);
> @@ -8515,7 +8449,7 @@ do_pop_nested_namespace (tree ns)
>        leave_scope ();
>      }
>
> -  do_pop_from_top_level ();
> +  pop_from_top_level ();
>  }
>
>  /* Add TARGET to USINGS, if it does not already exist there.  We used
> @@ -8595,13 +8529,12 @@ finish_using_directive (tree target, tree attribs)
>  tree
>  pushdecl_top_level (tree x)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  do_push_to_top_level ();
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +  push_to_top_level ();
>    gcc_checking_assert (!DECL_CONTEXT (x));
>    DECL_CONTEXT (x) = FROB_CONTEXT (global_namespace);
>    x = pushdecl_namespace_level (x);
> -  do_pop_from_top_level ();
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> +  pop_from_top_level ();
>    return x;
>  }
>
> @@ -8611,14 +8544,13 @@ pushdecl_top_level (tree x)
>  tree
>  pushdecl_top_level_and_finish (tree x, tree init)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  do_push_to_top_level ();
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
> +  push_to_top_level ();
>    gcc_checking_assert (!DECL_CONTEXT (x));
>    DECL_CONTEXT (x) = FROB_CONTEXT (global_namespace);
>    x = pushdecl_namespace_level (x);
>    cp_finish_decl (x, init, false, NULL_TREE, 0);
> -  do_pop_from_top_level ();
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> +  pop_from_top_level ();
>    return x;
>  }
>
> @@ -8728,7 +8660,7 @@ make_namespace_finish (tree ns, tree *slot, bool from_import = false)
>  int
>  push_namespace (tree name, bool make_inline)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>    int count = 0;
>
>    /* We should not get here if the global_namespace is not yet constructed
> @@ -8875,7 +8807,6 @@ push_namespace (tree name, bool make_inline)
>        count++;
>      }
>
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>    return count;
>  }
>
> @@ -8884,14 +8815,12 @@ push_namespace (tree name, bool make_inline)
>  void
>  pop_namespace (void)
>  {
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> +  auto_cond_timevar tv (TV_NAME_LOOKUP);
>
>    gcc_assert (current_namespace != global_namespace);
>    current_namespace = CP_DECL_CONTEXT (current_namespace);
>    /* The binding level is not popped, as it might be re-opened later.  */
>    leave_scope ();
> -
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
>  }
>
>  /* An IMPORT is an import that is defining namespace NAME inside CTX.  Find or
> @@ -8958,43 +8887,6 @@ add_imported_namespace (tree ctx, tree name, location_t loc, unsigned import,
>    return decl;
>  }
>
> -/* External entry points for do_{push_to/pop_from}_top_level.  */
> -
> -void
> -push_to_top_level (void)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  do_push_to_top_level ();
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -}
> -
> -void
> -pop_from_top_level (void)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  do_pop_from_top_level ();
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -}
> -
> -/* External entry points for do_{push,pop}_nested_namespace.  */
> -
> -void
> -push_nested_namespace (tree ns)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  do_push_nested_namespace (ns);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -}
> -
> -void
> -pop_nested_namespace (tree ns)
> -{
> -  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
> -  gcc_assert (current_namespace == ns);
> -  do_pop_nested_namespace (ns);
> -  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
> -}
> -
>  /* Pop off extraneous binding levels left over due to syntax errors.
>     We don't pop past namespaces, as they might be valid.  */
>
>
> base-commit: 582d43a48cb28e6ed36ea6388ca92f3d5d786a26
> --
> 2.27.0
>
diff mbox series

Patch

diff --git a/gcc/timevar.h b/gcc/timevar.h
index 72e31adb9e6..ccaa42e5904 100644
--- a/gcc/timevar.h
+++ b/gcc/timevar.h
@@ -247,13 +247,53 @@  class auto_timevar
       m_timer->pop (m_tv);
   }
 
- private:
+  // Disallow copies.
+  auto_timevar (const auto_timevar &) = delete;
 
-  // Private to disallow copies.
-  auto_timevar (const auto_timevar &);
+ private:
+  timer *m_timer;
+  timevar_id_t m_tv;
+};
+
+// As above, but use cond_start/stop.
+class auto_cond_timevar
+{
+ public:
+  auto_cond_timevar (timer *t, timevar_id_t tv)
+    : m_timer (t),
+      m_tv (tv)
+  {
+    start ();
+  }
+
+  explicit auto_cond_timevar (timevar_id_t tv)
+    : m_timer (g_timer)
+    , m_tv (tv)
+  {
+    start ();
+  }
+
+  ~auto_cond_timevar ()
+  {
+    if (m_timer && !already_running)
+      m_timer->cond_stop (m_tv);
+  }
+
+  // Disallow copies.
+  auto_cond_timevar (const auto_cond_timevar &) = delete;
+
+ private:
+  void start()
+  {
+    if (m_timer)
+      already_running = m_timer->cond_start (m_tv);
+    else
+      already_running = false;
+  }
 
   timer *m_timer;
   timevar_id_t m_tv;
+  bool already_running;
 };
 
 extern void print_time (const char *, long);
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c5601d96ab8..80e618622fb 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -4436,7 +4436,7 @@  build_user_type_conversion (tree totype, tree expr, int flags,
   struct z_candidate *cand;
   tree ret;
 
-  bool subtime = timevar_cond_start (TV_OVERLOAD);
+  auto_cond_timevar tv (TV_OVERLOAD);
   cand = build_user_type_conversion_1 (totype, expr, flags, complain);
 
   if (cand)
@@ -4452,7 +4452,6 @@  build_user_type_conversion (tree totype, tree expr, int flags,
   else
     ret = NULL_TREE;
 
-  timevar_cond_stop (TV_OVERLOAD, subtime);
   return ret;
 }
 
@@ -4692,7 +4691,7 @@  perform_overload_resolution (tree fn,
   tree explicit_targs;
   int template_only;
 
-  bool subtime = timevar_cond_start (TV_OVERLOAD);
+  auto_cond_timevar tv (TV_OVERLOAD);
 
   explicit_targs = NULL_TREE;
   template_only = 0;
@@ -4724,7 +4723,6 @@  perform_overload_resolution (tree fn,
   else
     cand = NULL;
 
-  timevar_cond_stop (TV_OVERLOAD, subtime);
   return cand;
 }
 
@@ -4989,8 +4987,8 @@  build_operator_new_call (tree fnname, vec<tree, va_gc> **args,
 
 /* Build a new call to operator().  This may change ARGS.  */
 
-static tree
-build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
+tree
+build_op_call (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
 {
   struct z_candidate *candidates = 0, *cand;
   tree fns, convs, first_mem_arg = NULL_TREE;
@@ -4998,6 +4996,8 @@  build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
   tree result = NULL_TREE;
   void *p;
 
+  auto_cond_timevar tv (TV_OVERLOAD);
+
   obj = mark_lvalue_use (obj);
 
   if (error_operand_p (obj))
@@ -5127,18 +5127,6 @@  build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
   return result;
 }
 
-/* Wrapper for above.  */
-
-tree
-build_op_call (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
-{
-  tree ret;
-  bool subtime = timevar_cond_start (TV_OVERLOAD);
-  ret = build_op_call_1 (obj, args, complain);
-  timevar_cond_stop (TV_OVERLOAD, subtime);
-  return ret;
-}
-
 /* Called by op_error to prepare format strings suitable for the error
    function.  It concatenates a prefix (controlled by MATCH), ERRMSG,
    and a suffix (controlled by NTYPES).  */
@@ -5330,10 +5318,10 @@  conditional_conversion (tree e1, tree e2, tsubst_flags_t complain)
 /* Implement [expr.cond].  ARG1, ARG2, and ARG3 are the three
    arguments to the conditional expression.  */
 
-static tree
-build_conditional_expr_1 (const op_location_t &loc,
-			  tree arg1, tree arg2, tree arg3,
-                          tsubst_flags_t complain)
+tree
+build_conditional_expr (const op_location_t &loc,
+			tree arg1, tree arg2, tree arg3,
+			tsubst_flags_t complain)
 {
   tree arg2_type;
   tree arg3_type;
@@ -5345,6 +5333,8 @@  build_conditional_expr_1 (const op_location_t &loc,
   void *p;
   tree orig_arg2, orig_arg3;
 
+  auto_cond_timevar tv (TV_OVERLOAD);
+
   /* As a G++ extension, the second argument to the conditional can be
      omitted.  (So that `a ? : c' is roughly equivalent to `a ? a :
      c'.)  If the second operand is omitted, make sure it is
@@ -5410,8 +5400,8 @@  build_conditional_expr_1 (const op_location_t &loc,
 	  && !VECTOR_TYPE_P (arg3_type))
 	{
 	  /* Rely on the error messages of the scalar version.  */
-	  tree scal = build_conditional_expr_1 (loc, integer_one_node,
-						orig_arg2, orig_arg3, complain);
+	  tree scal = build_conditional_expr (loc, integer_one_node,
+					      orig_arg2, orig_arg3, complain);
 	  if (scal == error_mark_node)
 	    return error_mark_node;
 	  tree stype = TREE_TYPE (scal);
@@ -5968,20 +5958,6 @@  build_conditional_expr_1 (const op_location_t &loc,
   return result;
 }
 
-/* Wrapper for above.  */
-
-tree
-build_conditional_expr (const op_location_t &loc,
-			tree arg1, tree arg2, tree arg3,
-                        tsubst_flags_t complain)
-{
-  tree ret;
-  bool subtime = timevar_cond_start (TV_OVERLOAD);
-  ret = build_conditional_expr_1 (loc, 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.  */
@@ -6483,10 +6459,10 @@  add_operator_candidates (z_candidate **candidates,
   return NULL_TREE;
 }
 
-static tree
-build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
-		tree arg1, tree arg2, tree arg3, tree *overload,
-		tsubst_flags_t complain)
+tree
+build_new_op (const op_location_t &loc, enum tree_code code, int flags,
+	      tree arg1, tree arg2, tree arg3, tree *overload,
+	      tsubst_flags_t complain)
 {
   struct z_candidate *candidates = 0, *cand;
   vec<tree, va_gc> *arglist;
@@ -6500,6 +6476,8 @@  build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
   bool strict_p;
   bool any_viable_p;
 
+  auto_cond_timevar tv (TV_OVERLOAD);
+
   if (error_operand_p (arg1)
       || error_operand_p (arg2)
       || error_operand_p (arg3))
@@ -6635,8 +6613,8 @@  build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
 	    code = PREINCREMENT_EXPR;
 	  else
 	    code = PREDECREMENT_EXPR;
-	  result = build_new_op_1 (loc, code, flags, arg1, NULL_TREE,
-				   NULL_TREE, overload, complain);
+	  result = build_new_op (loc, code, flags, arg1, NULL_TREE,
+				 NULL_TREE, overload, complain);
 	  break;
 
 	  /* The caller will deal with these.  */
@@ -6958,21 +6936,6 @@  build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
   return NULL_TREE;
 }
 
-/* Wrapper for above.  */
-
-tree
-build_new_op (const op_location_t &loc, enum tree_code code, int flags,
-	      tree arg1, tree arg2, tree arg3,
-	      tree *overload, tsubst_flags_t complain)
-{
-  tree ret;
-  bool subtime = timevar_cond_start (TV_OVERLOAD);
-  ret = build_new_op_1 (loc, code, flags, arg1, arg2, arg3,
-			overload, complain);
-  timevar_cond_stop (TV_OVERLOAD, subtime);
-  return ret;
-}
-
 /* CALL was returned by some call-building function; extract the actual
    CALL_EXPR from any bits that have been tacked on, e.g. by
    convert_from_reference.  */
@@ -10670,10 +10633,10 @@  complain_about_no_candidates_for_method_call (tree instance,
    be set, upon return, to the function called.  ARGS may be NULL.
    This may change ARGS.  */
 
-static tree
-build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
-		         tree conversion_path, int flags,
-		         tree *fn_p, tsubst_flags_t complain)
+tree
+build_new_method_call (tree instance, tree fns, vec<tree, va_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;
@@ -10693,6 +10656,8 @@  build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
   vec<tree, va_gc> *orig_args = NULL;
   void *p;
 
+  auto_cond_timevar tv (TV_OVERLOAD);
+
   gcc_assert (instance != NULL_TREE);
 
   /* We don't know what function we're going to call, yet.  */
@@ -11072,21 +11037,6 @@  build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
   return call;
 }
 
-/* Wrapper for above.  */
-
-tree
-build_new_method_call (tree instance, tree fns, vec<tree, va_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.  */
 
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 242429d9ef4..2ff3845dcd4 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -597,7 +597,7 @@  poplevel (int keep, int reverse, int functionbody)
   tree decl;
   scope_kind kind;
 
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
  restart:
 
   block = NULL_TREE;
@@ -829,7 +829,6 @@  poplevel (int keep, int reverse, int functionbody)
   if (kind == sk_cleanup)
     goto restart;
 
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return block;
 }
 
@@ -908,7 +907,7 @@  static GTY((deletable)) vec<tree, va_gc> *local_entities;
 void
 determine_local_discriminator (tree decl)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   retrofit_lang_decl (decl);
   tree ctx = DECL_CONTEXT (decl);
   tree name = (TREE_CODE (decl) == TYPE_DECL
@@ -943,8 +942,6 @@  determine_local_discriminator (tree decl)
       local_entities->quick_push (decl);
       local_entities->quick_push (name);
     }
-
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
 
@@ -3277,6 +3274,8 @@  named_label_hash::equal (const value_type entry, compare_type name)
 static named_label_entry *
 lookup_label_1 (tree id, bool making_local_p)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   /* You can't use labels at global scope.  */
   if (current_function_decl == NULL_TREE)
     {
@@ -3339,18 +3338,14 @@  lookup_label_1 (tree id, bool making_local_p)
 tree
 lookup_label (tree id)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
   named_label_entry *ent = lookup_label_1 (id, false);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return ent ? ent->label_decl : NULL_TREE;
 }
 
 tree
 declare_local_label (tree id)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
   named_label_entry *ent = lookup_label_1 (id, true);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return ent ? ent->label_decl : NULL_TREE;
 }
 
@@ -3681,9 +3676,11 @@  check_omp_return (void)
 /* Define a label, specifying the location in the source file.
    Return the LABEL_DECL node for the label.  */
 
-static tree
-define_label_1 (location_t location, tree name)
+tree
+define_label (location_t location, tree name)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   /* After labels, make any new cleanups in the function go into their
      own new (temporary) binding contour.  */
   for (cp_binding_level *p = current_binding_level;
@@ -3717,18 +3714,6 @@  define_label_1 (location_t location, tree name)
   return decl;
 }
 
-/* Wrapper for define_label_1.  */
-
-tree
-define_label (location_t location, tree name)
-{
-  bool running = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = define_label_1 (location, name);
-  timevar_cond_stop (TV_NAME_LOOKUP, running);
-  return ret;
-}
-
-
 struct cp_switch
 {
   cp_binding_level *level;
@@ -15499,13 +15484,15 @@  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.  */
 
-static tree
-xref_tag_1 (enum tag_types tag_code, tree name,
-            TAG_how how, bool template_header_p)
+tree
+xref_tag (enum tag_types tag_code, tree name,
+	  TAG_how how, bool template_header_p)
 {
   enum tree_code code;
   tree context = NULL_TREE;
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   gcc_assert (identifier_p (name));
 
   switch (tag_code)
@@ -15654,18 +15641,6 @@  xref_tag_1 (enum tag_types tag_code, tree name,
   return t;
 }
 
-/* Wrapper for xref_tag_1.  */
-
-tree
-xref_tag (enum tag_types tag_code, tree name,
-	  TAG_how how, bool template_header_p)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = xref_tag_1 (tag_code, name, how, template_header_p);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 /* Create the binfo hierarchy for REF with (possibly NULL) base list
    BASE_LIST.  For each element on BASE_LIST the TREE_PURPOSE is an
    access_* node, and the TREE_VALUE is the type of the base-class.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index c414a1091b4..b4c636d551a 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -39,7 +39,6 @@  along with GCC; see the file COPYING3.  If not see
 
 static cxx_binding *cxx_binding_make (tree value, tree type);
 static cp_binding_level *innermost_nonclass_level (void);
-static tree do_pushdecl (tree decl, bool hiding);
 static void set_identifier_type_value_with_scope (tree id, tree decl,
 						  cp_binding_level *b);
 static name_hint maybe_suggest_missing_std_header (location_t location,
@@ -1725,11 +1724,9 @@  static void diagnose_name_conflict (tree, tree);
 tree
 lookup_arg_dependent (tree name, tree fns, vec<tree, va_gc> *args)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   name_lookup lookup (name);
-  fns = lookup.search_adl (fns, args);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return fns;
+  return lookup.search_adl (fns, args);
 }
 
 /* FNS is an overload set of conversion functions.  Return the
@@ -2595,8 +2592,10 @@  anticipated_builtin_p (tree ovl)
    was successful.  */
 
 static bool
-supplement_binding_1 (cxx_binding *binding, tree decl)
+supplement_binding (cxx_binding *binding, tree decl)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   tree bval = binding->value;
   bool ok = true;
   tree target_bval = strip_using_decl (bval);
@@ -2736,18 +2735,6 @@  diagnose_name_conflict (tree decl, tree bval)
   inform (location_of (bval), "previous declaration %q#D", bval);
 }
 
-/* Wrapper for supplement_binding_1.  */
-
-static bool
-supplement_binding (cxx_binding *binding, tree decl)
-{
-  bool ret;
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  ret = supplement_binding_1 (binding, decl);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 /* Replace BINDING's current value on its scope's name list with
    NEWVAL.  */
 
@@ -3472,7 +3459,7 @@  push_local_extern_decl_alias (tree decl)
 	  /* Expected default linkage is from the namespace.  */
 	  TREE_PUBLIC (alias) = TREE_PUBLIC (ns);
 	  push_nested_namespace (ns);
-	  alias = do_pushdecl (alias, /* hiding= */true);
+	  alias = pushdecl (alias, /* hiding= */true);
 	  pop_nested_namespace (ns);
 	  if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl))
 	    set_decl_tls_model (alias, DECL_TLS_MODEL (decl));
@@ -3618,16 +3605,20 @@  check_module_override (tree decl, tree mvec, bool hiding,
 
 /* Record DECL as belonging to the current lexical scope.  Check for
    errors (such as an incompatible declaration for the same name
-   already seen in the same scope).  IS_FRIEND is true if DECL is
-   declared as a friend.
+   already seen in the same scope).
+
+   The new binding is hidden if HIDING is true (an anticipated builtin
+   or hidden friend).
 
    Returns either DECL or an old decl for the same name.  If an old
    decl is returned, it may have been smashed to agree with what DECL
    says.  */
 
-static tree
-do_pushdecl (tree decl, bool hiding)
+tree
+pushdecl (tree decl, bool hiding)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   if (decl == error_mark_node)
     return error_mark_node;
 
@@ -3843,19 +3834,6 @@  do_pushdecl (tree decl, bool hiding)
   return decl;
 }
 
-/* Record a decl-node X as belonging to the current lexical scope.
-   The new binding is hidden if HIDING is true (an anticipated builtin
-   or hidden friend).   */
-
-tree
-pushdecl (tree x, bool hiding)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = do_pushdecl (x, hiding);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 /* A mergeable entity is being loaded into namespace NS slot NAME.
    Create and return the appropriate vector slot for that.  Either a
    GMF slot or a module-specific one.  */
@@ -4784,7 +4762,7 @@  do_pushdecl_with_scope (tree x, cp_binding_level *level, bool hiding = false)
 	current_function_decl = NULL_TREE;
       b = current_binding_level;
       current_binding_level = level;
-      x = do_pushdecl (x, hiding);
+      x = pushdecl (x, hiding);
       current_binding_level = b;
       current_function_decl = function_decl;
     }
@@ -4797,17 +4775,14 @@  tree
 pushdecl_outermost_localscope (tree x)
 {
   cp_binding_level *b = NULL;
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
 
   /* Find the scope just inside the function parms.  */
   for (cp_binding_level *n = current_binding_level;
        n->kind != sk_function_parms; n = b->level_chain)
     b = n;
 
-  tree ret = b ? do_pushdecl_with_scope (x, b) : error_mark_node;
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-
-  return ret;
+  return b ? do_pushdecl_with_scope (x, b) : error_mark_node;
 }
 
 /* Process a local-scope or namespace-scope using declaration.  LOOKUP
@@ -5196,7 +5171,7 @@  poplevel_class (void)
   size_t i;
   tree shadowed;
 
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   gcc_assert (level != 0);
 
   /* If we're leaving a toplevel class, cache its binding level.  */
@@ -5223,7 +5198,6 @@  poplevel_class (void)
      `pushlevel_class' routine.  */
   gcc_assert (current_binding_level == level);
   leave_scope ();
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
 /* Set INHERITED_VALUE_BINDING_P on BINDING to true or false, as
@@ -5266,14 +5240,13 @@  bool
 pushdecl_class_level (tree x)
 {
   bool is_valid = true;
-  bool subtime;
 
   /* Do nothing if we're adding to an outer lambda closure type,
      outer_binding will add it later if it's needed.  */
   if (current_class_type != class_binding_level->this_entity)
     return true;
 
-  subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   /* Get the name of X.  */
   tree name = OVL_NAME (x);
 
@@ -5313,7 +5286,6 @@  pushdecl_class_level (tree x)
 	    }
       input_location = save_location;
     }
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return is_valid;
 }
 
@@ -5359,13 +5331,15 @@  get_class_binding (tree name, cp_binding_level *scope)
 /* Make the declaration(s) of X appear in CLASS scope under the name
    NAME.  Returns true if the binding is valid.  */
 
-static bool
-push_class_level_binding_1 (tree name, tree x)
+bool
+push_class_level_binding (tree name, tree x)
 {
   cxx_binding *binding;
   tree decl = x;
   bool ok;
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   /* The class_binding_level will be NULL if x is a template
      parameter name in a member template.  */
   if (!class_binding_level)
@@ -5537,18 +5511,6 @@  push_class_level_binding_1 (tree name, tree x)
   return ok;
 }
 
-/* Wrapper for push_class_level_binding_1.  */
-
-bool
-push_class_level_binding (tree name, tree x)
-{
-  bool ret;
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  ret = push_class_level_binding_1 (name, x);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 /* Process and lookup a using decl SCOPE::lookup.name, filling in
    lookup.values & lookup.type.  Return a USING_DECL, or NULL_TREE on
    failure.  */
@@ -5792,7 +5754,7 @@  do_class_using_decl (tree scope, tree name)
 tree
 get_namespace_binding (tree ns, tree name)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   if (!ns)
     ns = global_namespace;
   gcc_checking_assert (!DECL_NAMESPACE_ALIAS (ns));
@@ -5808,7 +5770,6 @@  get_namespace_binding (tree ns, tree name)
 	ret = MAYBE_STAT_DECL (ret);
     }
 
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return ret;
 }
 
@@ -5819,7 +5780,7 @@  get_namespace_binding (tree ns, tree name)
 void
 set_global_binding (tree decl)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
 
   tree *slot = find_namespace_slot (global_namespace, DECL_NAME (decl), true);
 
@@ -5829,8 +5790,6 @@  set_global_binding (tree decl)
 
   /* Force the binding, so compiler internals continue to work.  */
   *slot = decl;
-
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
 /* Set the context of a declaration to scope. Complain if we are not
@@ -6123,11 +6082,9 @@  do_namespace_alias (tree alias, tree name_space)
 tree
 pushdecl_namespace_level (tree decl, bool hiding)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree res = do_pushdecl_with_scope (decl, NAMESPACE_LEVEL (current_namespace),
-				     hiding);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return res;
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+  return do_pushdecl_with_scope (decl, NAMESPACE_LEVEL (current_namespace),
+				 hiding);
 }
 
 /* Wrapper around push_local_binding to push the bindings for
@@ -7690,11 +7647,13 @@  innermost_non_namespace_value (tree name)
    WANT can also have LOOK_want::HIDDEN_FRIEND or
    LOOK_want::HIDDEN_LAMBDa added to it.  */
 
-static tree
-lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
+tree
+lookup_name (tree name, LOOK_where where, LOOK_want want)
 {
   tree val = NULL_TREE;
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   gcc_checking_assert (unsigned (where) != 0);
   /* If we're looking for hidden lambda things, we shouldn't be
      looking in namespace scope.  */
@@ -7795,17 +7754,6 @@  lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
   return val;
 }
 
-/* Wrapper for lookup_name_1.  */
-
-tree
-lookup_name (tree name, LOOK_where where, LOOK_want want)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = lookup_name_1 (name, where, want);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 tree
 lookup_name (tree name)
 {
@@ -7825,9 +7773,11 @@  lookup_name (tree name)
    A TYPE_DECL best matching the NAME is returned.  Catching error
    and issuing diagnostics are caller's responsibility.  */
 
-static tree
-lookup_elaborated_type_1 (tree name, TAG_how how)
+tree
+lookup_elaborated_type (tree name, TAG_how how)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   cp_binding_level *b = current_binding_level;
 
   if (b->kind != sk_namespace)
@@ -8011,17 +7961,6 @@  lookup_elaborated_type_1 (tree name, TAG_how how)
   return NULL_TREE;
 }
 
-/* Wrapper for lookup_type_scope_1.  */
-
-tree
-lookup_elaborated_type (tree name, TAG_how how)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = lookup_elaborated_type_1 (name, how);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 /* The type TYPE is being declared.  If it is a class template, or a
    specialization of a class template, do any processing required and
    perform error-checking.  If IS_FRIEND is nonzero, this TYPE is
@@ -8099,13 +8038,15 @@  maybe_process_template_type_declaration (tree type, int is_friend,
 
    Returns TYPE upon success and ERROR_MARK_NODE otherwise.  */
 
-static tree
-do_pushtag (tree name, tree type, TAG_how how)
+tree
+pushtag (tree name, tree type, TAG_how how)
 {
   tree decl;
 
   gcc_assert (identifier_p (name));
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   cp_binding_level *b = current_binding_level;
   while (true)
     {
@@ -8249,18 +8190,6 @@  do_pushtag (tree name, tree type, TAG_how how)
 
   return type;
 }
-
-/* Wrapper for do_pushtag.  */
-
-tree
-pushtag (tree name, tree type, TAG_how how)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  tree ret = do_pushtag (name, type, how);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-  return ret;
-}
-
 
 /* Subroutines for reverting temporarily to top-level for instantiation
    of templates and such.  We actually need to clear out the class- and
@@ -8309,7 +8238,7 @@  store_bindings (tree names, vec<cxx_saved_binding, va_gc> **old_bindings)
   tree t, id;
   size_t i;
 
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   for (t = names; t; t = TREE_CHAIN (t))
     {
       if (TREE_CODE (t) == TREE_LIST)
@@ -8331,7 +8260,6 @@  store_bindings (tree names, vec<cxx_saved_binding, va_gc> **old_bindings)
 	}
       bindings_need_stored.truncate (0);
     }
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
 /* Like store_bindings, but NAMES is a vector of cp_class_binding
@@ -8362,8 +8290,8 @@  store_class_bindings (vec<cp_class_binding, va_gc> *names,
 
 static GTY((deletable)) struct saved_scope *free_saved_scope;
 
-static void
-do_push_to_top_level (void)
+void
+push_to_top_level (void)
 {
   struct saved_scope *s;
   cp_binding_level *b;
@@ -8371,6 +8299,8 @@  do_push_to_top_level (void)
   size_t i;
   bool need_pop;
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   /* Reuse or create a new structure for this saved scope.  */
   if (free_saved_scope != NULL)
     {
@@ -8448,13 +8378,15 @@  do_push_to_top_level (void)
   suppress_location_wrappers = 0;
 }
 
-static void
-do_pop_from_top_level (void)
+void
+pop_from_top_level (void)
 {
   struct saved_scope *s = scope_chain;
   cxx_saved_binding *saved;
   size_t i;
 
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+
   /* Clear out class-level bindings cache.  */
   if (previous_class_level)
     invalidate_class_lookup_cache ();
@@ -8489,14 +8421,15 @@  do_pop_from_top_level (void)
 /* Push into the scope of the namespace NS, even if it is deeply
    nested within another namespace.  */
 
-static void
-do_push_nested_namespace (tree ns)
+void
+push_nested_namespace (tree ns)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   if (ns == global_namespace)
-    do_push_to_top_level ();
+    push_to_top_level ();
   else
     {
-      do_push_nested_namespace (CP_DECL_CONTEXT (ns));
+      push_nested_namespace (CP_DECL_CONTEXT (ns));
       resume_scope (NAMESPACE_LEVEL (ns));
       current_namespace = ns;
     }
@@ -8505,9 +8438,10 @@  do_push_nested_namespace (tree ns)
 /* Pop back from the scope of the namespace NS, which was previously
    entered with push_nested_namespace.  */
 
-static void
-do_pop_nested_namespace (tree ns)
+void
+pop_nested_namespace (tree ns)
 {
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   while (ns != global_namespace)
     {
       ns = CP_DECL_CONTEXT (ns);
@@ -8515,7 +8449,7 @@  do_pop_nested_namespace (tree ns)
       leave_scope ();
     }
 
-  do_pop_from_top_level ();
+  pop_from_top_level ();
 }
 
 /* Add TARGET to USINGS, if it does not already exist there.  We used
@@ -8595,13 +8529,12 @@  finish_using_directive (tree target, tree attribs)
 tree
 pushdecl_top_level (tree x)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  do_push_to_top_level ();
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+  push_to_top_level ();
   gcc_checking_assert (!DECL_CONTEXT (x));
   DECL_CONTEXT (x) = FROB_CONTEXT (global_namespace);
   x = pushdecl_namespace_level (x);
-  do_pop_from_top_level ();
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
+  pop_from_top_level ();
   return x;
 }
 
@@ -8611,14 +8544,13 @@  pushdecl_top_level (tree x)
 tree
 pushdecl_top_level_and_finish (tree x, tree init)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  do_push_to_top_level ();
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
+  push_to_top_level ();
   gcc_checking_assert (!DECL_CONTEXT (x));
   DECL_CONTEXT (x) = FROB_CONTEXT (global_namespace);
   x = pushdecl_namespace_level (x);
   cp_finish_decl (x, init, false, NULL_TREE, 0);
-  do_pop_from_top_level ();
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
+  pop_from_top_level ();
   return x;
 }
 
@@ -8728,7 +8660,7 @@  make_namespace_finish (tree ns, tree *slot, bool from_import = false)
 int
 push_namespace (tree name, bool make_inline)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
   int count = 0;
 
   /* We should not get here if the global_namespace is not yet constructed
@@ -8875,7 +8807,6 @@  push_namespace (tree name, bool make_inline)
       count++;
     }
 
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
   return count;
 }
 
@@ -8884,14 +8815,12 @@  push_namespace (tree name, bool make_inline)
 void
 pop_namespace (void)
 {
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
+  auto_cond_timevar tv (TV_NAME_LOOKUP);
 
   gcc_assert (current_namespace != global_namespace);
   current_namespace = CP_DECL_CONTEXT (current_namespace);
   /* The binding level is not popped, as it might be re-opened later.  */
   leave_scope ();
-
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
 }
 
 /* An IMPORT is an import that is defining namespace NAME inside CTX.  Find or
@@ -8958,43 +8887,6 @@  add_imported_namespace (tree ctx, tree name, location_t loc, unsigned import,
   return decl;
 }
 
-/* External entry points for do_{push_to/pop_from}_top_level.  */
-
-void
-push_to_top_level (void)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  do_push_to_top_level ();
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-}
-
-void
-pop_from_top_level (void)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  do_pop_from_top_level ();
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-}
-
-/* External entry points for do_{push,pop}_nested_namespace.  */
-
-void
-push_nested_namespace (tree ns)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  do_push_nested_namespace (ns);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-}
-
-void
-pop_nested_namespace (tree ns)
-{
-  bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
-  gcc_assert (current_namespace == ns);
-  do_pop_nested_namespace (ns);
-  timevar_cond_stop (TV_NAME_LOOKUP, subtime);
-}
-
 /* Pop off extraneous binding levels left over due to syntax errors.
    We don't pop past namespaces, as they might be valid.  */