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");
     // }