Visualizing your rust code using graphviz

1 minute read

In a previous post I mentioned that the rust compiler allows you to output interesting intermediate languages/formats in a number of different ways.
hir, mir and even flowgraphs! In this post I will be giving a brief overview of the flowgraph format and also instructions on how to generate images from your code.

In my previous post I gave an introduction and overview of the process your source code goes through during compilation. The post also included some ways of inspecting the intermediate representations of the stages.

I found an interesting debug flag to print out a dot compatible representation of your code, which essentially is a flowgraph of your code and wanted to investigate visualizing this. dot graphs can be visualized using something like graphviz.

Visualizing your code as a flowgraph

Compiling to flowgraph IR

To compile your source file to a flowgraph output you can adapt the following command:

rustc +nightly -Zunpretty="flowgraph=main" src/main.rs

This command will generate a flowgraph out starting at the symbol main and then prints the output the stdout, to get a graph file out of it you can pipe it to one easily. Let’s assume I piped it to main.dot.

To render this out you need to have graphviz installed and on your PATH. You can then use dot to render this to an image:

dot -Tpng main.dot -o"main.png"

This will produce the final image.

cargo-inspect now has functionality to render to an image when specifying flowgraph as the unpretty mode. This got added in PR-27!

cargo inspect --unpretty=flowgraph=[symbol]  

Important: If you are piping through powershell you might have to check if the output file is UTF8, I’ve found that the dot does not work with UTF16 encoded text files.

Conclusions

Generating visual graphs of the flow in a program can help to build a mental model of the program, except I haven’t really found a use case for it using the output produced by rust. I suppose the main reason this exists is to debug the compiler and the code it produces. Also generating flowgraphs of big nested code does not prove to be very useful, either dot can’t render it big enough. Or the image is just way too long and hard to inspect.