[前][次][番号順一覧][スレッド一覧]

ruby-changes:74133

From: Takashi <ko1@a...>
Date: Thu, 20 Oct 2022 09:47:36 +0900 (JST)
Subject: [ruby-changes:74133] b963fb25d2 (master): YJIT: Respect writable_addrs on --yjit-dump-iseq-disasm as well (#6596)

https://git.ruby-lang.org/ruby.git/commit/?id=b963fb25d2

From b963fb25d2f683759c273eb21af85c1632122056 Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Wed, 19 Oct 2022 17:47:11 -0700
Subject: YJIT: Respect writable_addrs on --yjit-dump-iseq-disasm as well
 (#6596)

YJIT: Respect writable_addrs on --yjit-dump-iseq-disasm

as well
---
 yjit/src/core.rs   |  2 +-
 yjit/src/disasm.rs | 21 ++++++++++++---------
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/yjit/src/core.rs b/yjit/src/core.rs
index 38c567d100..705a0c46ef 100644
--- a/yjit/src/core.rs
+++ b/yjit/src/core.rs
@@ -1487,7 +1487,7 @@ fn gen_block_series_body( https://github.com/ruby/ruby/blob/trunk/yjit/src/core.rs#L1487
             if iseq_location.contains(substr) {
                 let last_block = last_blockref.borrow();
                 println!("Compiling {} block(s) for {}, ISEQ offsets [{}, {})", batch.len(), iseq_location, blockid.idx, last_block.end_idx);
-                println!("{}", disasm_iseq_insn_range(blockid.iseq, blockid.idx, last_block.end_idx));
+                print!("{}", disasm_iseq_insn_range(blockid.iseq, blockid.idx, last_block.end_idx));
             }
         }
     }
diff --git a/yjit/src/disasm.rs b/yjit/src/disasm.rs
index 7795372696..e958f3bfce 100644
--- a/yjit/src/disasm.rs
+++ b/yjit/src/disasm.rs
@@ -85,8 +85,8 @@ pub fn disasm_iseq_insn_range(iseq: IseqPtr, start_idx: u32, end_idx: u32) -> St https://github.com/ruby/ruby/blob/trunk/yjit/src/disasm.rs#L85
         let blockid = block.get_blockid();
         if blockid.idx >= start_idx && blockid.idx < end_idx {
             let end_idx = block.get_end_idx();
-            let start_addr = block.get_start_addr().unwrap().raw_ptr();
-            let end_addr = block.get_end_addr().unwrap().raw_ptr();
+            let start_addr = block.get_start_addr().unwrap();
+            let end_addr = block.get_end_addr().unwrap();
             let code_size = block.code_size();
 
             // Write some info about the current block
@@ -101,14 +101,17 @@ pub fn disasm_iseq_insn_range(iseq: IseqPtr, start_idx: u32, end_idx: u32) -> St https://github.com/ruby/ruby/blob/trunk/yjit/src/disasm.rs#L101
             writeln!(out, "== {:=<60}", block_ident).unwrap();
 
             // Disassemble the instructions
-            out.push_str(&disasm_addr_range(global_cb, start_addr, (start_addr as usize + code_size) as *const u8));
+            for (start_addr, end_addr) in global_cb.writable_addrs(start_addr, end_addr) {
+                out.push_str(&disasm_addr_range(global_cb, start_addr, end_addr));
+                writeln!(out).unwrap();
+            }
 
             // If this is not the last block
             if block_idx < block_list.len() - 1 {
                 // Compute the size of the gap between this block and the next
                 let next_block = block_list[block_idx + 1].borrow();
-                let next_start_addr = next_block.get_start_addr().unwrap().raw_ptr();
-                let gap_size = (next_start_addr as usize) - (end_addr as usize);
+                let next_start_addr = next_block.get_start_addr().unwrap();
+                let gap_size = next_start_addr.into_usize() - end_addr.into_usize();
 
                 // Log the size of the gap between the blocks if nonzero
                 if gap_size > 0 {
@@ -127,7 +130,7 @@ pub fn dump_disasm_addr_range(cb: &CodeBlock, start_addr: CodePtr, end_addr: Cod https://github.com/ruby/ruby/blob/trunk/yjit/src/disasm.rs#L130
     use std::io::Write;
 
     for (start_addr, end_addr) in cb.writable_addrs(start_addr, end_addr) {
-        let disasm = disasm_addr_range(cb, start_addr as *const u8, end_addr as *const u8);
+        let disasm = disasm_addr_range(cb, start_addr, end_addr);
         if disasm.len() > 0 {
             match dump_disasm {
                 DumpDisasm::Stdout => println!("{disasm}"),
@@ -141,7 +144,7 @@ pub fn dump_disasm_addr_range(cb: &CodeBlock, start_addr: CodePtr, end_addr: Cod https://github.com/ruby/ruby/blob/trunk/yjit/src/disasm.rs#L144
 }
 
 #[cfg(feature = "disasm")]
-pub fn disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, end_addr: *const u8) -> String {
+pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) -> String {
     let mut out = String::from("");
 
     // Initialize capstone
@@ -165,8 +168,8 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, end_addr: *const https://github.com/ruby/ruby/blob/trunk/yjit/src/disasm.rs#L168
     cs.set_skipdata(true).unwrap();
 
     // Disassemble the instructions
-    let code_size = end_addr as usize - start_addr as usize;
-    let code_slice = unsafe { std::slice::from_raw_parts(start_addr, code_size) };
+    let code_size = end_addr - start_addr;
+    let code_slice = unsafe { std::slice::from_raw_parts(start_addr as _, code_size) };
     let insns = cs.disasm_all(code_slice, start_addr as u64).unwrap();
 
     // For each instruction in this block
-- 
cgit v1.2.3


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]