diff options
| author | Max Bernstein <ruby@bernsteinbear.com> | 2025-08-25 16:55:43 -0400 |
|---|---|---|
| committer | Max Bernstein <tekknolagi@gmail.com> | 2025-08-26 14:26:20 -0700 |
| commit | 53d2025330b40e03402c1fbaaafaf8711dd55da5 (patch) | |
| tree | e3e7c74e489c355f1581fd95d69a5d709381fe8b | |
| parent | a1a244db7c6f5937edb58e4c7ccfb8e1eb617aec (diff) | |
ZJIT: Dump graphviz output to given filename
| -rw-r--r-- | zjit/src/hir.rs | 7 | ||||
| -rw-r--r-- | zjit/src/options.rs | 20 |
2 files changed, 22 insertions, 5 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 4125341d98..f69605c43d 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2244,8 +2244,11 @@ impl Function { None => {}, } - if get_option!(dump_hir_graphviz) { - println!("{}", FunctionGraphvizPrinter::new(&self)); + if let Some(filename) = &get_option!(dump_hir_graphviz) { + use std::fs::OpenOptions; + use std::io::Write; + let mut file = OpenOptions::new().append(true).open(filename).unwrap(); + writeln!(file, "{}", FunctionGraphvizPrinter::new(&self)).unwrap(); } } diff --git a/zjit/src/options.rs b/zjit/src/options.rs index 0c35aad0a4..c2c9eea085 100644 --- a/zjit/src/options.rs +++ b/zjit/src/options.rs @@ -44,7 +44,8 @@ pub struct Options { /// Dump High-level IR after optimization, right before codegen. pub dump_hir_opt: Option<DumpHIR>, - pub dump_hir_graphviz: bool, + /// Dump High-level IR to the given file in Graphviz format after optimization + pub dump_hir_graphviz: Option<std::path::PathBuf>, /// Dump low-level IR pub dump_lir: bool, @@ -72,7 +73,7 @@ impl Default for Options { disable_hir_opt: false, dump_hir_init: None, dump_hir_opt: None, - dump_hir_graphviz: false, + dump_hir_graphviz: None, dump_lir: false, dump_disasm: false, perf: false, @@ -220,12 +221,25 @@ fn parse_option(str_ptr: *const std::os::raw::c_char) -> Option<()> { ("dump-hir" | "dump-hir-opt", "") => options.dump_hir_opt = Some(DumpHIR::WithoutSnapshot), ("dump-hir" | "dump-hir-opt", "all") => options.dump_hir_opt = Some(DumpHIR::All), ("dump-hir" | "dump-hir-opt", "debug") => options.dump_hir_opt = Some(DumpHIR::Debug), - ("dump-hir-graphviz", "") => options.dump_hir_graphviz = true, ("dump-hir-init", "") => options.dump_hir_init = Some(DumpHIR::WithoutSnapshot), ("dump-hir-init", "all") => options.dump_hir_init = Some(DumpHIR::All), ("dump-hir-init", "debug") => options.dump_hir_init = Some(DumpHIR::Debug), + ("dump-hir-graphviz", "") => options.dump_hir_graphviz = Some("/dev/stderr".into()), + ("dump-hir-graphviz", _) => { + // Truncate the file if it exists + std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(opt_val) + .map_err(|e| eprintln!("Failed to open file '{}': {}", opt_val, e)) + .ok(); + let opt_val = std::fs::canonicalize(opt_val).unwrap_or_else(|_| opt_val.into()); + options.dump_hir_graphviz = Some(opt_val); + } + ("dump-lir", "") => options.dump_lir = true, ("dump-disasm", "") => options.dump_disasm = true, |
