diff --git a/src/main.rs b/src/main.rs index fa72331280661116e71732e9b9bf014faffe2913..7758096ca27a0d4f1920d61b36f97d909ed5dfb9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,7 +80,7 @@ fn main() { // print full command for debugging purposes eprintln!("{:?}", c); - // spawn process and drive it completion while replicating its stderr in ours + // spawn process and drive it until completion while replicating its stderr in ours let mut p = c.spawn().unwrap(); let mut pstderr = p.stderr.take().unwrap(); let mut buf = [0; 1024]; @@ -102,6 +102,44 @@ fn main() { let out = parse_out(str::from_utf8(&output).unwrap()); println!("{:?}", out); + + use std::fmt::Write; + let mut s = String::new(); + write!( + &mut s, + "{}/{}{}.ll", + out.out_dir.expect("--out-dir missing"), + out.crate_name.expect("--crate-name missing"), + out.hash.expect("extra-filename missing") + ) + .expect("internal error"); + + println!("s: {}", s); + + let mut c = Command::new("opt"); + c.arg("-analyze").arg("-print-callgraph").arg(s); + + let mut p = c.spawn().unwrap(); + let mut pstderr = p.stderr.take().unwrap(); + let mut buf = [0; 1024]; + let mut output = vec![]; + + let stderr = io::stderr(); + let mut stderr = stderr.lock(); + loop { + if let Ok(n) = pstderr.read(&mut buf) { + stderr.write(&buf[..n]).unwrap(); + output.extend_from_slice(&buf[..n]); + } + + if let Some(status) = p.try_wait().unwrap() { + assert!(status.success()); + break; + } + } + + // -analyze -print-callgraph /home/pln/rust/stack-test/target/thumbv7m-none-eabi/release/deps/stack_test-87f399c0e9e1fb93.ll + // } else { // panic!("could not determine hash, please recompile in `--release` mode"); // }