summaryrefslogtreecommitdiff
path: root/yjit/src/disasm.rs
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2022-10-17 10:47:22 -0700
committerGitHub <noreply@github.com>2022-10-17 10:47:22 -0700
commitf11765aef0cafb6fadf98216c94507f2390a0a70 (patch)
tree027106774a88e5f9d4e6f220535cf7a05ca33181 /yjit/src/disasm.rs
parent64c52c428285e7930aed62740cc9c54ee483178e (diff)
downloadruby-f11765aef0cafb6fadf98216c94507f2390a0a70.tar.gz
YJIT: Allow --yjit-dump-disasm to dump into a file (#6552)
* YJIT: Allow --yjit-dump-disasm to dump into a file * YJIT: Move IO implementation to disasm.rs * YJIT: More consistent naming
Diffstat (limited to 'yjit/src/disasm.rs')
-rw-r--r--yjit/src/disasm.rs22
1 files changed, 20 insertions, 2 deletions
diff --git a/yjit/src/disasm.rs b/yjit/src/disasm.rs
index 9e45dffd60..21ab6b5507 100644
--- a/yjit/src/disasm.rs
+++ b/yjit/src/disasm.rs
@@ -2,6 +2,7 @@ use crate::core::*;
use crate::cruby::*;
use crate::yjit::yjit_enabled_p;
use crate::asm::CodeBlock;
+use crate::options::DumpDisasm;
use std::fmt::Write;
@@ -95,7 +96,7 @@ pub fn disasm_iseq_insn_range(iseq: IseqPtr, start_idx: u32, end_idx: u32) -> St
writeln!(out, "== {:=<60}", block_ident).unwrap();
// Disassemble the instructions
- out.push_str(&disasm_addr_range(global_cb, start_addr, code_size));
+ out.push_str(&disasm_addr_range(global_cb, start_addr, (start_addr as usize + code_size) as *const u8));
// If this is not the last block
if block_idx < block_list.len() - 1 {
@@ -115,9 +116,25 @@ pub fn disasm_iseq_insn_range(iseq: IseqPtr, start_idx: u32, end_idx: u32) -> St
return out;
}
+#[cfg(feature = "disasm")]
+pub fn dump_disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, end_addr: *const u8, dump_disasm: &DumpDisasm) {
+ use std::fs::File;
+ use std::io::Write;
+
+ let disasm = disasm_addr_range(cb, start_addr, end_addr);
+ if disasm.len() > 0 {
+ match dump_disasm {
+ DumpDisasm::Stdout => println!("{disasm}"),
+ DumpDisasm::File(path) => {
+ let mut f = File::options().append(true).create(true).open(path).unwrap();
+ f.write_all(disasm.as_bytes()).unwrap();
+ }
+ };
+ }
+}
#[cfg(feature = "disasm")]
-pub fn disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, code_size: usize) -> String {
+pub fn disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, end_addr: *const u8) -> String {
let mut out = String::from("");
// Initialize capstone
@@ -141,6 +158,7 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: *const u8, code_size: usize
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 insns = cs.disasm_all(code_slice, start_addr as u64).unwrap();