diff options
Diffstat (limited to 'zjit/src/disasm.rs')
| -rw-r--r-- | zjit/src/disasm.rs | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/zjit/src/disasm.rs b/zjit/src/disasm.rs index 09864ef649..36bb90cff7 100644 --- a/zjit/src/disasm.rs +++ b/zjit/src/disasm.rs @@ -1,7 +1,24 @@ -use crate::asm::CodeBlock; +use crate::{asm::CodeBlock, options::DumpDisasm, virtualmem::CodePtr}; -pub const BOLD_BEGIN: &str = "\x1b[1m"; -pub const BOLD_END: &str = "\x1b[22m"; +/// Dump disassembly for a range in a [CodeBlock]. +pub fn dump_disasm_addr_range(cb: &CodeBlock, start_addr: CodePtr, end_addr: CodePtr, dump_disasm: &DumpDisasm) { + let disasm = disasm_addr_range(cb, start_addr.raw_ptr(cb) as usize, end_addr.raw_ptr(cb) as usize); + if disasm.is_empty() { + return; + } + + match dump_disasm { + DumpDisasm::Stdout => println!("{disasm}"), + DumpDisasm::File(fd) => { + use std::io::Write; + use std::os::unix::io::{FromRawFd, IntoRawFd}; + + let mut file = unsafe { std::fs::File::from_raw_fd(*fd) }; + file.write_all(disasm.as_bytes()).unwrap(); + let _ = file.into_raw_fd(); + } + } +} pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) -> String { use std::fmt::Write; @@ -36,16 +53,20 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) -> let start_addr = 0; let insns = cs.disasm_all(code_slice, start_addr as u64).unwrap(); + let colors = crate::ttycolors::get_colors(); + let bold_begin = colors.bold_begin; + let bold_end = colors.bold_end; + // For each instruction in this block for insn in insns.as_ref() { // Comments for this block if let Some(comment_list) = cb.comments_at(insn.address() as usize) { for comment in comment_list { - writeln!(&mut out, " {BOLD_BEGIN}# {comment}{BOLD_END}").unwrap(); + writeln!(&mut out, " {bold_begin}# {comment}{bold_end}").unwrap(); } } writeln!(&mut out, " {}", format!("{insn}").trim()).unwrap(); } - return out; + out } |
