From patchwork Wed Jan 24 11:07:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 1890189 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=n8eSLWVL; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TKh6L6Cwfz23dq for ; Wed, 24 Jan 2024 22:08:58 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91F9C385E019 for ; Wed, 24 Jan 2024 11:08:56 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 97D253857C69 for ; Wed, 24 Jan 2024 11:08:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 97D253857C69 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 97D253857C69 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094506; cv=none; b=M1Q0jep5SOSUhCqlFcSQU1aqyTRS/PgpwNYSApm4zN+ZjXNTEx8UHBNSH/oKbMljLdGmvsTU85cOSJ/N5KoHj/vUUMzpNYkeqpJ+LsLBXy08xYnLKD+kksps+e9e95hEUstz4iLMDvGzEqBeB1fYM6IUajw6rEA9jUs4hBlxFsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094506; c=relaxed/simple; bh=6gu7FOKHdLCFrcIlsO2VIdvK7EIHzHG7Q2copvMq/YA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=aPnpBeTdv9FntoEnFwBRlORYU48IUmAazkWBvTNH4SHHyo4Fiax+llSZjIDhpIqoPNrTyVT4MySYiyLOjNC2g1YEvR/vtcvyxnP1KZsOtxbUfodCgnwSJ2V+j+IkRE+Z/7uexzqt4Q/IUFXd6un6+5G4cIbhwjP1xTRgSkzh9i0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7F-0004qO-RL for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094501; x=1737630501; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=6gu7FOKHdLCFrcIlsO2VIdvK7EIHzHG7Q2copvMq/YA=; b=n8eSLWVLgYX5DGmfPcNQxW5zyPyKEk9ulVc6lSUt8eKD9OuH4opKAkVm X4PVfoCyi7oCQ9JnL5ahqOrPpUSLknBT90FoszW5Fvuwblh4wgE11EPNc WT/Smt6QckE/kfP3tDNrkZJgKlDBL2SPbgbl2+fqN4YqdUWeahN2NqeNN qHE497q2Ap9h+PizOLMgedFu2Z+31k5wh1DvYCGPJbMH0BGLJiaoAPPHJ GLdMnTedIVEHyATX8sZQWMABhLAAqYFD3jUpecqKrQxQHuiXAvBRzr3OI 7e4FG1laGPNkshCdOGsuad5pqJxYScy3Bu8CxD6wRCSe2FnDtjpAbj/6C Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969568" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969568" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472953" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472953" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 1/4] Improve must tail in RTL backend Date: Wed, 24 Jan 2024 03:07:57 -0800 Message-ID: <20240124110800.3154093-1-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org - Give error messages for all causes of non sibling call generation - Don't override choices of other non sibling call checks with must tail. This causes ICEs. The must tail attribute now only overrides flag_optimize_sibling_calls locally. - Error out when tree-tailcall failed to mark a must-tail call sibcall. In this case it doesn't know the true reason and only gives a vague message (this could be improved, but it's already useful without that) tree-tailcall usually fails without optimization, so must adjust the existing must-tail plugin test to specify -O2. --- gcc/calls.cc | 31 +++++++++++++------ .../gcc.dg/plugin/must-tail-call-1.c | 1 + 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/gcc/calls.cc b/gcc/calls.cc index 01f447347437..3115807b7788 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -2650,7 +2650,9 @@ expand_call (tree exp, rtx target, int ignore) /* The type of the function being called. */ tree fntype; bool try_tail_call = CALL_EXPR_TAILCALL (exp); - bool must_tail_call = CALL_EXPR_MUST_TAIL_CALL (exp); + /* tree-tailcall decided not to do tail calls. Error for the musttail case. */ + if (!try_tail_call) + maybe_complain_about_tail_call (exp, "cannot tail-call: other reasons"); int pass; /* Register in which non-BLKmode value will be returned, @@ -3021,10 +3023,22 @@ expand_call (tree exp, rtx target, int ignore) pushed these optimizations into -O2. Don't try if we're already expanding a call, as that means we're an argument. Don't try if there's cleanups, as we know there's code to follow the call. */ - if (currently_expanding_call++ != 0 - || (!flag_optimize_sibling_calls && !CALL_FROM_THUNK_P (exp)) - || args_size.var - || dbg_cnt (tail_call) == false) + if (currently_expanding_call++ != 0) + { + maybe_complain_about_tail_call (exp, "cannot tail-call: inside another call"); + try_tail_call = 0; + } + if (!flag_optimize_sibling_calls + && !CALL_FROM_THUNK_P (exp) + && !CALL_EXPR_MUST_TAIL_CALL (exp)) + try_tail_call = 0; + if (args_size.var) + { + /* ??? correct message? */ + maybe_complain_about_tail_call (exp, "cannot tail-call: stack space needed"); + try_tail_call = 0; + } + if (dbg_cnt (tail_call) == false) try_tail_call = 0; /* Workaround buggy C/C++ wrappers around Fortran routines with @@ -3045,15 +3059,12 @@ expand_call (tree exp, rtx target, int ignore) if (MEM_P (*iter)) { try_tail_call = 0; + maybe_complain_about_tail_call (exp, + "cannot tail-call: hidden string length argument"); break; } } - /* If the user has marked the function as requiring tail-call - optimization, attempt it. */ - if (must_tail_call) - try_tail_call = 1; - /* Rest of purposes for tail call optimizations to fail. */ if (try_tail_call) try_tail_call = can_implement_as_sibling_call_p (exp, diff --git a/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c b/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c index 3a6d4cceaba7..44af361e2925 100644 --- a/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c +++ b/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c @@ -1,4 +1,5 @@ /* { dg-do compile { target tail_call } } */ +/* { dg-options "-O2" } */ /* { dg-options "-fdelayed-branch" { target sparc*-*-* } } */ extern void abort (void); From patchwork Wed Jan 24 11:07:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 1890193 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=WICMJqOa; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TKh7x3zysz23dy for ; Wed, 24 Jan 2024 22:10:21 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 82697385E454 for ; Wed, 24 Jan 2024 11:10:19 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 4B6393857BAF for ; Wed, 24 Jan 2024 11:08:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4B6393857BAF Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4B6393857BAF Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; cv=none; b=m6uNxWzZ5h07CCWunICneB7yCTl0ES5+aJd5KghhvY5JcoCH2iIyF0dd3NWxoDbNrtuNvtBOM2CAsGohUa60ErwVUdnYFzjGyQ1qSQy34cHeUaJ+QwbIYMhAPC1RMXBxdzKhbLG8r2qHoHnIwruCaGbvlU84bv7SqDFaL5kpeJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; c=relaxed/simple; bh=NSJ7dXXUPEVyHP2Hxsib/3ihEeOU7RF/DjAeQFJf888=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=SbQ5djU0Q4qHo+IfxcVLziM9WtuNVOForrqEe7VsgxvxhwHs3Cr2L+dkc/9AapYzVAnZplJQLP76yDRkhQnbwweDJyf4n2gLgKJpzgENvuDl56dWbFrQNdYd8zVW3HRpA5pBWCyaq7h9jriJ1r/i4pBRvx4NJBAsRJZTS++G1DE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7I-0004qO-Pd for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094504; x=1737630504; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NSJ7dXXUPEVyHP2Hxsib/3ihEeOU7RF/DjAeQFJf888=; b=WICMJqOaqLDH9B4KntpODb3OR4aJchkjUIePV2+hY1AxlwY4vJJaoLk1 1jRRS5EdXHnqgCMCaaziq4+4nSMlhLEVebm17B1Z2wr5s75yRFLNFQ+Qv jsBUmJGrq8Mtz3PjR3vnVek02jPq6/GI+98fU8Kf4Lbckz1cLcPphNblr yukybWP0JCgvSkxvtlyT/FPj2dlMlK0w9oQG+ScCBD+Rh+J4J7UeDvBUY AoZ/CDhWaJ6E8uGe/9qb1Oh7ggPK4ndEPr2qR1gECN9MIv1PpJ4k4Tvjr I4A5qHz/G3IMkDJcRkBY/JdBzmZOVlc16o1cIsjHjjm7Uc9gSijawoG8c g==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969569" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969569" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472954" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472954" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 2/4] C++: Support clang compatible [[musttail]] Date: Wed, 24 Jan 2024 03:07:58 -0800 Message-ID: <20240124110800.3154093-2-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org This patch implements a clang compatible [[musttail]] attribute for returns. musttail is useful as an alternative to computed goto for interpreters. With computed goto the interpreter function usually ends up very big which causes problems with register allocation and other per function optimizations not scaling. With musttail the interpreter can be instead written as a sequence of smaller functions that call each other. To avoid unbounded stack growth this requires forcing a sibling call, which this attribute does. It guarantees an error if the call cannot be tail called which allows the programmer to fix it instead of risking a stack overflow. Unlike computed goto it is also type-safe. It turns out that David Malcolm had already implemented middle/backend support for a musttail attribute back in 2016, but it wasn't exposed to any frontend other than a special plugin. This patch adds a [[gnu::musttail]] attribute for C++ that can be added to return statements. The return statement must be a direct call (it does not follow dependencies), which is similar to what clang implements. It then uses the existing must tail infrastructure. For compatibility it also detects clang::musttail One problem is that tree-tailcall usually fails when optimization is disabled, which implies the attribute only really works with optimization on. But that seems to be a reasonable limitation. The attribute is only supported for C++, since the C-parser has no support for statement attributes for non empty statements. It could be added there with __attribute__ too but would need some minor grammar adjustments. Passes bootstrap and full test --- gcc/c-family/c-attribs.cc | 25 +++++++++++++++++++++++++ gcc/cp/cp-tree.h | 4 ++-- gcc/cp/parser.cc | 28 +++++++++++++++++++++++----- gcc/cp/semantics.cc | 6 +++--- gcc/cp/typeck.cc | 20 ++++++++++++++++++-- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index 40a0cf90295d..f31c62e76665 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -54,6 +54,7 @@ static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *); static tree handle_common_attribute (tree *, tree, tree, int, bool *); static tree handle_hot_attribute (tree *, tree, tree, int, bool *); static tree handle_cold_attribute (tree *, tree, tree, int, bool *); +static tree handle_musttail_attribute (tree *, tree, tree, int, bool *); static tree handle_no_sanitize_attribute (tree *, tree, tree, int, bool *); static tree handle_no_sanitize_address_attribute (tree *, tree, tree, int, bool *); @@ -499,6 +500,8 @@ const struct attribute_spec c_common_gnu_attributes[] = { "hot", 0, 0, false, false, false, false, handle_hot_attribute, attr_cold_hot_exclusions }, + { "musttail", 0, 0, false, false, false, false, + handle_musttail_attribute, NULL }, { "no_address_safety_analysis", 0, 0, true, false, false, false, handle_no_address_safety_analysis_attribute, @@ -1290,6 +1293,28 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args), return NULL_TREE; } +/* Handle a "musttail" and attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_musttail_attribute (tree *node, tree name, tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) == FUNCTION_DECL + || TREE_CODE (*node) == LABEL_DECL) + { + /* Attribute musttail processing is done later with lookup_attribute. */ + } + else + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + + /* Handle a "cold" and attribute; arguments as in struct attribute_spec.handler. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 60e6dafc5494..bed52e860a00 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7763,7 +7763,7 @@ extern void finish_while_stmt (tree); extern tree begin_do_stmt (void); extern void finish_do_body (tree); extern void finish_do_stmt (tree, tree, bool, tree, bool); -extern tree finish_return_stmt (tree); +extern tree finish_return_stmt (tree, bool = false); extern tree begin_for_scope (tree *); extern tree begin_for_stmt (tree, tree); extern void finish_init_stmt (tree); @@ -8275,7 +8275,7 @@ extern tree composite_pointer_type (const op_location_t &, tsubst_flags_t); extern tree merge_types (tree, tree); extern tree strip_array_domain (tree); -extern tree check_return_expr (tree, bool *, bool *); +extern tree check_return_expr (tree, bool *, bool *, bool); extern tree spaceship_type (tree, tsubst_flags_t = tf_warning_or_error); extern tree genericize_spaceship (location_t, tree, tree, tree); extern tree cp_build_binary_op (const op_location_t &, diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 3748ccd49ff3..5a32804c0201 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -2462,7 +2462,7 @@ static tree cp_parser_perform_range_for_lookup static tree cp_parser_range_for_member_function (tree, tree); static tree cp_parser_jump_statement - (cp_parser *); + (cp_parser *, bool = false); static void cp_parser_declaration_statement (cp_parser *); @@ -12719,9 +12719,27 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, NULL_TREE, false); break; + case RID_RETURN: + { + bool musttail_p = false; + std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc); + if (lookup_attribute ("", "musttail", std_attrs)) + { + musttail_p = true; + std_attrs = remove_attribute ("", "musttail", std_attrs); + } + // support this for compatibility + if (lookup_attribute ("clang", "musttail", std_attrs)) + { + musttail_p = true; + std_attrs = remove_attribute ("clang", "musttail", std_attrs); + } + statement = cp_parser_jump_statement (parser, musttail_p); + } + break; + case RID_BREAK: case RID_CONTINUE: - case RID_RETURN: case RID_CO_RETURN: case RID_GOTO: std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc); @@ -14767,7 +14785,7 @@ cp_parser_init_statement (cp_parser *parser, tree *decl) return false; } -/* Parse a jump-statement. +/* Parse a jump-statement. MUSTTAIL_P indicates a musttail attribute. jump-statement: break ; @@ -14785,7 +14803,7 @@ cp_parser_init_statement (cp_parser *parser, tree *decl) Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR. */ static tree -cp_parser_jump_statement (cp_parser* parser) +cp_parser_jump_statement (cp_parser* parser, bool musttail_p) { tree statement = error_mark_node; cp_token *token; @@ -14869,7 +14887,7 @@ cp_parser_jump_statement (cp_parser* parser) else if (FNDECL_USED_AUTO (current_function_decl) && in_discarded_stmt) /* Don't deduce from a discarded return statement. */; else - statement = finish_return_stmt (expr); + statement = finish_return_stmt (expr, musttail_p); /* Look for the final `;'. */ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); } diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 3299e2704465..a277f70ea0fd 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -1324,16 +1324,16 @@ finish_do_stmt (tree cond, tree do_stmt, bool ivdep, tree unroll, } /* Finish a return-statement. The EXPRESSION returned, if any, is as - indicated. */ + indicated. MUSTTAIL_P indicates a mustcall attribute. */ tree -finish_return_stmt (tree expr) +finish_return_stmt (tree expr, bool musttail_p) { tree r; bool no_warning; bool dangling; - expr = check_return_expr (expr, &no_warning, &dangling); + expr = check_return_expr (expr, &no_warning, &dangling, musttail_p); if (error_operand_p (expr) || (flag_openmp && !check_omp_return ())) diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index a15eda3f5f8c..8c116e3b4f4c 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -11028,10 +11028,12 @@ maybe_warn_pessimizing_move (tree expr, tree type, bool return_p) the DECL_RESULT for the function. Set *NO_WARNING to true if code reaches end of non-void function warning shouldn't be issued on this RETURN_EXPR. Set *DANGLING to true if code returns the - address of a local variable. */ + address of a local variable. MUSTTAIL_P indicates a musttail + return. */ tree -check_return_expr (tree retval, bool *no_warning, bool *dangling) +check_return_expr (tree retval, bool *no_warning, bool *dangling, + bool musttail_p) { tree result; /* The type actually returned by the function. */ @@ -11045,6 +11047,20 @@ check_return_expr (tree retval, bool *no_warning, bool *dangling) *no_warning = false; *dangling = false; + if (musttail_p) + { + if (TREE_CODE (retval) == TARGET_EXPR + && TREE_CODE (TARGET_EXPR_INITIAL (retval)) == CALL_EXPR) + CALL_EXPR_MUST_TAIL_CALL (TARGET_EXPR_INITIAL (retval)) = 1; + else if (TREE_CODE (retval) != CALL_EXPR) + { + error_at (loc, "cannot tail-call: return value must be a call"); + return error_mark_node; + } + else + CALL_EXPR_MUST_TAIL_CALL (retval) = 1; + } + /* A `volatile' function is one that isn't supposed to return, ever. (This is a G++ extension, used to get better code for functions that call the `volatile' function.) */ From patchwork Wed Jan 24 11:07:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 1890190 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=CZUAxuyu; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TKh6Q2XS3z23dq for ; Wed, 24 Jan 2024 22:09:02 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 520B63858401 for ; Wed, 24 Jan 2024 11:09:00 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 49A8F3857B92 for ; Wed, 24 Jan 2024 11:08:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 49A8F3857B92 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 49A8F3857B92 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; cv=none; b=dsJoaaTBPbD3icVyGh9+y7t/1breUU+wrTEqx/vvaiWt2/c+/tCX2fuA2cevxvc7EnaCI5Z03E5NdS4bj7USfB8zP5JyTcTaz7Y40vgxwVsofWpZG5tVLmg4f4Dj+wH39TVezErtRXQi6tPkyqiM5fnmyoZwgtx9Me8oFV0zIuM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; c=relaxed/simple; bh=IKoysltldrXLzV8qnDPU7mZX9uLCGg07vL+asiw6+Lo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=ICeIlsfTkgKIBhjv09v6dryO8XV9C8FkHeKAfxsQ2udApcQL5QtLFf83gG0ra+8uMdP+nAeJj1xy4LZCBHaSGm1tTXVtJXPCb55vbR7YOtCaW+gsrkp1xwdsCfOfk9JNHFa2eGxc8/gJ2ykaA220AVOQgjkGduLVLwc7dRuYSnQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7J-0004qb-DT for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094505; x=1737630505; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IKoysltldrXLzV8qnDPU7mZX9uLCGg07vL+asiw6+Lo=; b=CZUAxuyuF2Zbo/HtASWJ5J1FuUehpdJeHjUxGWmgTCBokGYrQmpvd0YT T+x3J98AVzSZ/glPymHYNo0BaQfo/q+j/v3UnGDXFNchx0YPJq9Rk7TD7 vQz6z7FFCDTUhGz/xQ5tkPPtkl/D0xMDw+xSFgB6onimeEtaXao30+gNr Pbzuges2IxkvhryOsT9BdNyM7N8dGsAya8oe8CqjEoY/HnsSbgEoNCWSI HYoGmN+PDGpi5MSfAIt7FAS5a86TyVHLSfAIdhS/k42k3lRqAAptrEp9z POdrMysICh+PSQCT0ev65baSRwHf0G6sO7kGK2Hgvoks78t54vNydDpQ4 g==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969570" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969570" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472955" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472955" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 3/4] Add tests for C++ musttail attribute Date: Wed, 24 Jan 2024 03:07:59 -0800 Message-ID: <20240124110800.3154093-3-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Mostly adopted from the existing C musttail plugin tests. --- gcc/testsuite/g++.dg/musttail1.C | 15 ++++++++++++ gcc/testsuite/g++.dg/musttail2.C | 35 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/musttail3.C | 42 ++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/musttail4.C | 19 +++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 gcc/testsuite/g++.dg/musttail1.C create mode 100644 gcc/testsuite/g++.dg/musttail2.C create mode 100644 gcc/testsuite/g++.dg/musttail3.C create mode 100644 gcc/testsuite/g++.dg/musttail4.C diff --git a/gcc/testsuite/g++.dg/musttail1.C b/gcc/testsuite/g++.dg/musttail1.C new file mode 100644 index 000000000000..c9276e0ae86a --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail1.C @@ -0,0 +1,15 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11 -O2" } */ +/* { dg-options "-fdelayed-branch" { target sparc*-*-* } } */ + +int __attribute__((noinline,noclone)) +callee (int i) +{ + return i * i; +} + +int __attribute__((noinline,noclone)) +caller (int i) +{ + [[gnu::musttail]] return callee (i + 1); +} diff --git a/gcc/testsuite/g++.dg/musttail2.C b/gcc/testsuite/g++.dg/musttail2.C new file mode 100644 index 000000000000..d9151d25f517 --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail2.C @@ -0,0 +1,35 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11" } */ + +struct box { char field[256]; int i; }; + +int __attribute__((noinline,noclone)) +test_2_callee (int i, struct box b) +{ + if (b.field[0]) + return 5; + return i * i; +} + +int __attribute__((noinline,noclone)) +test_2_caller (int i) +{ + struct box b; + [[gnu::musttail]] return test_2_callee (i + 1, b); /* { dg-error "cannot tail-call: " } */ +} + +extern void setjmp (void); +void +test_3 (void) +{ + [[gnu::musttail]] return setjmp (); /* { dg-error "cannot tail-call: " } */ +} + +typedef void (fn_ptr_t) (void); +volatile fn_ptr_t fn_ptr; + +void +test_5 (void) +{ + [[gnu::musttail]] return fn_ptr (); /* { dg-error "cannot tail-call: " } */ +} diff --git a/gcc/testsuite/g++.dg/musttail3.C b/gcc/testsuite/g++.dg/musttail3.C new file mode 100644 index 000000000000..7d55f44124ee --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail3.C @@ -0,0 +1,42 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11" } */ + +extern int foo2 (int x, ...); + +struct str +{ + int a, b; +}; + +str +cstruct (int x) +{ + if (x < 10) + [[clang::musttail]] return cstruct (x + 1); + return { x, 0 }; +} + +int +cstruct2 (int x, str & ref) +{ + if (x < 10) + { + str r = { }; + [[clang::musttail]] return cstruct2 (x + 1, r); + } + return x + 1; +} + + +int +foo (int x) +{ + if (x < 10) + [[clang::musttail]] return foo2 (x, 29); + if (x < 100) + { + int k = foo (x + 1); + [[clang::musttail]] return k; /* { dg-error "cannot tail-call: " } */ + } + return x; +} diff --git a/gcc/testsuite/g++.dg/musttail4.C b/gcc/testsuite/g++.dg/musttail4.C new file mode 100644 index 000000000000..3122acfb1719 --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail4.C @@ -0,0 +1,19 @@ +/* { dg-do compile { target tail_call } } */ +/* Allow nested functions. */ +/* { dg-options "-Wno-pedantic -std=c++11" } */ + +struct box { char field[64]; int i; }; + +struct box __attribute__((noinline,noclone)) +returns_struct (int i) +{ + struct box b; + b.i = i * i; + return b; +} + +int __attribute__((noinline,noclone)) +test_1 (int i) +{ + [[gnu::musttail]] return returns_struct (i * 5).i; /* { dg-error "return value must be a call" } */ +} From patchwork Wed Jan 24 11:08:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 1890192 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=lmyh2+eb; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TKh7w0vsvz23dy for ; Wed, 24 Jan 2024 22:10:20 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1D38C385E828 for ; Wed, 24 Jan 2024 11:10:18 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 05797385E007 for ; Wed, 24 Jan 2024 11:08:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 05797385E007 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 05797385E007 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094511; cv=none; b=fpTIyhD4tkJ0zaBZU3AHEFmKHRE5+9KdmkaiYmtWA6jC9RaAS4/23s1zze7SgQKmx1cml0zIBDG3zXzT2+1aMjjfG6AV0ms5VHZJkP/AAbFzvQJC+ystSlCcUDyrpEAzGTgl+sETyIKnGm4IG7+jemqq/cAJCS92Iz+g/dgkvcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094511; c=relaxed/simple; bh=MLqYq3AHvAzhGbe+d5uSAffcZ9g2fRAzAg2AJWkZCHM=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=c+IJoA3TlhyNCDWnryAHGQoKtOyAY3CutkYoLxu0olYU4O7TjxW1Be9zkFDnWQVdf4JU4vR2uZsCxJ8trKzpR2RjVRjuqc2GwyURMmT2TVN2WtZmCg+2svIgHtthjZjfxeZOdizLRe8sYs18NHHrZiyyd4rSlh+BRbkF+6d+UIE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7L-0004qb-Kc for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094507; x=1737630507; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MLqYq3AHvAzhGbe+d5uSAffcZ9g2fRAzAg2AJWkZCHM=; b=lmyh2+ebkQDsyr7hAiPZpTPmD8W7W99ge8V5PYMKzdZUA49r3Gl/Ov6l 7j6v1fEQLdsKl/J3Ij6OoA8+sbnknE0FGnWRcXr7sxS1l+aHFBA0VBP61 10lnkkc8S6rd/Kc1aXq0HNVfTJVIP/MKxXPhs6F6Ox+T1ncNaNmDNYY+j hMEV6vZvAoeNtxZ/0xILvgp4jaZpnQmCbjbhgRGDtjt94GRUKMWAlP2VM VgRn2TeGepQBYLHhpGfefouIdTBBZj62XPEp8/edb+vdzwKxDcmnuoa5X 6/HabDLri6SW7e9uNxJ4iZ8L0ORLZMXHK1zh1tgtCaNWtoHqsUJvml6nb w==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969571" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969571" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472956" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472956" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 4/4] Add documentation for musttail attribute Date: Wed, 24 Jan 2024 03:08:00 -0800 Message-ID: <20240124110800.3154093-4-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org --- gcc/doc/extend.texi | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 0bc586d120e7..444b68f5d071 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -27890,7 +27890,8 @@ Predefined Macros,cpp,The GNU C Preprocessor}). each needed template instantiation is emitted. * Bound member functions:: You can extract a function pointer to the method denoted by a @samp{->*} or @samp{.*} expression. -* C++ Attributes:: Variable, function, and type attributes for C++ only. +* C++ Attributes:: Variable, function, statement, and type attributes + for C++ only. * Function Multiversioning:: Declaring multiple function versions. * Type Traits:: Compiler support for type traits. * C++ Concepts:: Improved support for generic programming. @@ -28458,6 +28459,22 @@ precedence and the @code{hot} attribute is not propagated. For the effects of the @code{hot} attribute on functions, see @ref{Common Function Attributes}. +@cindex @code{musttail} statement attribute +@item musttail + +The @code{gnu::musttail} or @code{clang::hottail} attribute +can be applied to a return statement that returns the value +of a call to indicate that the call must be a tail call +that does not allocate extra stack space. + +@smallexample +[[gnu::musttail]] return foo(); +@end smallexample + +If the compiler cannot generate a tail call it will generate +an error. Tail calls generally require enabling optimization. +On some targets they may not be supported. + @end table @node Function Multiversioning