From patchwork Thu Oct 25 22:59:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Ploujnikov X-Patchwork-Id: 989400 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-488337-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="LYPi1zEc"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=oracle.com header.i=@oracle.com header.b="3w66EsCp"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42h2dc39zDz9sCr for ; Fri, 26 Oct 2018 10:00:02 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:from:to:cc:references:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=IpCADjEE9/KHXggf7 DdnckZubcO4kFP9LjBiATTFdL1sVmIDavtIDiP0VRTTECgR+avTy0l2hlEb/WoaK 3dNPsycibmVtzkcxYOTKu9vrsFv1ICdJLKq4+p0PWqpo/BVRWgcMPt+Tei14asNz m3TVhCf+FVuem9Dwg0TqqpcEwk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:from:to:cc:references:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=jvkzASuCGReFAHZYKjuvQZ8 aAzg=; b=LYPi1zEcIGZHxvA+2cRUQ0w4ab1wlRepsZ6+T2PKIlEulw4/UP2hKrl 0+5g7Cbmq1W+eh4/Ie19GS+GGmVC7tu6mutghDG48k5/PDyf6V97pgLpkWkDsjvh Lhlr0OSQtiwAufRJwHkXKc21EsToBLQASbEYts77rWbTTyUNUAOI= Received: (qmail 121261 invoked by alias); 25 Oct 2018 22:59:54 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 121234 invoked by uid 89); 25 Oct 2018 22:59:53 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=D*oracle.com, sk:IDENTIF, sk:identif, sk:scan_sh X-HELO: aserp2120.oracle.com Received: from aserp2120.oracle.com (HELO aserp2120.oracle.com) (141.146.126.78) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 25 Oct 2018 22:59:50 +0000 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w9PMwc6X019087; Thu, 25 Oct 2018 22:59:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : references : message-id : date : mime-version : in-reply-to : content-type; s=corp-2018-07-02; bh=yzm3FKVi9hgIo8BRmZavJNsRbhjY6PtAaI8MgVgKLjo=; b=3w66EsCpNwdvSFt27rkjBlH9tIFEWPgwkUFlO5XPvdH88TCCM/3vIJGYdplluuOnxYvB x9KGYsVdx7vewl7YS5sftn7YAuDCIsi2rJoHJAiuWCU5OIIcJNl23blVZMM4gktfU2rG CAZo7MpSsugRw6tIbB1naU5BNKftS8lBM5iHCBeHx/AWVq9FoGxd3YkSGt8cMcp4STHk wRovacsSAxNIy4jSMO7kha0OxeCHXu4c07MLLLKkMb9h+aI9KuhW7Aa7siVwDtr6hGxP VrhKzS+vk2RhADfneXlO+69P7lz//EIk8OoDgDt1kc68sr1YCCs+7rADYb8mEyHQvXMk Hw== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp2120.oracle.com with ESMTP id 2n7vaqcakn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Oct 2018 22:59:44 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w9PMxgh8005486 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Oct 2018 22:59:42 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id w9PMxdEx014181; Thu, 25 Oct 2018 22:59:41 GMT Received: from [10.39.236.84] (/10.39.236.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Oct 2018 15:59:39 -0700 Subject: [PATCH v4] Avoid unnecessarily numbering cloned symbols. From: Michael Ploujnikov To: Bernhard Reutner-Fischer , gcc-patches@gcc.gnu.org Cc: Sriraman Tallam , mliska@suse.cz, ebotcazou@adacore.com References: <8d03bc9c-cd65-3774-86d0-7deb625b5748@oracle.com> <05586c98-6841-7fcd-00e8-1b75dc2f8123@oracle.com> <74afe24e-b65e-d26d-b626-cd4231f177e0@oracle.com> <9a7e062e-016e-451d-7c3d-5a4abaad3b43@oracle.com> Openpgp: preference=signencrypt Message-ID: <96a4d366-ad82-3e1d-4baa-3fee2e6d741f@oracle.com> Date: Thu, 25 Oct 2018 18:59:37 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <9a7e062e-016e-451d-7c3d-5a4abaad3b43@oracle.com> X-IsSubscribed: yes I've taken the advice from a discussion on IRC and re-wrote the patch with more uniform function names and using overloading. I think this function accomplished the following goals: - remove clone numbering where it's not needed: final.c:final_scan_insn_1 and symtab.c:simd_symtab_node::noninterposable_alias. - name and document the clone naming API such that future users won't accidentally use the numbering when it's not necessary; if you need numbering then you need to explicitly ask for it with the right function - provide a new function that allows users to specify a clone number explicitly as an argument My thoughts for future improvements: - It's a bit unfortunate that lto-partition.c:privatize_symbol_name_1 has to break the decl abstraction and pass in a string that it created into what I would consider the implementation-detail function. The best way I can think of to make it uniform with the rest of the users is to have it create a new empty decl with DECL_ASSEMBLER_NAME set to the new string - It's unfortunate that I have to duplicate the separator concatenation in the numberless clone_function_name, but I think it has to be like that unless ASM_FORMAT_PRIVATE_NAME making the number optional. From 0df79d0ac6a9891b344f988c7157a54cebbc1cb8 Mon Sep 17 00:00:00 2001 From: Michael Ploujnikov Date: Thu, 25 Oct 2018 13:16:36 -0400 Subject: [PATCH] Avoid unnecessarily numbering cloned symbols. gcc/ChangeLog: 2018-10-25 Michael Ploujnikov * cgraph.h (clone_function_name_1): Replaced by new clone_function_name_numbered that takes name as string; for privatize_symbol_name_1 use only. (clone_function_name): Renamed to clone_function_name_numbered to be explicit about numbering. (clone_function_name): New two-argument function that does not number its output. (clone_function_name): New three-argument function that takes a number to append to its output. * cgraphclones.c (duplicate_thunk_for_node): (clone_function_name_1): Renamed. (clone_function_name_numbered): Two new functions. (clone_function_name): Improved documentation. (cgraph_node::create_virtual_clone): Use clone_function_name_numbered. * config/rs6000/rs6000.c (make_resolver_func): Ditto. * final.c (final_scan_insn_1): Use the new clone_function_name without numbering. * multiple_target.c (create_dispatcher_calls): Ditto. (create_target_clone): Ditto. * omp-expand.c (grid_expand_target_grid_body): Ditto. * omp-low.c (create_omp_child_function_name): Ditto. * omp-simd-clone.c (simd_clone_create): Ditto. * symtab.c (simd_symtab_node::noninterposable_alias): Use the new clone_function_name without numbering. gcc/lto/ChangeLog: 2018-10-25 Michael Ploujnikov * lto-partition.c (privatize_symbol_name_1): Use clone_function_name_numbered. gcc/testsuite/ChangeLog: 2018-10-25 Michael Ploujnikov * gcc.dg/tree-prof/cold_partition_label.c: Update for cold section names without numbers. * gcc.dg/tree-prof/section-attr-1.c: Ditto. * gcc.dg/tree-prof/section-attr-2.c: Ditto. * gcc.dg/tree-prof/section-attr-3.c: Ditto. --- gcc/cgraph.h | 7 ++- gcc/cgraphclones.c | 66 ++++++++++++++++++---- gcc/config/rs6000/rs6000.c | 2 +- gcc/lto/lto-partition.c | 4 +- gcc/multiple_target.c | 8 +-- gcc/omp-expand.c | 3 +- gcc/omp-low.c | 4 +- gcc/omp-simd-clone.c | 3 +- .../gcc.dg/tree-prof/cold_partition_label.c | 4 +- gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c | 2 +- gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c | 2 +- gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c | 2 +- 12 files changed, 79 insertions(+), 28 deletions(-) diff --git gcc/cgraph.h gcc/cgraph.h index a8b1b4c..971065d 100644 --- gcc/cgraph.h +++ gcc/cgraph.h @@ -2368,8 +2368,11 @@ basic_block init_lowered_empty_function (tree, bool, profile_count); tree thunk_adjust (gimple_stmt_iterator *, tree, bool, HOST_WIDE_INT, tree); /* In cgraphclones.c */ -tree clone_function_name_1 (const char *, const char *); -tree clone_function_name (tree decl, const char *); +tree clone_function_name_numbered (const char *name, const char *suffix); +tree clone_function_name_numbered (tree decl, const char *suffix); +tree clone_function_name (const char *name, const char *suffix, + unsigned long number); +tree clone_function_name (tree decl, const char *suffix); void tree_function_versioning (tree, tree, vec *, bool, bitmap, bool, bitmap, basic_block); diff --git gcc/cgraphclones.c gcc/cgraphclones.c index 6e84a31..0e496d9 100644 --- gcc/cgraphclones.c +++ gcc/cgraphclones.c @@ -316,7 +316,8 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node) gcc_checking_assert (!DECL_RESULT (new_decl)); gcc_checking_assert (!DECL_RTL_SET_P (new_decl)); - DECL_NAME (new_decl) = clone_function_name (thunk->decl, "artificial_thunk"); + DECL_NAME (new_decl) = clone_function_name_numbered (thunk->decl, + "artificial_thunk"); SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl)); new_thunk = cgraph_node::create (new_decl); @@ -514,11 +515,38 @@ cgraph_node::create_clone (tree new_decl, profile_count prof_count, static GTY(()) unsigned int clone_fn_id_num; -/* Return a new assembler name for a clone with SUFFIX of a decl named - NAME. */ +/* Return a new assembler name for a clone of decl named NAME. Apart + from the string SUFFIX, the new name will end with a unique (for + each NAME) unspecified number. If clone numbering is not needed + then the two argument clone_function_name should be used instead. + Should not be called directly except for by + lto-partition.c:privatize_symbol_name_1. */ +tree +clone_function_name_numbered (const char *name, const char *suffix) +{ + return clone_function_name (name, suffix, clone_fn_id_num++); +} +/* Return a new assembler name for a clone of DECL. Apart from string + SUFFIX, the new name will end with a unique (for each DECL + assembler name) unspecified number. If clone numbering is not + needed then the two argument clone_function_name should be used + instead. */ tree -clone_function_name_1 (const char *name, const char *suffix) +clone_function_name_numbered (tree decl, const char *suffix) +{ + tree name = DECL_ASSEMBLER_NAME (decl); + return clone_function_name_numbered (IDENTIFIER_POINTER (name), + suffix); +} + +/* Return a new assembler name for a clone of decl named NAME. Apart + from the string SUFFIX, the new name will end with the specified + number. If clone numbering is not needed then the two argument + clone_function_name should be used instead. */ +tree +clone_function_name (const char *name, const char *suffix, + unsigned long number) { size_t len = strlen (name); char *tmp_name, *prefix; @@ -527,17 +555,34 @@ clone_function_name_1 (const char *name, const char *suffix) memcpy (prefix, name, len); strcpy (prefix + len + 1, suffix); prefix[len] = symbol_table::symbol_suffix_separator (); - ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++); + ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, number); return get_identifier (tmp_name); } -/* Return a new assembler name for a clone of DECL with SUFFIX. */ +/* Return a new assembler name ending with the string SUFFIX for a + clone of DECL. */ tree clone_function_name (tree decl, const char *suffix) { - tree name = DECL_ASSEMBLER_NAME (decl); - return clone_function_name_1 (IDENTIFIER_POINTER (name), suffix); + tree identifier = DECL_ASSEMBLER_NAME (decl); + /* For consistency this needs to behave the same way as + ASM_FORMAT_PRIVATE_NAME does, but without the final number + suffix. */ + char *separator = XALLOCAVEC (char, 2); + separator[0] = symbol_table::symbol_suffix_separator (); + separator[1] = 0; +#if defined (NO_DOT_IN_LABEL) && defined (NO_DOLLAR_IN_LABEL) + const char *prefix = "__"; +#else + const char *prefix = ""; +#endif + char *result = ACONCAT ((prefix, + IDENTIFIER_POINTER (identifier), + separator, + suffix, + (char*)0)); + return get_identifier (result); } @@ -585,7 +630,8 @@ cgraph_node::create_virtual_clone (vec redirect_callers, strcpy (name + len + 1, suffix); name[len] = '.'; DECL_NAME (new_decl) = get_identifier (name); - SET_DECL_ASSEMBLER_NAME (new_decl, clone_function_name (old_decl, suffix)); + SET_DECL_ASSEMBLER_NAME (new_decl, clone_function_name_numbered (old_decl, + suffix)); SET_DECL_RTL (new_decl, NULL); new_node = create_clone (new_decl, count, false, @@ -964,7 +1010,7 @@ cgraph_node::create_version_clone_with_body = build_function_decl_skip_args (old_decl, args_to_skip, skip_return); /* Generate a new name for the new version. */ - DECL_NAME (new_decl) = clone_function_name (old_decl, suffix); + DECL_NAME (new_decl) = clone_function_name_numbered (old_decl, suffix); SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl)); SET_DECL_RTL (new_decl, NULL); diff --git gcc/config/rs6000/rs6000.c gcc/config/rs6000/rs6000.c index c2af4b8..c314739 100644 --- gcc/config/rs6000/rs6000.c +++ gcc/config/rs6000/rs6000.c @@ -36512,7 +36512,7 @@ make_resolver_func (const tree default_decl, { /* Make the resolver function static. The resolver function returns void *. */ - tree decl_name = clone_function_name (default_decl, "resolver"); + tree decl_name = clone_function_name_numbered (default_decl, "resolver"); const char *resolver_name = IDENTIFIER_POINTER (decl_name); tree type = build_function_type_list (ptr_type_node, NULL_TREE); tree decl = build_fn_decl (resolver_name, type); diff --git gcc/lto/lto-partition.c gcc/lto/lto-partition.c index c7a5710..24e7c23 100644 --- gcc/lto/lto-partition.c +++ gcc/lto/lto-partition.c @@ -964,8 +964,8 @@ privatize_symbol_name_1 (symtab_node *node, tree decl) name = maybe_rewrite_identifier (name); symtab->change_decl_assembler_name (decl, - clone_function_name_1 (name, - "lto_priv")); + clone_function_name_numbered ( + name, "lto_priv")); if (node->lto_file_data) lto_record_renamed_decl (node->lto_file_data, name, diff --git gcc/multiple_target.c gcc/multiple_target.c index a1fe09a..9bbfeee 100644 --- gcc/multiple_target.c +++ gcc/multiple_target.c @@ -162,8 +162,8 @@ create_dispatcher_calls (struct cgraph_node *node) } symtab->change_decl_assembler_name (node->decl, - clone_function_name (node->decl, - "default")); + clone_function_name_numbered ( + node->decl, "default")); /* FIXME: copy of cgraph_node::make_local that should be cleaned up in next stage1. */ @@ -312,8 +312,8 @@ create_target_clone (cgraph_node *node, bool definition, char *name) new_node = cgraph_node::get_create (new_decl); /* Generate a new name for the new version. */ symtab->change_decl_assembler_name (new_node->decl, - clone_function_name (node->decl, - name)); + clone_function_name_numbered ( + node->decl, name)); } return new_node; } diff --git gcc/omp-expand.c gcc/omp-expand.c index d2a77c0..faff02b 100644 --- gcc/omp-expand.c +++ gcc/omp-expand.c @@ -7625,7 +7625,8 @@ grid_expand_target_grid_body (struct omp_region *target) expand_omp (gpukernel->inner); tree kern_fndecl = copy_node (orig_child_fndecl); - DECL_NAME (kern_fndecl) = clone_function_name (kern_fndecl, "kernel"); + DECL_NAME (kern_fndecl) = clone_function_name_numbered (kern_fndecl, + "kernel"); SET_DECL_ASSEMBLER_NAME (kern_fndecl, DECL_NAME (kern_fndecl)); tree tgtblock = gimple_block (tgt_stmt); tree fniniblock = make_node (BLOCK); diff --git gcc/omp-low.c gcc/omp-low.c index 843c66f..29539b3 100644 --- gcc/omp-low.c +++ gcc/omp-low.c @@ -1531,8 +1531,8 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) static tree create_omp_child_function_name (bool task_copy) { - return clone_function_name (current_function_decl, - task_copy ? "_omp_cpyfn" : "_omp_fn"); + return clone_function_name_numbered (current_function_decl, + task_copy ? "_omp_cpyfn" : "_omp_fn"); } /* Return true if CTX may belong to offloaded code: either if current function diff --git gcc/omp-simd-clone.c gcc/omp-simd-clone.c index b15adf0..7bafe39 100644 --- gcc/omp-simd-clone.c +++ gcc/omp-simd-clone.c @@ -444,7 +444,8 @@ simd_clone_create (struct cgraph_node *old_node) { tree old_decl = old_node->decl; tree new_decl = copy_node (old_node->decl); - DECL_NAME (new_decl) = clone_function_name (old_decl, "simdclone"); + DECL_NAME (new_decl) = clone_function_name_numbered (old_decl, + "simdclone"); SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl)); SET_DECL_RTL (new_decl, NULL); DECL_STATIC_CONSTRUCTOR (new_decl) = 0; diff --git gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c index 52518cf..450308d 100644 --- gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c +++ gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c @@ -37,6 +37,6 @@ main (int argc, char *argv[]) return 0; } -/* { dg-final-use { scan-assembler "foo\[._\]+cold\[\._\]+0" { target *-*-linux* *-*-gnu* } } } */ -/* { dg-final-use { scan-assembler "size\[ \ta-zA-Z0-0\]+foo\[._\]+cold\[\._\]+0" { target *-*-linux* *-*-gnu* } } } */ +/* { dg-final-use { scan-assembler "foo\[._\]+cold" { target *-*-linux* *-*-gnu* } } } */ +/* { dg-final-use { scan-assembler "size\[ \ta-zA-Z0-0\]+foo\[._\]+cold" { target *-*-linux* *-*-gnu* } } } */ /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ diff --git gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c index ee6662e..1bb8cd9 100644 --- gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c +++ gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c @@ -42,4 +42,4 @@ foo (int path) } } -/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */ +/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold" { target *-*-linux* *-*-gnu* } } } */ diff --git gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c index 898a395..31be7eb 100644 --- gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c +++ gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c @@ -41,4 +41,4 @@ foo (int path) } } -/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */ +/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold" { target *-*-linux* *-*-gnu* } } } */ diff --git gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c index 36829dc..0e64001 100644 --- gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c +++ gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c @@ -42,4 +42,4 @@ foo (int path) } } -/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */ +/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold" { target *-*-linux* *-*-gnu* } } } */ -- 2.7.4