diff --git a/doc/HACKING b/doc/HACKING
index 7ee5cf846b0b3dc7d9c28121d1d0560f55d26db3..e92d675a43d8885321203d94084fd3a3fb4cd849 100644
--- a/doc/HACKING
+++ b/doc/HACKING
@@ -265,6 +265,23 @@ Here are some basic instructions
    * "opreport -l that_dir/*"
  - Profit
 
+Generating and analyzing a callgraph
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Run ./scripts/maint/generate_callgraph.sh .  This will generate a
+   bunch of files in a new ./callgraph directory.
+
+2. Run ./scripts/maint/analyze_callgraph.py callgraph/src/*/* .  This
+   will do a lot of graph operations and then dump out a new
+   "callgraph.pkl" file, containing data in Python's "pickle" format.
+
+3. Run ./scripts/maint/display_callgraph.py .  It will display:
+    - the number of functions reachable from each function.
+    - all strongly-connnected components in the Tor callgraph
+    - the largest bottlenecks in the largest SCC in the Tor callgraph.
+
+Note that currently the callgraph generator can't detect calls that pass
+through function pointers.
 
 Coding conventions
 ------------------
diff --git a/scripts/maint/generate_callgraph.sh b/scripts/maint/generate_callgraph.sh
index 97330cc949093a66cea754862c49a1a06cada31b..c6b33c0aea21dc014c83e980e62aed641d8eae54 100755
--- a/scripts/maint/generate_callgraph.sh
+++ b/scripts/maint/generate_callgraph.sh
@@ -8,6 +8,7 @@ mkdir -p callgraph/src/or
 mkdir -p callgraph/src/tools
 
 for fn in $C_FILES; do
+  echo $fn
   clang $CFLAGS  -S -emit-llvm -fno-inline -o - $fn  | \
-    opt -analyze -print-callgraph 2> "callgraph/${fn}allgraph"
+    opt -analyze -print-callgraph >/dev/null 2> "callgraph/${fn}allgraph"
 done