diff options
author | Jia Tan <jiat0218@gmail.com> | 2023-10-18 22:48:19 +0800 |
---|---|---|
committer | Jia Tan <jiat0218@gmail.com> | 2023-10-18 23:54:41 +0800 |
commit | a5966c276bd6fa975f0389f8a8dc61393de750b0 (patch) | |
tree | 5ef6d837c6ae7db5d7f187cf44d296db3128037f /src/liblzma/check | |
parent | liblzma: Refactor CRC comments. (diff) | |
download | xz-a5966c276bd6fa975f0389f8a8dc61393de750b0.tar.xz |
liblzma: Create crc_always_inline macro.
This macro must be used instead of the inline keyword. On MSVC, it is
a replacement for __forceinline which is an MSVC specific keyword that
should not be used with inline (it will issue a warning if it is).
It does not use a build system check to determine if
__attribute__((__always_inline__)) since all compilers that can use
CLMUL extensions (except the special case for MSVC) should support this
attribute. If this assumption is incorrect then it will result in a bug
report instead of silently producing slow code.
Diffstat (limited to '')
-rw-r--r-- | src/liblzma/check/crc_common.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/liblzma/check/crc_common.h b/src/liblzma/check/crc_common.h index b0176adc..7aef383c 100644 --- a/src/liblzma/check/crc_common.h +++ b/src/liblzma/check/crc_common.h @@ -33,6 +33,21 @@ #endif +// The inline keyword is only a suggestion to the compiler to substitute the +// body of the function into the places where it is called. If a function +// is large and called multiple times then compiler may choose to ignore the +// inline suggestion at a sometimes high performance cost. +// +// MSVC's __forceinline is a keyword that should be used in place of inline. +// If both __forceinline and inline are used, MSVC will issue a warning. +// Since MSVC's keyword is a replacement keyword, the lzma_always_inline +// macro must also contain the inline keyword when its not used in MSVC. +#ifdef _MSC_VER +# define crc_always_inline __forceinline +#else +# define crc_always_inline __attribute__((__always_inline__)) inline +#endif + #undef CRC_GENERIC #undef CRC_CLMUL #undef CRC_USE_IFUNC |