From patchwork Mon Oct 11 08:17:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 46060 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BE7633858438 for ; Mon, 11 Oct 2021 08:17:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE7633858438 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1633940262; bh=kDnDoIzHJ7K9uIZLW9VCbkLq6Q0akaH5FvPzv8aBjmE=; h=References:In-Reply-To:Date:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=Wj+YdD2n7iQTMykAOXwCAnMI2GGbysDkiKymgWOKyxQXTx2PENSmHRtNtZ68jKhI6 t+gMzsk8xkcxWVbx5l3ZN1LOoqS0uzbWLkple424wZGUdvda9vKzzm/Xfpr87C8MWY RcXa83wbfppc9kCMsDoAkGelnvi2F9MiFRldgbh0= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id D87C73858D28 for ; Mon, 11 Oct 2021 08:17:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D87C73858D28 Received: from mail-ua1-f69.google.com (mail-ua1-f69.google.com [209.85.222.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-146-ghtSFxawPsudwlStn3FqoQ-1; Mon, 11 Oct 2021 04:17:14 -0400 X-MC-Unique: ghtSFxawPsudwlStn3FqoQ-1 Received: by mail-ua1-f69.google.com with SMTP id m40-20020ab05a6b000000b002c9d69624b0so7485825uad.1 for ; Mon, 11 Oct 2021 01:17:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=kDnDoIzHJ7K9uIZLW9VCbkLq6Q0akaH5FvPzv8aBjmE=; b=lhBJjqg1Wqv7spvGvlZNgTMIqNwZf5WVQ6iwLsRoxo3sBvouXpyTMB0TJp+9pGBt4e CiOhPyWwzwrS0sPqFF+Cg1AAEkP33szvvq2WVZj+fcbr7yD98XjuYmYcjnVBJTavpJYd oCwl9vi1duw0oJxr5b26AYdSi63FjBi4fAcTqHL3FAtOUi9om4ZvEdErgesgttLYB2fy DV+lvkk5Xcx7VL6Xjqq0JEjyKBtv8w0XFaXUl+OVXYuJjehODhqBeh8zTHnuMzQ/CKkY fjtxvJ+EIhszFCRrC9ScpHbWT8OinjHPjGwaitvI8gkS1Uu314Qpg5wn+jQ+NeiuOoMK HPlQ== X-Gm-Message-State: AOAM531DJ7eNWHNwO/ciO+A5PA4EDWvYt5AtaFgeSWj+huR62djr833p UDXDl1cRpNVahPXXjczUURCePoqH4dFj6OmIjvB4am/giK3omHwg3TrQts07eEyLQWDfyi9MuOU WM8EPhOG3lnMrFzUwWpE8ZatMogMsrN1v0W6b X-Received: by 2002:a1f:b417:: with SMTP id d23mr18343482vkf.8.1633940234489; Mon, 11 Oct 2021 01:17:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTcINgOOqQWIGersEQ+8KGwd/AIInmrJ5PNFBRGao4O6dxNufDNdgEqzFeKWmdPx7q9noOsH3KNDbCnEITT7I= X-Received: by 2002:a1f:b417:: with SMTP id d23mr18343478vkf.8.1633940234334; Mon, 11 Oct 2021 01:17:14 -0700 (PDT) MIME-Version: 1.0 References: <87h7e24a69.fsf@oldenburg.str.redhat.com> <07fdfa95-e2ad-635d-a0ee-4e4813553e99@redhat.com> In-Reply-To: <07fdfa95-e2ad-635d-a0ee-4e4813553e99@redhat.com> Date: Mon, 11 Oct 2021 09:17:03 +0100 Message-ID: Subject: [PATCH v2] Add alloc_align attribute to memalign et al To: "Carlos O'Donell" X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, 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: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Libc-alpha From: Jonathan Wakely Reply-To: Jonathan Wakely Cc: Florian Weimer , Jonathan Wakely via Libc-alpha Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" On Wed, 6 Oct 2021 at 14:10, Carlos O'Donell wrote: > > On 9/30/21 06:42, Florian Weimer via Libc-alpha wrote: > > * Jonathan Wakely via Libc-alpha: > > > >> Signed-off-by: Jonathan Wakely > > > > As a DCO contribution, this needs to update the copyright headers of the > > changed files, according to: > > > > > > > > | If you are adding a change to a file and those changes do not have > > | their copyright assigned to the FSF (contribution via DCO), those > > | changes should add the following to the top of the file after the > > | 1-line description: > > | > > | Copyright The GNU Toolchain Authors. > > This is correct. > > > On the other hand, the string “Copyright The GNU Toolchain Authors” > > presently does not appear in glibc, so I don't know the rule is actually > > in place, sorry. > > This rule has been in effect since August 1st 2021 when we transitioned to accepting DCO. > > We should accept Jonathan's patch if it meets our Contribution Checklist. > > In this case Jonathan should submit a v2 with the copyright updated. The attached v2 patch adds those copyright reminders as requested. For the avoidance of doubt, the copyright in this patch is mine (not Red Hat's) and my personal FSF assignment has been cancelled, which is why this is a DCO contribution. Tested on x86_64-linux (Fedora 34). Summary of test results: 4559 PASS 23 UNSUPPORTED 16 XFAIL 6 XPASS OK to push? commit 0521d85d2ab89008e4fe9de4e6a81663bc880c60 Author: Jonathan Wakely Date: Wed Oct 6 20:05:48 2021 +0100 Add alloc_align attribute to memalign et al GCC 4.9.0 added the alloc_align attribute to say that a function argument specifies the alignment of the returned pointer. Clang supports the attribute too. Using the attribute can allow a compiler to generate better code if it knows the returned pointer has a minimum alignment. See https://gcc.gnu.org/PR60092 for more details. GCC implicitly knows the semantics of aligned_alloc and posix_memalign, but not the obsolete memalign. As a result, GCC generates worse code when memalign is used, compared to aligned_alloc. Clang knows about aligned_alloc and memalign, but not posix_memalign. This change adds a new __attribute_alloc_align__ macro to and then uses it on memalign (where it helps GCC) and aligned_alloc (where GCC and Clang already know the semantics, but it doesn't hurt) and xposix_memalign. It can't be used on posix_memalign because that doesn't return a pointer (the allocated pointer is returned via a void** parameter instead). Unlike the alloc_size attribute, alloc_align only allows a single argument. That means the new __attribute_alloc_align__ macro doesn't really need to be used with double parentheses to protect a comma between its arguments. For consistency with __attribute_alloc_size__ this patch defines it the same way, so that double parentheses are required. Signed-off-by: Jonathan Wakely Reviewed-by: Carlos O'Donell Tested-by: Carlos O'Donell diff --git a/malloc/malloc.h b/malloc/malloc.h index 2df0b38050..0e8a0cf051 100644 --- a/malloc/malloc.h +++ b/malloc/malloc.h @@ -1,5 +1,6 @@ /* Prototypes and definition for malloc implementation. Copyright (C) 1996-2021 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -64,8 +65,8 @@ extern void free (void *__ptr) __THROW; /* Allocate SIZE bytes allocated to ALIGNMENT bytes. */ extern void *memalign (size_t __alignment, size_t __size) - __THROW __attribute_malloc__ __attribute_alloc_size__ ((2)) __wur - __attr_dealloc_free; + __THROW __attribute_malloc__ __attribute_alloc_align__ ((1)) + __attribute_alloc_size__ ((2)) __wur __attr_dealloc_free; /* Allocate SIZE bytes on a page boundary. */ extern void *valloc (size_t __size) __THROW __attribute_malloc__ diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 4dac9d264d..a864eb81d5 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -1,4 +1,5 @@ /* Copyright (C) 1992-2021 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -243,6 +244,15 @@ # define __attribute_alloc_size__(params) /* Ignore. */ #endif +/* Tell the compiler which argument to an allocation function + indicates the alignment of the allocation. */ +#if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__alloc_align__) +# define __attribute_alloc_align__(param) \ + __attribute__ ((__alloc_align__ param)) +#else +# define __attribute_alloc_align__(param) /* Ignore. */ +#endif + /* At some point during the gcc 2.96 development the `pure' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings. */ diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 0481c12355..e99c5a1b90 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -1,4 +1,5 @@ /* Copyright (C) 1991-2021 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -589,7 +590,8 @@ extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) #ifdef __USE_ISOC11 /* ISO C variant of aligned allocation. */ extern void *aligned_alloc (size_t __alignment, size_t __size) - __THROW __attribute_malloc__ __attribute_alloc_size__ ((2)) __wur; + __THROW __attribute_malloc__ __attribute_alloc_align__ ((1)) + __attribute_alloc_size__ ((2)) __wur; #endif /* Abort execution and generate a core-dump. */ diff --git a/support/support.h b/support/support.h index 837a806531..13324712e7 100644 --- a/support/support.h +++ b/support/support.h @@ -1,5 +1,6 @@ /* Common extra functions. Copyright (C) 2016-2021 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -98,8 +99,8 @@ extern void *xrealloc (void *o, size_t n) extern char *xstrdup (const char *) __attribute_malloc__ __attr_dealloc_free __returns_nonnull; void *xposix_memalign (size_t alignment, size_t n) - __attribute_malloc__ __attribute_alloc_size__ ((2)) __attr_dealloc_free - __returns_nonnull; + __attribute_malloc__ __attribute_alloc_align__ ((1)) + __attribute_alloc_size__ ((2)) __attr_dealloc_free __returns_nonnull; char *xasprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), malloc)) __attr_dealloc_free __returns_nonnull;