diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-07-24 13:24:55 +0200 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-07-25 11:11:23 +0900 |
| commit | 069a24c93caaa6f8eacdb02609356bee0adf3192 (patch) | |
| tree | bd09d60b84afbe30f9c62c21aab41997cc82bf8b | |
| parent | b48904273afab1a7ce96828aff701c56f21eaa53 (diff) | |
[ruby/json] Don't assume `__builtin_cpu_supports` exists
Fix: https://github.com/ruby/json/issues/827
On very old compilers it might not exist, at that point
might as well skip SIMD entirely.
https://github.com/ruby/json/commit/da878435dc
| -rw-r--r-- | ext/json/simd/conf.rb | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/ext/json/simd/conf.rb b/ext/json/simd/conf.rb index 8e7d8ee261..76f774bc97 100644 --- a/ext/json/simd/conf.rb +++ b/ext/json/simd/conf.rb @@ -1,20 +1,24 @@ case RbConfig::CONFIG['host_cpu'] when /^(arm|aarch64)/ # Try to compile a small program using NEON instructions - header, type, init = 'arm_neon.h', 'uint8x16_t', 'vdupq_n_u8(32)' + header, type, init, extra = 'arm_neon.h', 'uint8x16_t', 'vdupq_n_u8(32)', nil when /^(x86_64|x64)/ - header, type, init = 'x86intrin.h', '__m128i', '_mm_set1_epi8(32)' + header, type, init, extra = 'x86intrin.h', '__m128i', '_mm_set1_epi8(32)', 'if (__builtin_cpu_supports("sse2")) { printf("OK"); }' end if header - have_header(header) && try_compile(<<~SRC) - #{cpp_include(header)} - int main(int argc, char **argv) { - #{type} test = #{init}; - if (argc > 100000) printf("%p", &test); - return 0; - } - SRC - $defs.push("-DJSON_ENABLE_SIMD") + if have_header(header) && try_compile(<<~SRC, '-Werror=implicit-function-declaration') + #{cpp_include(header)} + int main(int argc, char **argv) { + #{type} test = #{init}; + #{extra} + if (argc > 100000) printf("%p", &test); + return 0; + } + SRC + $defs.push("-DJSON_ENABLE_SIMD") + else + puts "Disable SIMD" + end end have_header('cpuid.h') |
