aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/check/crc32_fast.c
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2023-10-20 23:35:10 +0300
committerLasse Collin <lasse.collin@tukaani.org>2024-01-11 14:29:42 +0200
commit419f55f9dfc2df8792902b8953d50690121afeea (patch)
treeaa95af5e4119ab90423c19ad64cfa73df0044f1c /src/liblzma/check/crc32_fast.c
parentliblzma: crc_clmul.c: Add crc_attr_target macro. (diff)
downloadxz-419f55f9dfc2df8792902b8953d50690121afeea.tar.xz
liblzma: Avoid extern lzma_crc32_clmul() and lzma_crc64_clmul().
A CLMUL-only build will have the crcxx_clmul() inlined into lzma_crcxx(). Previously a jump to the extern lzma_crcxx_clmul() was needed. Notes about shared liblzma on ELF platforms: - On platforms that support ifunc and -fvisibility=hidden, this was silly because CLMUL-only build would have that single extra jump instruction of extra overhead. - On platforms that support neither -fvisibility=hidden nor linker version script (liblzma*.map), jumping to lzma_crcxx_clmul() would go via PLT so a few more instructions of overhead (still not a big issue but silly nevertheless). There was a downside with static liblzma too: if an application only needs lzma_crc64(), static linking would make the linker include the CLMUL code for both CRC32 and CRC64 from crc_x86_clmul.o even though the CRC32 code wouldn't be needed, thus increasing code size of the executable (assuming that -ffunction-sections isn't used). Also, now compilers are likely to inline crc_simd_body() even if they don't support the always_inline attribute (or MSVC's __forceinline). Quite possibly all compilers that build the code do support such an attribute. But now it likely isn't a problem even if the attribute wasn't supported. Now all x86-specific stuff is in crc_x86_clmul.h. If other archs The other archs can then have their own headers with their own is_clmul_supported() and crcxx_clmul(). Another bonus is that the build system doesn't need to care if crc_clmul.c is needed. is_clmul_supported() stays as inline function as it's not needed when doing a CLMUL-only build (avoids a warning about unused function).
Diffstat (limited to '')
-rw-r--r--src/liblzma/check/crc32_fast.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/liblzma/check/crc32_fast.c b/src/liblzma/check/crc32_fast.c
index 9fce94d3..6982836a 100644
--- a/src/liblzma/check/crc32_fast.c
+++ b/src/liblzma/check/crc32_fast.c
@@ -15,6 +15,11 @@
#include "check.h"
#include "crc_common.h"
+#ifdef CRC_CLMUL
+# define BUILDING_CRC32_CLMUL
+# include "crc_x86_clmul.h"
+#endif
+
#ifdef CRC_GENERIC
@@ -132,7 +137,7 @@ typedef uint32_t (*crc32_func_type)(
static crc32_func_type
crc32_resolve(void)
{
- return is_clmul_supported() ? &lzma_crc32_clmul : &crc32_generic;
+ return is_clmul_supported() ? &crc32_clmul : &crc32_generic;
}
#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(__clang__)
@@ -221,7 +226,7 @@ lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc)
return crc32_func(buf, size, crc);
#elif defined(CRC_CLMUL)
- return lzma_crc32_clmul(buf, size, crc);
+ return crc32_clmul(buf, size, crc);
#else
return crc32_generic(buf, size, crc);