|
""" |
|
A collection of analysis utilities |
|
""" |
|
|
|
from ctypes import POINTER, c_char_p, c_int |
|
|
|
from llvmlite.binding import ffi |
|
from llvmlite.binding.module import parse_assembly |
|
|
|
|
|
def get_function_cfg(func, show_inst=True): |
|
"""Return a string of the control-flow graph of the function in DOT |
|
format. If the input `func` is not a materialized function, the module |
|
containing the function is parsed to create an actual LLVM module. |
|
The `show_inst` flag controls whether the instructions of each block |
|
are printed. |
|
""" |
|
assert func is not None |
|
from llvmlite import ir |
|
if isinstance(func, ir.Function): |
|
mod = parse_assembly(str(func.module)) |
|
func = mod.get_function(func.name) |
|
|
|
|
|
with ffi.OutputString() as dotstr: |
|
ffi.lib.LLVMPY_WriteCFG(func, dotstr, show_inst) |
|
return str(dotstr) |
|
|
|
|
|
def view_dot_graph(graph, filename=None, view=False): |
|
""" |
|
View the given DOT source. If view is True, the image is rendered |
|
and viewed by the default application in the system. The file path of |
|
the output is returned. If view is False, a graphviz.Source object is |
|
returned. If view is False and the environment is in a IPython session, |
|
an IPython image object is returned and can be displayed inline in the |
|
notebook. |
|
|
|
This function requires the graphviz package. |
|
|
|
Args |
|
---- |
|
- graph [str]: a DOT source code |
|
- filename [str]: optional. if given and view is True, this specifies |
|
the file path for the rendered output to write to. |
|
- view [bool]: if True, opens the rendered output file. |
|
|
|
""" |
|
|
|
import graphviz as gv |
|
|
|
src = gv.Source(graph) |
|
if view: |
|
|
|
return src.render(filename, view=view) |
|
else: |
|
|
|
try: |
|
__IPYTHON__ |
|
except NameError: |
|
return src |
|
else: |
|
import IPython.display as display |
|
format = 'svg' |
|
return display.SVG(data=src.pipe(format)) |
|
|
|
|
|
|
|
ffi.lib.LLVMPY_WriteCFG.argtypes = [ffi.LLVMValueRef, POINTER(c_char_p), c_int] |
|
|