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.  */
 
