2018-02-22 15:11:12 +00:00
|
|
|
module JITSupport
|
|
|
|
JIT_TIMEOUT = 600 # 10min for each...
|
|
|
|
JIT_SUCCESS_PREFIX = 'JIT success \(\d+\.\dms\)'
|
|
|
|
SUPPORTED_COMPILERS = [
|
|
|
|
'gcc',
|
|
|
|
'clang',
|
|
|
|
]
|
|
|
|
|
2018-05-27 05:47:43 +00:00
|
|
|
def self.check_support
|
2018-02-22 15:11:12 +00:00
|
|
|
# Experimental. If you want to ensure JIT is working with this test, please set this for now.
|
|
|
|
if ENV.key?('RUBY_FORCE_TEST_JIT')
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
# Very pessimistic check. With this check, we can't ensure JIT is working.
|
|
|
|
begin
|
|
|
|
_, err = JITSupport.eval_with_jit('proc {}.call', verbose: 1, min_calls: 1, timeout: 10)
|
|
|
|
rescue Timeout::Error
|
|
|
|
$stderr.puts "TestJIT: #jit_supported? check timed out"
|
|
|
|
false
|
|
|
|
else
|
2018-05-27 07:33:18 +00:00
|
|
|
err.match?(JIT_SUCCESS_PREFIX).tap do |success|
|
|
|
|
unless success
|
|
|
|
$stderr.puts "TestJIT.check_support stderr:\n```\n#{err}\n```\n"
|
|
|
|
end
|
|
|
|
end
|
2018-02-22 15:11:12 +00:00
|
|
|
end
|
|
|
|
end
|
2018-04-28 09:22:07 +00:00
|
|
|
|
2018-05-27 05:47:43 +00:00
|
|
|
module_function
|
2018-07-27 05:52:01 +00:00
|
|
|
def eval_with_jit(env = nil, script, verbose: 0, min_calls: 5, save_temps: false, max_cache: 1000, timeout: JIT_TIMEOUT)
|
|
|
|
args = [
|
|
|
|
'--disable-gems', '--jit-wait', "--jit-verbose=#{verbose}",
|
|
|
|
"--jit-min-calls=#{min_calls}", "--jit-max-cache=#{max_cache}",
|
|
|
|
]
|
2018-05-27 05:47:43 +00:00
|
|
|
args << '--jit-save-temps' if save_temps
|
|
|
|
args << '-e' << script
|
2018-07-31 12:43:06 +00:00
|
|
|
base_env = { 'MJIT_SEARCH_BUILD_DIR' => 'true' } # workaround to skip requiring `make install` for `make test-all`
|
|
|
|
args.unshift(env ? base_env.merge!(env) : base_env)
|
2018-05-27 05:47:43 +00:00
|
|
|
EnvUtil.invoke_ruby(args,
|
|
|
|
'', true, true, timeout: timeout,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def supported?
|
|
|
|
return @supported if defined?(@supported)
|
|
|
|
@supported = JITSupport.check_support.tap do |supported|
|
|
|
|
unless supported
|
2018-06-05 22:32:41 +00:00
|
|
|
warn "JIT tests are skipped since JIT seems not working. Set RUBY_FORCE_TEST_JIT=1 to let it fail.", uplevel: 1
|
2018-05-27 05:47:43 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-04-28 09:22:07 +00:00
|
|
|
def remove_mjit_logs(stderr)
|
|
|
|
if RubyVM::MJIT.enabled?
|
|
|
|
stderr.gsub(/^MJIT warning: Skipped to compile unsupported instruction: \w+\n/m, '')
|
|
|
|
else
|
|
|
|
stderr
|
|
|
|
end
|
|
|
|
end
|
2018-02-22 15:11:12 +00:00
|
|
|
end
|