]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
liblzma: Only use ifunc in crcXX_fast.c if its needed.
authorJia Tan <jiat0218@gmail.com>
Tue, 23 Jan 2024 10:02:13 +0000 (18:02 +0800)
committerJia Tan <jiat0218@gmail.com>
Thu, 1 Feb 2024 12:09:11 +0000 (20:09 +0800)
The code was using HAVE_FUNC_ATTRIBUTE_IFUNC instead of CRC_USE_IFUNC.
With ARM64, ifunc is incompatible because it requires non-inline
function calls for runtime detection.

src/liblzma/check/crc32_fast.c
src/liblzma/check/crc64_fast.c

index 0b667d8b6503d9857d179912ebdcb025e716359d..1fadb70f1d227aa1bed76da08da9e55229074fa1 100644 (file)
@@ -128,7 +128,7 @@ typedef uint32_t (*crc32_func_type)(
 // Clang 16.0.0 and older has a bug where it marks the ifunc resolver
 // function as unused since it is static and never used outside of
 // __attribute__((__ifunc__())).
-#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(__clang__)
+#if defined(CRC_USE_IFUNC) && defined(__clang__)
 #      pragma GCC diagnostic push
 #      pragma GCC diagnostic ignored "-Wunused-function"
 #endif
@@ -143,11 +143,11 @@ crc32_resolve(void)
                        ? &crc32_arch_optimized : &crc32_generic;
 }
 
-#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(__clang__)
+#if defined(CRC_USE_IFUNC) && defined(__clang__)
 #      pragma GCC diagnostic pop
 #endif
 
-#ifndef HAVE_FUNC_ATTRIBUTE_IFUNC
+#ifndef CRC_USE_IFUNC
 
 #ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
 // Constructor method.
index d1ab6862f00f1cbf0cd4b8bbdc49a33a1f22aae0..6a4e6d2462e8505ea0298c43e13326f247dd23ba 100644 (file)
@@ -94,7 +94,7 @@ crc64_generic(const uint8_t *buf, size_t size, uint64_t crc)
 typedef uint64_t (*crc64_func_type)(
                const uint8_t *buf, size_t size, uint64_t crc);
 
-#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(__clang__)
+#if defined(CRC_USE_IFUNC) && defined(__clang__)
 #      pragma GCC diagnostic push
 #      pragma GCC diagnostic ignored "-Wunused-function"
 #endif
@@ -106,11 +106,11 @@ crc64_resolve(void)
                        ? &crc64_arch_optimized : &crc64_generic;
 }
 
-#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(__clang__)
+#if defined(CRC_USE_IFUNC) && defined(__clang__)
 #      pragma GCC diagnostic pop
 #endif
 
-#ifndef HAVE_FUNC_ATTRIBUTE_IFUNC
+#ifndef CRC_USE_IFUNC
 
 #ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
 #      define CRC64_SET_FUNC_ATTR __attribute__((__constructor__))