| Crates.io | llvm-ir-analysis |
| lib.rs | llvm-ir-analysis |
| version | 0.4.0 |
| created_at | 2020-09-18 18:10:44.307075+00 |
| updated_at | 2024-02-27 12:06:23.038456+00 |
| description | Static analysis on LLVM IR |
| homepage | |
| repository | https://github.com/cdisselkoen/llvm-ir-analysis |
| max_upload_size | |
| id | 290191 |
| size | 342,337 |
llvm-ir-analysis: Static analysis of LLVM IRThis 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.
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.4.0", features = ["llvm-17"] }
Currently, the supported LLVM versions are llvm-9, llvm-10, llvm-11,
llvm-12, llvm-13, llvm-14, llvm-15, llvm-16, and llvm-17.
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.
(For convenience, this crate exports all of llvm-ir's interface as a module
llvm-ir.)
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.
llvm-ir-analysis supports the LLVM versions listed above under "Getting Started".
You should select the LLVM version corresponding to the version of the LLVM
library you are linking against (i.e., that is available on your system).
For more on compatibility with older LLVMs (and bitcode produced by older
LLVMs), see the llvm-ir README.
llvm-ir-analysis works on stable Rust. As of this writing, it requires Rust 1.71+.