summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Menard <[email protected]>2024-07-02 15:55:17 -0400
committerGitHub <[email protected]>2024-07-02 15:55:17 -0400
commit3407565d2ff5cc1f67e7efe2f8d31714f4d72970 (patch)
treefdd86bfcf57149a793b1d941bf248e0f3f9a6f2f
parent2830a6ae3850279d76f96e1c2a0aad1a94ceac8b (diff)
YJIT: Use a special breakpoint address if one isn't explicitly supplied in order to support natural line stepping. (#11083)
Use a special breakpoint address if one isn't explicitly supplied in order to support natural line stepping. ARM64 will not increment the program counter (PC) upon hitting a breakpoint instruction. Consequently, stepping through code with a debugger ends up looping back to the breakpoint instruction. LLDB has a special breakpoint address of 0xf000 that will increment the PC and allow the debugger to work as expected. This change makes it possible to debug YJIT generated code on ARM64. More details at: https://discourse.llvm.org/t/stepping-over-a-brk-instruction-on-arm64/69766/8 Co-authored-by: Aaron Patterson <[email protected]>
-rw-r--r--yjit/src/asm/arm64/mod.rs4
1 files changed, 2 insertions, 2 deletions
diff --git a/yjit/src/asm/arm64/mod.rs b/yjit/src/asm/arm64/mod.rs
index a94d435b7c..18b5270f9d 100644
--- a/yjit/src/asm/arm64/mod.rs
+++ b/yjit/src/asm/arm64/mod.rs
@@ -257,7 +257,7 @@ pub fn br(cb: &mut CodeBlock, rn: A64Opnd) {
/// BRK - create a breakpoint
pub fn brk(cb: &mut CodeBlock, imm16: A64Opnd) {
let bytes: [u8; 4] = match imm16 {
- A64Opnd::None => Breakpoint::brk(0).into(),
+ A64Opnd::None => Breakpoint::brk(0xf000).into(),
A64Opnd::UImm(imm16) => {
assert!(uimm_fits_bits(imm16, 16), "The immediate operand must be 16 bits or less.");
Breakpoint::brk(imm16 as u16).into()
@@ -1335,7 +1335,7 @@ mod tests {
#[test]
fn test_brk_none() {
- check_bytes("000020d4", |cb| brk(cb, A64Opnd::None));
+ check_bytes("00003ed4", |cb| brk(cb, A64Opnd::None));
}
#[test]