diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2022-12-01 20:04:17 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2022-12-12 15:47:17 +0200 |
commit | ef315163efdf82e327608ae9b8df1bfea42eb6b5 (patch) | |
tree | 876dc76808e70d7947221a334b674037bd171b35 | |
parent | Update THANKS (sync all from master). (diff) | |
download | xz-ef315163efdf82e327608ae9b8df1bfea42eb6b5.tar.xz |
liblzma: Use __has_attribute(__symver__) to fix Clang detection.
If someone sets up Clang to define __GNUC__ to 10 or greater
then symvers broke. __has_attribute is supported by such GCC
and Clang versions that don't support __symver__ so this should
be much better and simpler way to detect if __symver__ is
actually supported.
Thanks to Tomasz Gajc for the bug report.
-rw-r--r-- | src/liblzma/common/common.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/liblzma/common/common.h b/src/liblzma/common/common.h index 7fb1732a..671d3bc4 100644 --- a/src/liblzma/common/common.h +++ b/src/liblzma/common/common.h @@ -34,6 +34,14 @@ #include "lzma.h" +// This is for detecting modern GCC and Clang attributes +// like __symver__ in GCC >= 10. +#ifdef __has_attribute +# define lzma_has_attribute(attr) __has_attribute(attr) +#else +# define lzma_has_attribute(attr) 0 +#endif + // The extra symbol versioning in the C files may only be used when // building a shared library. If HAVE_SYMBOL_VERSIONS_LINUX is defined // to 2 then symbol versioning is done only if also PIC is defined. @@ -63,7 +71,12 @@ // since 2000). When using @@ instead of @@@, the internal name must not be // the same as the external name to avoid problems in some situations. This // is why "#define foo_52 foo" is needed for the default symbol versions. -# if TUKLIB_GNUC_REQ(10, 0) && !defined(__INTEL_COMPILER) +// +// __has_attribute is supported before GCC 10 and it is supported in Clang 14 +// too (which doesn't support __symver__) so use it to detect if __symver__ +// is available. This should be far more reliable than looking at compiler +// version macros as nowadays especially __GNUC__ is defined by many compilers. +# if lzma_has_attribute(__symver__) # define LZMA_SYMVER_API(extnamever, type, intname) \ extern __attribute__((__symver__(extnamever))) \ LZMA_API(type) intname |