lkml.org 
[lkml]   [2019]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.20 51/52] lib/crc32.c: mark crc32_le_base/__crc32c_le_base aliases as __pure
    Date
    From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>

    [ Upstream commit ff98e20ef2081b8620dada28fc2d4fb24ca0abf2 ]

    The upcoming GCC 9 release extends the -Wmissing-attributes warnings
    (enabled by -Wall) to C and aliases: it warns when particular function
    attributes are missing in the aliases but not in their target.

    In particular, it triggers here because crc32_le_base/__crc32c_le_base
    aren't __pure while their target crc32_le/__crc32c_le are.

    These aliases are used by architectures as a fallback in accelerated
    versions of CRC32. See commit 9784d82db3eb ("lib/crc32: make core crc32()
    routines weak so they can be overridden").

    Therefore, being fallbacks, it is likely that even if the aliases
    were called from C, there wouldn't be any optimizations possible.
    Currently, the only user is arm64, which calls this from asm.

    Still, marking the aliases as __pure makes sense and is a good idea
    for documentation purposes and possible future optimizations,
    which also silences the warning.

    Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Tested-by: Laura Abbott <labbott@redhat.com>
    Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    lib/crc32.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/lib/crc32.c b/lib/crc32.c
    index 45b1d67a1767..4a20455d1f61 100644
    --- a/lib/crc32.c
    +++ b/lib/crc32.c
    @@ -206,8 +206,8 @@ u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
    EXPORT_SYMBOL(crc32_le);
    EXPORT_SYMBOL(__crc32c_le);

    -u32 crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);
    -u32 __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);
    +u32 __pure crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);
    +u32 __pure __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);

    /*
    * This multiplies the polynomials x and y modulo the given modulus.
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-11 21:09    [W:2.961 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site