mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
YJIT: Support Rust 1.58.1 for --yjit-stats on Arm (#6410)
* YJIT: Test Rust 1.58.1 as well on Cirrus
* YJIT: Avoid using a Rust 1.60.0 feature
* YJIT: Use autoconf to detect support
* YJIT: We actually need to run it
for checking it properly
* YJIT: Try cfg!(target_feature = "lse")
* Revert "YJIT: Try cfg!(target_feature = "lse")"
This reverts commit 4e2a9ca9a9
.
* YJIT: Add --features stats only when it works
* Update configure.ac
Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
This commit is contained in:
parent
7588f21851
commit
912ea8257a
Notes:
git
2022-09-24 05:18:20 +09:00
Merged-By: maximecb <maximecb@ruby-lang.org>
3 changed files with 31 additions and 21 deletions
|
@ -90,6 +90,7 @@ yjit_task:
|
||||||
matrix:
|
matrix:
|
||||||
- CC: clang-12
|
- CC: clang-12
|
||||||
configure: --enable-yjit=dev
|
configure: --enable-yjit=dev
|
||||||
|
rustup_init: --default-toolchain=1.58.1
|
||||||
- CC: gcc-11
|
- CC: gcc-11
|
||||||
configure: --enable-yjit
|
configure: --enable-yjit
|
||||||
id_script: id
|
id_script: id
|
||||||
|
@ -107,7 +108,7 @@ yjit_task:
|
||||||
install_rust_script:
|
install_rust_script:
|
||||||
- sudo apt-get update -y
|
- sudo apt-get update -y
|
||||||
- sudo apt-get install -y curl
|
- sudo apt-get install -y curl
|
||||||
- "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"
|
- "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y $rustup_init"
|
||||||
autogen_script: ./autogen.sh
|
autogen_script: ./autogen.sh
|
||||||
configure_script: >-
|
configure_script: >-
|
||||||
source $HOME/.cargo/env && ./configure -C
|
source $HOME/.cargo/env && ./configure -C
|
||||||
|
|
35
configure.ac
35
configure.ac
|
@ -3748,23 +3748,44 @@ AS_CASE(["${YJIT_SUPPORT}"],
|
||||||
],
|
],
|
||||||
[dev], [
|
[dev], [
|
||||||
rb_rust_target_subdir=debug
|
rb_rust_target_subdir=debug
|
||||||
CARGO_BUILD_ARGS='--features stats,disasm,asm_comments'
|
CARGO_BUILD_ARGS='--features disasm,asm_comments'
|
||||||
AC_DEFINE(RUBY_DEBUG, 1)
|
AC_DEFINE(RUBY_DEBUG, 1)
|
||||||
],
|
],
|
||||||
[dev_nodebug], [
|
[dev_nodebug], [
|
||||||
rb_rust_target_subdir=dev_nodebug
|
rb_rust_target_subdir=dev_nodebug
|
||||||
CARGO_BUILD_ARGS='--profile dev_nodebug --features stats,disasm,asm_comments'
|
CARGO_BUILD_ARGS='--profile dev_nodebug --features disasm,asm_comments'
|
||||||
],
|
],
|
||||||
[stats], [
|
[stats], [
|
||||||
rb_rust_target_subdir=stats
|
rb_rust_target_subdir=stats
|
||||||
CARGO_BUILD_ARGS='--profile stats --features stats'
|
CARGO_BUILD_ARGS='--profile stats'
|
||||||
])
|
])
|
||||||
|
|
||||||
AS_IF([test -n "${CARGO_BUILD_ARGS}"], [
|
AS_IF([test -n "${CARGO_BUILD_ARGS}"], [
|
||||||
AC_CHECK_TOOL(CARGO, [cargo], [no])
|
AC_CHECK_TOOL(CARGO, [cargo], [no])
|
||||||
AS_IF([test x"$CARGO" = "xno"],
|
AS_IF([test x"$CARGO" = "xno"],
|
||||||
AC_MSG_ERROR([cargo is required. Installation instructions available at https://www.rust-lang.org/tools/install])
|
AC_MSG_ERROR([cargo is required. Installation instructions available at https://www.rust-lang.org/tools/install])
|
||||||
]))
|
])
|
||||||
|
|
||||||
|
# Insn::IncrCounter uses ldaddal, which works only on ARMv8.1+.
|
||||||
|
AC_CACHE_CHECK(yjit stats are broken, rb_cv_broken_yjit_stats, [
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[]], [[
|
||||||
|
@%:@ifdef __aarch64__
|
||||||
|
asm volatile(".arch armv8-a+lse\n"
|
||||||
|
"ldaddal xzr, xzr, @<:@sp@:>@");
|
||||||
|
@%:@endif
|
||||||
|
]])],
|
||||||
|
[rb_cv_broken_yjit_stats=no],
|
||||||
|
[rb_cv_broken_yjit_stats=yes],
|
||||||
|
[rb_cv_broken_yjit_stats=yes]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
# This won't enable stats in release builds because we don't use cargo
|
||||||
|
# for release builds, use rustc directly
|
||||||
|
AS_IF([test "$rb_cv_broken_yjit_stats" = no], [
|
||||||
|
CARGO_BUILD_ARGS="${CARGO_BUILD_ARGS} --features stats"
|
||||||
|
])
|
||||||
|
)
|
||||||
|
|
||||||
YJIT_LIBS="yjit/target/${rb_rust_target_subdir}/libyjit.a"
|
YJIT_LIBS="yjit/target/${rb_rust_target_subdir}/libyjit.a"
|
||||||
AS_CASE(["$target_os"],[openbsd*],[
|
AS_CASE(["$target_os"],[openbsd*],[
|
||||||
|
|
|
@ -151,19 +151,7 @@ pub fn parse_option(str_ptr: *const std::os::raw::c_char) -> Option<()> {
|
||||||
|
|
||||||
("greedy-versioning", "") => unsafe { OPTIONS.greedy_versioning = true },
|
("greedy-versioning", "") => unsafe { OPTIONS.greedy_versioning = true },
|
||||||
("no-type-prop", "") => unsafe { OPTIONS.no_type_prop = true },
|
("no-type-prop", "") => unsafe { OPTIONS.no_type_prop = true },
|
||||||
|
("stats", "") => unsafe { OPTIONS.gen_stats = true },
|
||||||
("stats", "") => {
|
|
||||||
// Insn::IncrCounter uses ldaddal, which works only on ARMv8.1+.
|
|
||||||
#[cfg(feature = "stats")]
|
|
||||||
#[cfg(target_arch = "aarch64")]
|
|
||||||
if !std::arch::is_aarch64_feature_detected!("lse") {
|
|
||||||
eprintln!("Your processor does not support --yjit-stats. Aborting.");
|
|
||||||
std::process::exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe { OPTIONS.gen_stats = true }
|
|
||||||
},
|
|
||||||
|
|
||||||
("trace-exits", "") => unsafe { OPTIONS.gen_trace_exits = true; OPTIONS.gen_stats = true },
|
("trace-exits", "") => unsafe { OPTIONS.gen_trace_exits = true; OPTIONS.gen_stats = true },
|
||||||
("dump-insns", "") => unsafe { OPTIONS.dump_insns = true },
|
("dump-insns", "") => unsafe { OPTIONS.dump_insns = true },
|
||||||
("verify-ctx", "") => unsafe { OPTIONS.verify_ctx = true },
|
("verify-ctx", "") => unsafe { OPTIONS.verify_ctx = true },
|
||||||
|
|
Loading…
Reference in a new issue