5 unstable releases
0.3.1 | Oct 21, 2021 |
---|---|
0.3.0 | Aug 27, 2021 |
0.2.1 | Oct 27, 2020 |
0.2.0 | Oct 22, 2020 |
0.1.0 | Sep 18, 2020 |
#102 in Caching
52 downloads per month
Used in llvm-ir-taint
62KB
667 lines
llvm-ir-analysis
: Static analysis of LLVM IR
This crate provides several simple static analyses of LLVM IR.
In particular, this crate computes the following on an llvm-ir
Module
or Function
:
The above analyses are provided by the FunctionAnalysis
,
ModuleAnalysis
, and CrossModuleAnalysis
objects, which lazily compute
each of these structures on demand and cache the results.
Getting started
llvm-ir-analysis
is on crates.io,
so you can simply add it as a dependency in your Cargo.toml
, selecting the
feature corresponding to the LLVM version you want:
[dependencies]
llvm-ir-analysis = { version = "0.3.1", features = ["llvm-12"] }
Currently, the supported LLVM versions are llvm-8
, llvm-9
, llvm-10
,
llvm-11
, llvm-12
, and llvm-13
.
The corresponding LLVM library must be available on your system; see the
llvm-sys
README for more details and instructions.
You'll also need some LLVM IR to analyze, in the form of an llvm-ir
Module
or Function
.
This can be easily generated from an LLVM bitcode file; for more detailed
instructions, see llvm-ir
's README.
Once you have a Module
, you can construct a ModuleAnalysis
object:
let module = Module::from_bc_path(...)?;
let analysis = ModuleAnalysis::new(&module);
You can get Module
-wide analyses such as analysis.call_graph()
directly from the ModuleAnalysis
object.
You can also get Function
-level analyses such as the control-flow
graph using analysis.fn_analysis("my_func")
; or you can construct
a FunctionAnalysis
directly with FunctionAnalysis::new()
.
Finally, you can get multi-module analyses such as a cross-module
call graph by starting with a CrossModuleAnalysis
instead of just
a ModuleAnalysis
. The CrossModuleAnalysis
also provides a
ModuleAnalysis
for each of the included modules, again computed
lazily on demand.
Dependencies
~1.5MB
~35K SLoC