From patchwork Mon Oct 18 14:22:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 1542666 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=p7sPZ64P; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4HXzcj0J2cz9sRN for ; Tue, 19 Oct 2021 01:23:17 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 499383858426 for ; Mon, 18 Oct 2021 14:23:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 499383858426 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1634566994; bh=vVmQm1yNdb63TuqJfMQ71b+r8+b0HA4ojo1I4aNMQgk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=p7sPZ64PTWuasOwprOMeIvL/HBQloK0I/beG4d8DGG3bgGw4EgibUnq6sIUCDoGKL kC435LsntA99b6g1tY1w51+p5k2Rk2E+Hu7YFYLUeKqL1qFZw2KV1zhFo7YGdfy50f RFi0AqHyYts4hnInoxSeph3CInA7W6J3LO9Cgt/0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTPS id 97A5E3858400 for ; Mon, 18 Oct 2021 14:22:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 97A5E3858400 Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-593-Arc7aA7VOY2jR9DEpaaSyA-1; Mon, 18 Oct 2021 10:22:49 -0400 X-MC-Unique: Arc7aA7VOY2jR9DEpaaSyA-1 Received: by mail-qk1-f200.google.com with SMTP id b18-20020a05620a119200b0045ff23bd078so5584716qkk.13 for ; Mon, 18 Oct 2021 07:22:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=vVmQm1yNdb63TuqJfMQ71b+r8+b0HA4ojo1I4aNMQgk=; b=YihHHhLEeL2pGfJgYB9mvJu6R7xQDIOktRJ3YeniOQPVRUuiMbNFPVKH/937W76+gh HDXwJczDqnXPBW5vnVY7Cvtlyj3o2wN0UDF6CNRVDWTpQ8q5u7OQwHCYPGdJ3YdpOR5N UJ3c/O9roFoEPdyjXPmySlgMwwj37x5z4fWrrPCyuhxx3mJHbLLYpdJdj31+p/qpbq1p Pn89u30oJuBC1p0z4KH99b4xeXm+zmTVc4Bdgbterz4wr8vFzF5ZJsYlwXoXUaY0R2WS E33DjpQ8MMDwn1yKIRKiQQcA2VRNJAxYK1hON/IF6na5Er4CCuFH+vpxiAQy7OSU+0Dm Afzg== X-Gm-Message-State: AOAM532i/V5C7bGaqs/NFO3aOgKzF/1iOLb8AU+NKo1bSAjktngloaIN Bv/+BcN9Iq4q64NCQLJ7h7N4poEcTZXOoqIONVnYE7FYN0KWwjazrydUj4liUXOggErusRi+O68 An9qJxAZo9KP/QojPQP2/kDmJ6pmXlZkbjXSrggW6WOcDcFRtKhpfZ4v++m06FSAPJQ== X-Received: by 2002:a37:a87:: with SMTP id 129mr22609433qkk.107.1634566967695; Mon, 18 Oct 2021 07:22:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwC6NiegIzHkGzrwcfN4KHk0VrB0UU2G0ueNDZDkXmU3ww/yTWKeN4AiYqtcI88i0X9PjYOWw== X-Received: by 2002:a37:a87:: with SMTP id 129mr22609337qkk.107.1634566966665; Mon, 18 Oct 2021 07:22:46 -0700 (PDT) Received: from barrymore.redhat.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id n20sm1454347qkk.63.2021.10.18.07.22.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Oct 2021 07:22:45 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH RFA] timevar: Add auto_cond_timevar class Date: Mon, 18 Oct 2021 10:22:44 -0400 Message-Id: <20211018142244.721838-1-jason@redhat.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-26.8 required=5.0 tests=BAYES_00, DKIM_INVALID, DKIM_SIGNED, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" 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 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 **args, /* Build a new call to operator(). This may change ARGS. */ -static tree -build_op_call_1 (tree obj, vec **args, tsubst_flags_t complain) +tree +build_op_call (tree obj, vec **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 **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 **args, tsubst_flags_t complain) return result; } -/* Wrapper for above. */ - -tree -build_op_call (tree obj, vec **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 *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 **args, - tree conversion_path, int flags, - tree *fn_p, tsubst_flags_t complain) +tree +build_new_method_call (tree instance, tree fns, vec **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 **args, vec *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 **args, return call; } -/* Wrapper for above. */ - -tree -build_new_method_call (tree instance, tree fns, vec **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 *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 *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 **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 **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 *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. */