summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-07-24 13:24:55 +0200
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-07-25 11:11:23 +0900
commit069a24c93caaa6f8eacdb02609356bee0adf3192 (patch)
treebd09d60b84afbe30f9c62c21aab41997cc82bf8b
parentb48904273afab1a7ce96828aff701c56f21eaa53 (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.rb26
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')