From f11765aef0cafb6fadf98216c94507f2390a0a70 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 17 Oct 2022 10:47:22 -0700 Subject: 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 --- yjit/src/disasm.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'yjit/src/disasm.rs') 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(); -- cgit v1.2.1