diff --git a/configure.ac b/configure.ac index 9f6f92cced..bbb2161a0c 100644 --- a/configure.ac +++ b/configure.ac @@ -3916,17 +3916,17 @@ AS_CASE(["${YJIT_SUPPORT}"], ], [dev], [ rb_rust_target_subdir=debug - CARGO_BUILD_ARGS='--features stats,disasm' + CARGO_BUILD_ARGS='--features disasm,runtime_checks' AC_DEFINE(RUBY_DEBUG, 1) ], [dev_nodebug], [ rb_rust_target_subdir=dev_nodebug - CARGO_BUILD_ARGS='--profile dev_nodebug --features stats,disasm' + CARGO_BUILD_ARGS='--profile dev_nodebug --features disasm' AC_DEFINE(YJIT_STATS, 1) ], [stats], [ rb_rust_target_subdir=stats - CARGO_BUILD_ARGS='--profile stats --features stats' + CARGO_BUILD_ARGS='--profile stats' AC_DEFINE(YJIT_STATS, 1) ]) diff --git a/yjit/Cargo.toml b/yjit/Cargo.toml index 0b2e286cc9..182dccb7f6 100644 --- a/yjit/Cargo.toml +++ b/yjit/Cargo.toml @@ -17,11 +17,16 @@ crate-type = ["staticlib"] # written rationale. Optional For development and testing purposes capstone = { version = "0.12.0", optional = true } -[features] # NOTE: Development builds select a set of these via configure.ac # For debugging, `make V=1` shows exact cargo invocation. +[features] +# Support --yjit-dump-disasm and RubyVM::YJIT.disasm using libcapstone. disasm = ["capstone"] -stats = [] +# Modify generated code for assertions, e.g. and poison value in PC +# for C method calls and stack canary. This is managed separately +# from cfg!(debug_assertions) so that we can see disasm of the code +# that would run in the release mode. +runtime_checks = [] [profile.dev] opt-level = 0 diff --git a/yjit/src/backend/ir.rs b/yjit/src/backend/ir.rs index 599ecfabc9..3355dc5da3 100644 --- a/yjit/src/backend/ir.rs +++ b/yjit/src/backend/ir.rs @@ -1759,7 +1759,7 @@ impl Assembler { // If the slot is already used, which is a valid optimization to avoid spills, // give up the verification. - let canary_opnd = if cfg!(debug_assertions) && self.leaf_ccall && opnds.iter().all(|opnd| + let canary_opnd = if cfg!(feature = "runtime_checks") && self.leaf_ccall && opnds.iter().all(|opnd| opnd.get_reg_opnd() != canary_opnd.get_reg_opnd() ) { asm_comment!(self, "set stack canary"); diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 4abf58fea4..0baa3344a6 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -6587,7 +6587,7 @@ fn gen_send_cfunc( cme, recv, sp, - pc: if cfg!(debug_assertions) { + pc: if cfg!(feature = "runtime_checks") { Some(!0) // Poison value. Helps to fail fast. } else { None // Leave PC uninitialized as cfuncs shouldn't read it @@ -8385,12 +8385,6 @@ fn gen_send_dynamic Opnd>( // Save PC and SP to prepare for dynamic dispatch jit_prepare_non_leaf_call(jit, asm); - // Squash stack canary that might be left over from elsewhere - assert_eq!(false, asm.get_leaf_ccall()); - if cfg!(debug_assertions) { - asm.store(asm.ctx.sp_opnd(0), 0.into()); - } - // Dispatch a method let ret = vm_sendish(asm);