summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-08-25 16:55:43 -0400
committerMax Bernstein <tekknolagi@gmail.com>2025-08-26 14:26:20 -0700
commit53d2025330b40e03402c1fbaaafaf8711dd55da5 (patch)
treee3e7c74e489c355f1581fd95d69a5d709381fe8b
parenta1a244db7c6f5937edb58e4c7ccfb8e1eb617aec (diff)
ZJIT: Dump graphviz output to given filename
-rw-r--r--zjit/src/hir.rs7
-rw-r--r--zjit/src/options.rs20
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,