summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2024-07-18 13:01:47 -0700
committerGitHub <[email protected]>2024-07-18 13:01:47 -0700
commit2de8b5b8054f311c4cee112dcab5208b66cc62a4 (patch)
treebd5f932cc396ace86bc6fcf78637e4be7586a62e
parent059535bd650bf2765fb8fd14e28d6e98f52871c2 (diff)
YJIT: Allow dev_nodebug to disasm release-mode code (#11198)
* YJIT: Allow dev_nodebug to disasm release-mode code * Revert "YJIT: Squash canary before falling back" This reverts commit f05ad373d84909da7541bd6d6ace38b48eaf24a1. The stray canary issue should have been solved by def7023ee4a3fc6eeba9d3a34c31a5bcff315fac, alleviating this codegen accommodation. * s/runtime_assertions/runtime_checks/ --------- Co-authored-by: Alan Wu <[email protected]>
Notes
Notes: Merged-By: k0kubun <[email protected]>
-rw-r--r--configure.ac6
-rw-r--r--yjit/Cargo.toml9
-rw-r--r--yjit/src/backend/ir.rs2
-rw-r--r--yjit/src/codegen.rs8
4 files changed, 12 insertions, 13 deletions
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<F: Fn(&mut Assembler) -> 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);