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 f05ad373d8.
The stray canary issue should have been solved by
def7023ee4, alleviating this codegen
accommodation.

* s/runtime_assertions/runtime_checks/

---------

Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
This commit is contained in:
Takashi Kokubun 2024-07-18 13:01:47 -07:00 коммит произвёл GitHub
Родитель 059535bd65
Коммит 2de8b5b805
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 12 добавлений и 13 удалений

Просмотреть файл

@ -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)
])

Просмотреть файл

@ -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

Просмотреть файл

@ -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");

Просмотреть файл

@ -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);