In this recipe, you will learn about LLVM's utility passes. As the name signifies, they are of much utility to users who want to understand certain things about LLVM that are not easy to understand by going through code. We will look into two utility passes that represent the CFG of a program.
You need to build and install LLVM, and install the graphviz
tool. You can download graphviz
from http://www.graphviz.org/Download.php, or install it from your machine's package manager, if it is in the list of available packages.
Perform the following steps:
if
blocks, it will create a new edge in the CFG:$ cat utility.ll declare double @foo() declare double @bar() define double @baz(double %x) { entry: %ifcond = fcmp one double %x, 0.000000e+00 br i1 %ifcond, label %then, label %else then: ; preds = %entry %calltmp = call double @foo() br label %ifcont else: ; preds = %entry %calltmp1 = call double @bar() br label %ifcont ifcont: ; preds = %else, %then %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ] ret double %iftmp }
view-cfg-only
pass to view the CFG of a function without the function body:$ opt –view-cfg-only utility.ll
dot
file formed using the graphviz
tool:view-dom
pass to view the Dominator tree of a function:$ opt –view-dom utility.ll
dot
file formed using the graphviz
tool:3.137.41.205