From ec77c2a8bb3b564d3697aea45a26f6ed014737a8 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 21 Aug 2019 12:15:29 -0700 Subject: [PATCH] util: Fix LTO compilation with FMV Function multiversioning conflicts with LTO when applied to a function defined in a header file included from multiple compilation units. Change-Id: I65bed3903a717b7e982ab185c314d2118ae0e795 Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/465972 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Community-CI: Broadcom SPDK FC-NVMe CI --- include/spdk/util.h | 34 ++-------------------- lib/util/Makefile | 3 +- lib/util/math.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 lib/util/math.c diff --git a/include/spdk/util.h b/include/spdk/util.h index 2d5288d0b..defa86865 100644 --- a/include/spdk/util.h +++ b/include/spdk/util.h @@ -57,22 +57,7 @@ extern "C" { /* Ceiling division of unsigned integers */ #define SPDK_CEIL_DIV(x,y) (((x)+(y)-1)/(y)) -/* The following will automatically generate several version of - * this function, targeted at different architectures. This - * is only supported by GCC 6 or newer. */ -#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ - && (defined(__i386__) || defined(__x86_64__)) -__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) -#endif -static inline uint32_t -spdk_u32log2(uint32_t x) -{ - if (x == 0) { - /* log(0) is undefined */ - return 0; - } - return 31u - __builtin_clz(x); -} +uint32_t spdk_u32log2(uint32_t x); static inline uint32_t spdk_align32pow2(uint32_t x) @@ -80,22 +65,7 @@ spdk_align32pow2(uint32_t x) return 1u << (1 + spdk_u32log2(x - 1)); } -/* The following will automatically generate several version of - * this function, targeted at different architectures. This - * is only supported by GCC 6 or newer. */ -#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ - && (defined(__i386__) || defined(__x86_64__)) -__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) -#endif -static inline uint64_t -spdk_u64log2(uint64_t x) -{ - if (x == 0) { - /* log(0) is undefined */ - return 0; - } - return 63u - __builtin_clzl(x); -} +uint64_t spdk_u64log2(uint64_t x); static inline uint64_t spdk_align64pow2(uint64_t x) diff --git a/lib/util/Makefile b/lib/util/Makefile index f21409af3..66ba8bceb 100644 --- a/lib/util/Makefile +++ b/lib/util/Makefile @@ -34,7 +34,8 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -C_SRCS = base64.c bit_array.c cpuset.c crc16.c crc32.c crc32c.c crc32_ieee.c dif.c fd.c file.c strerror_tls.c string.c uuid.c +C_SRCS = base64.c bit_array.c cpuset.c crc16.c crc32.c crc32c.c crc32_ieee.c \ + dif.c fd.c file.c math.c strerror_tls.c string.c uuid.c LIBNAME = util LOCAL_SYS_LIBS = -luuid diff --git a/lib/util/math.c b/lib/util/math.c new file mode 100644 index 000000000..7d1852421 --- /dev/null +++ b/lib/util/math.c @@ -0,0 +1,69 @@ +/*- + * BSD LICENSE + * + * Copyright(c) Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "spdk/stdinc.h" +#include "spdk/util.h" + +/* The following will automatically generate several version of + * this function, targeted at different architectures. This + * is only supported by GCC 6 or newer. */ +#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ + && (defined(__i386__) || defined(__x86_64__)) +__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) +#endif +uint32_t +spdk_u32log2(uint32_t x) +{ + if (x == 0) { + /* log(0) is undefined */ + return 0; + } + return 31u - __builtin_clz(x); +} + +/* The following will automatically generate several version of + * this function, targeted at different architectures. This + * is only supported by GCC 6 or newer. */ +#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \ + && (defined(__i386__) || defined(__x86_64__)) +__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default"))) +#endif +uint64_t +spdk_u64log2(uint64_t x) +{ + if (x == 0) { + /* log(0) is undefined */ + return 0; + } + return 63u - __builtin_clzl(x); +}