From patchwork Tue Jun 7 19:01:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 1640068 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=sMSmLqC8; 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 (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LHfq02HqKz9sFx for ; Wed, 8 Jun 2022 05:01:46 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B054A38582B8 for ; Tue, 7 Jun 2022 19:01:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B054A38582B8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1654628504; bh=tD9+cuqTtKFCireQ/3PlRNzmXzbgCO5kE9o/4rBmlmA=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=sMSmLqC8fLn4Tm4469P3AUBYYkEFrdvrwNRnGNvgb6PXrazXslqxffNqgqdcUbuQH P1hGQCcCRqE/RQPHkig5sieoTyvkIBnoFUB8btz4Yyq0YnKdHTvSZK+rIepb2BN67C vdKQeZFBk3KnsEaRZXo7BihZQurcC2lhlu4SZuA8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by sourceware.org (Postfix) with ESMTPS id 05B533836666 for ; Tue, 7 Jun 2022 19:01:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 05B533836666 Received: by mail-pg1-x529.google.com with SMTP id 129so16744750pgc.2 for ; Tue, 07 Jun 2022 12:01:13 -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:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=tD9+cuqTtKFCireQ/3PlRNzmXzbgCO5kE9o/4rBmlmA=; b=r67vBQse4HBRdBDulEM//77uGtaoHGzUKTAEYesWgmgybSWg9S9X6vaU0AWHFoPv+d hLsN2uJHw69g0kg2w9iot2Cs2v8oFlNE9c8PIQOykkM6MwcjvtUvR2VdS7NiMhVRkcDS vV2w8wjltxlia+ousZ/uphADeFVXHyotKAE9cEAIbDK2OnUzUl6oEm+u2/caVunP6+3r 0e2lw9GAuqPap6LF6noNeTVAaNdbkBVW7IE059Y8PIFWHiDkPncr0iCyvY310LL1ajCK NnfkkEbkMyfhvBe6y4VAG5rw9S5WLDvt1Rs4IpRm6kxaspwQaRxNOFp9CVZU+OTjmnBs hu8A== X-Gm-Message-State: AOAM5316s7zOAo1aMO+oIz5XOSA+JX36sTZeNJkEcFKn4n8Zu7gTGpDK EEFn03WH8gkNOnIZVsY3qvurQsO59bk= X-Google-Smtp-Source: ABdhPJxTdiJWtzNWBtaxNV70vTzNYgfVpu+AytpEFWjnUzdEF2c6hKTUSsSwAO9um1P0my3kY8ufvw== X-Received: by 2002:a63:4853:0:b0:3fa:dc6:7ac2 with SMTP id x19-20020a634853000000b003fa0dc67ac2mr26918715pgk.298.1654628472537; Tue, 07 Jun 2022 12:01:12 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.88.122]) by smtp.gmail.com with ESMTPSA id w10-20020aa7858a000000b0051bce5dc754sm11005893pfn.194.2022.06.07.12.01.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jun 2022 12:01:12 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id BE86CC0108; Tue, 7 Jun 2022 12:01:10 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH] Add -fextra-libc-function=memcmpeq for __memcmpeq Date: Tue, 7 Jun 2022 12:01:10 -0700 Message-Id: <20220607190110.1126556-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 X-Spam-Status: No, score=-3028.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Gcc-patches" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Add -fextra-libc-function=memcmpeq to map extern int __memcmpeq (const void *, const void *, size_t); which was added to GLIBC 2.35, to __builtin_memcmp_eq. gcc/ * builtins.cc: Include "opts.h". (expand_builtin): Generate BUILT_IN_MEMCMP_EQ if __memcmpeq is available. * builtins.def (BUILT_IN___MEMCMPEQ): New. * common.opt: Add -fextra-libc-function=. * opts.cc (extra_libc_functions): New. (parse_extra_libc_function): New function. (common_handle_option): Handle -fextra-libc-function=. * opts.h (extra_libc_function_list): New. (extra_libc_functions): Likewise. * doc/invoke.texi: Document -fextra-libc-function=memcmpeq. gcc/testsuite/ * c-c++-common/memcmpeq-1.c: New test. * c-c++-common/memcmpeq-2.c: Likewise. * c-c++-common/memcmpeq-3.c: Likewise. * c-c++-common/memcmpeq-4.c: Likewise. * c-c++-common/memcmpeq-5.c: Likewise. * c-c++-common/memcmpeq-6.c: Likewise. * c-c++-common/memcmpeq-7.c: Likewise. --- gcc/builtins.cc | 5 ++++- gcc/builtins.def | 4 ++++ gcc/common.opt | 4 ++++ gcc/doc/invoke.texi | 6 ++++++ gcc/opts.cc | 23 +++++++++++++++++++++++ gcc/opts.h | 7 +++++++ gcc/testsuite/c-c++-common/memcmpeq-1.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-2.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-3.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-4.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-5.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-6.c | 11 +++++++++++ gcc/testsuite/c-c++-common/memcmpeq-7.c | 11 +++++++++++ 13 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-1.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-2.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-3.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-4.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-5.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-6.c create mode 100644 gcc/testsuite/c-c++-common/memcmpeq-7.c diff --git a/gcc/builtins.cc b/gcc/builtins.cc index b9d89b409b8..22269318e8c 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -81,6 +81,7 @@ along with GCC; see the file COPYING3. If not see #include "demangle.h" #include "gimple-range.h" #include "pointer-query.h" +#include "opts.h" struct target_builtins default_target_builtins; #if SWITCHABLE_TARGET @@ -7410,7 +7411,9 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode, return target; if (fcode == BUILT_IN_MEMCMP_EQ) { - tree newdecl = builtin_decl_explicit (BUILT_IN_MEMCMP); + tree newdecl = builtin_decl_explicit + (extra_libc_functions.has_memcmpeq + ? BUILT_IN___MEMCMPEQ : BUILT_IN_MEMCMP); TREE_OPERAND (exp, 1) = build_fold_addr_expr (newdecl); } break; diff --git a/gcc/builtins.def b/gcc/builtins.def index 005976f34e9..eb8d33b16e9 100644 --- a/gcc/builtins.def +++ b/gcc/builtins.def @@ -965,6 +965,10 @@ DEF_BUILTIN_STUB (BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX, "__builtin_alloca_with_ali equality with zero. */ DEF_BUILTIN_STUB (BUILT_IN_MEMCMP_EQ, "__builtin_memcmp_eq") +/* Similar to BUILT_IN_MEMCMP_EQ, but is mapped to __memcmpeq only with + -fextra-libc-function=memcmpeq. */ +DEF_EXT_LIB_BUILTIN (BUILT_IN___MEMCMPEQ, "__memcmpeq", BT_FN_INT_CONST_PTR_CONST_PTR_SIZE, ATTR_PURE_NOTHROW_NONNULL_LEAF) + /* An internal version of strcmp/strncmp, used when the result is only tested for equality with zero. */ DEF_BUILTIN_STUB (BUILT_IN_STRCMP_EQ, "__builtin_strcmp_eq") diff --git a/gcc/common.opt b/gcc/common.opt index 7ca0cceed82..7a7631682b0 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1587,6 +1587,10 @@ Enum(excess_precision) String(standard) Value(EXCESS_PRECISION_STANDARD) EnumValue Enum(excess_precision) String(16) Value(EXCESS_PRECISION_FLOAT16) +fextra-libc-function= +Common Driver Joined +Specify the extra function in the C library. + ; Whether we permit the extended set of values for FLT_EVAL_METHOD ; introduced in ISO/IEC TS 18661-3, or limit ourselves to those in C99/C11. fpermitted-flt-eval-methods= diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8cd5bdddc5d..fe1e3709953 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -676,6 +676,7 @@ Objective-C and Objective-C++ Dialects}. -ffixed-@var{reg} -fexceptions @gol -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol -fasynchronous-unwind-tables @gol +-fextra-libc-function=memcmpeq @gol -fno-gnu-unique @gol -finhibit-size-directive -fcommon -fno-ident @gol -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol @@ -17250,6 +17251,11 @@ Generate unwind table in DWARF format, if supported by target machine. The table is exact at each instruction boundary, so it can be used for stack unwinding from asynchronous events (such as debugger or garbage collector). +@item -fextra-libc-function=memcmpeq +@opindex fextra-libc-function +Generate @code{__memcmpeq}, which was added to GLIBC 2.35, for +@code{__builtin_memcmp_eq}. + @item -fno-gnu-unique @opindex fno-gnu-unique @opindex fgnu-unique diff --git a/gcc/opts.cc b/gcc/opts.cc index bf06a55456a..e77f0922acc 100644 --- a/gcc/opts.cc +++ b/gcc/opts.cc @@ -38,6 +38,9 @@ along with GCC; see the file COPYING3. If not see /* In this file all option sets are explicit. */ #undef OPTION_SET_P +/* The list of extra functions in the C library. */ +extra_libc_function_list extra_libc_functions; + static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff); /* Names of fundamental debug info formats indexed by enum @@ -2269,6 +2272,22 @@ parse_no_sanitize_attribute (char *value) return flags; } +/* Parse -fextra-libc-function= suboptions from ARG. */ + +static void +parse_extra_libc_function (const char *arg) +{ + /* Check to see if the string matches a sub-option name. */ + if (strcmp (arg, "memcmpeq") == 0) + { + extra_libc_functions.has_memcmpeq = 1; + return; + } + + error ("unrecognized argument to %<-fextra-libc-function=%>: %qs", + arg); +} + /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */ unsigned int @@ -2940,6 +2959,10 @@ common_handle_option (struct gcc_options *opts, SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value); break; + case OPT_fextra_libc_function_: + parse_extra_libc_function (arg); + break; + case OPT_fprofile_generate_: opts->x_profile_data_prefix = xstrdup (arg); value = true; diff --git a/gcc/opts.h b/gcc/opts.h index a43ce66cffe..e8d8835ba23 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -345,6 +345,13 @@ struct cl_option_handlers extern const char *opt_fstack_limit_symbol_arg; extern int opt_fstack_limit_register_no; +/* The list of extra functions in the C library. */ +struct extra_libc_function_list +{ + unsigned int has_memcmpeq : 1; +}; +extern extra_libc_function_list extra_libc_functions; + /* Input file names. */ extern const char **in_fnames; diff --git a/gcc/testsuite/c-c++-common/memcmpeq-1.c b/gcc/testsuite/c-c++-common/memcmpeq-1.c new file mode 100644 index 00000000000..487f6cd98db --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-1.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fextra-libc-function=memcmpeq" } */ +/* { dg-final { scan-assembler "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return __builtin_memcmp (s1, s2, len) != 0; +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-2.c b/gcc/testsuite/c-c++-common/memcmpeq-2.c new file mode 100644 index 00000000000..1773dc2bee1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-2.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fextra-libc-function=memcmpeq" } */ +/* { dg-final { scan-assembler "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return memcmp (s1, s2, len) == 0; +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-3.c b/gcc/testsuite/c-c++-common/memcmpeq-3.c new file mode 100644 index 00000000000..69c9537d572 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-3.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fextra-libc-function=memcmpeq" } */ +/* { dg-final { scan-assembler-not "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return memcmp (s1, s2, len); +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-4.c b/gcc/testsuite/c-c++-common/memcmpeq-4.c new file mode 100644 index 00000000000..a448312ea96 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-4.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return __builtin_memcmp (s1, s2, len) != 0; +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-5.c b/gcc/testsuite/c-c++-common/memcmpeq-5.c new file mode 100644 index 00000000000..4ef33a1c238 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-5.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return memcmp (s1, s2, len) == 0; +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-6.c b/gcc/testsuite/c-c++-common/memcmpeq-6.c new file mode 100644 index 00000000000..52304df7079 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-6.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fextra-libc-function=memcmpeq" } */ +/* { dg-final { scan-assembler "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return __builtin_memcmp_eq (s1, s2, len) != 0; +} diff --git a/gcc/testsuite/c-c++-common/memcmpeq-7.c b/gcc/testsuite/c-c++-common/memcmpeq-7.c new file mode 100644 index 00000000000..d59765894e7 --- /dev/null +++ b/gcc/testsuite/c-c++-common/memcmpeq-7.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "__memcmpeq" } } */ + +#include + +int +foo (const char *s1, const char *s2, size_t len) +{ + return __builtin_memcmp_eq (s1, s2, len) != 0; +}