From patchwork Wed Mar 13 18:02:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nick Desaulniers X-Patchwork-Id: 10851613 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 60032139A for ; Wed, 13 Mar 2019 18:02:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 490992998F for ; Wed, 13 Mar 2019 18:02:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D56529CBE; Wed, 13 Mar 2019 18:02:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 299052998F for ; Wed, 13 Mar 2019 18:02:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726835AbfCMSCq (ORCPT ); Wed, 13 Mar 2019 14:02:46 -0400 Received: from mail-io1-f73.google.com ([209.85.166.73]:43461 "EHLO mail-io1-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726446AbfCMSCq (ORCPT ); Wed, 13 Mar 2019 14:02:46 -0400 Received: by mail-io1-f73.google.com with SMTP id n23so2177945ioj.10 for ; Wed, 13 Mar 2019 11:02:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=ir6qodWEKUGzfEu3dnv9XwT0+RGg2i7HMOiUS/XMmXo=; b=Q9n+TJNzKkNb/rSOdojaBaog4VNI8l71TA/uaacPn4jlsMLyCYMlDAgV/+yho0MDHn 2ClBTQqe40n+MYnxeJzaztxYzozoYghadvvVaQuNLP99ohDEVEuH3qshBSNmRgNX3VAV ukI70OK5p7RJoOrx4nhpbFuae2HRYll0OlP8vivK6+INJHeknbxAjf+T2Ck97LQjD++i L0UraldynMQxniAEa3PuOYAQoIO+pbQ8d4MQjSQh68sDYtFlIdn9eHXUy5R75mZB2hSx PNYlyOdefReuUtYha/hVGKaxg8my/9yer9DwZjM7GD4FR/VCJOtl8Cht0K302qHesLcG cecw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ir6qodWEKUGzfEu3dnv9XwT0+RGg2i7HMOiUS/XMmXo=; b=rU5AeIaYirST39/ZXSAPCVZGi2EbUyxkLHKbAioLI2xb2tSOuX0M6ShGJ/zBGjUGWx CW2Bx1nnIAURA/V7T2yJx/Zp9P+G/bjKZxpDYlOJTdode57alx5JCVpreivxRdUcXg5X g6NhXb0eLDXtWBIqHsKBQ7lajarrZNMu8Cqc37ltwpmHf2BKoONoE5X6h5Zv8iW41vvM V9OForJanX0P9myJPHDrf+Se1QSdrq2lPtg6rNY2qpMCX/fqloxJmrB8CFrcc2HOCOJb UEXICt4CkisHUnuJckHL3VTdAghW3Q9N4d5RI9ZfKy8VB+0UJhXm9JE92fIAi0i+paRP vo+Q== X-Gm-Message-State: APjAAAWnfVoDPMW6gURhbIK5W7L/lvEmaSSD61+AePoMgOXT/U9vN3uc 0P+sXjgc7KZ7hzTwkwg8Re+l3AlLGmWB6KxPv6c= X-Google-Smtp-Source: APXvYqzzxI2FB9oRNRJk4tGUx4ZVBAWC2Zh7YbubeYCUtq/jyNsNDL60ZiEOuL65YZF7uSwAZg38xdfP3iY0SMu2CB0= X-Received: by 2002:a24:c546:: with SMTP id f67mr2627294itg.28.1552500165874; Wed, 13 Mar 2019 11:02:45 -0700 (PDT) Date: Wed, 13 Mar 2019 11:02:38 -0700 In-Reply-To: Message-Id: <20190313180239.261938-1-ndesaulniers@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.21.0.360.g471c308f928-goog Subject: [PATCH] lib/string.c: implement a basic bcmp From: Nick Desaulniers To: akpm@linux-foundation.org Cc: clang-built-linux@googlegroups.com, linux-kbuild@vger.kernel.org, Nick Desaulniers , stable@vger.kernel.org, Nathan Chancellor , Adhemerval Zanella , Arnd Bergmann , James Y Knight , Masahiro Yamada , Rasmus Villemoes , Greg Kroah-Hartman , Alexander Shishkin , Andy Shevchenko , linux-kernel@vger.kernel.org Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP A recent optimization in Clang (r355672) lowers comparisons of the return value of memcmp against zero to comparisons of the return value of bcmp against zero. This helps some platforms that implement bcmp more efficiently than memcmp. glibc simply aliases bcmp to memcmp, but an optimized implementation is in the works. This results in linkage failures for all targets with Clang due to the undefined symbol. For now, just implement bcmp as a tailcail to memcmp to unbreak the build. This routine can be further optimized in the future. Other ideas discussed: * A weak alias was discussed, but breaks for architectures that define their own implementations of memcmp since aliases to declarations are not permitted (only definitions). Arch-specific memcmp implementations typically declare memcmp in C headers, but implement them in assembly. * -ffreestanding also is used sporadically throughout the kernel. * -fno-builtin-bcmp doesn't work when doing LTO. Link: https://bugs.llvm.org/show_bug.cgi?id=41035 Link: https://code.woboq.org/userspace/glibc/string/memcmp.c.html#bcmp Link: https://github.com/llvm/llvm-project/commit/8e16d73346f8091461319a7dfc4ddd18eedcff13 Link: https://github.com/ClangBuiltLinux/linux/issues/416 Cc: stable@vger.kernel.org Reported-by: Nathan Chancellor Reported-by: Adhemerval Zanella Suggested-by: Arnd Bergmann Suggested-by: James Y Knight Suggested-by: Masahiro Yamada Suggested-by: Nathan Chancellor Suggested-by: Rasmus Villemoes Signed-off-by: Nick Desaulniers --- lib/string.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/string.c b/lib/string.c index 38e4ca08e757..5b2377d7143f 100644 --- a/lib/string.c +++ b/lib/string.c @@ -866,6 +866,21 @@ __visible int memcmp(const void *cs, const void *ct, size_t count) EXPORT_SYMBOL(memcmp); #endif +#ifndef __HAVE_ARCH_BCMP +/** + * bcmp - Like memcmp but the return code simply indicates a non-match. + * @cs: One area of memory. + * @ct: Another area of memory. + * @count: The size of the areas. + */ +#undef bcmp +int bcmp(const void *cs, const void *ct, size_t count) +{ + return memcmp(cs, ct, count); +} +EXPORT_SYMBOL(bcmp); +#endif + #ifndef __HAVE_ARCH_MEMSCAN /** * memscan - Find a character in an area of memory.