7个不稳定版本
| 0.4.0 | 2024年2月27日 |
|---|---|
| 0.3.2 | 2023年5月31日 |
| 0.3.1 | 2021年10月21日 |
| 0.3.0 | 2021年8月27日 |
| 0.1.0 | 2020年9月18日 |
#200 在 编程语言
64KB
826 代码行
llvm-ir-analysis: LLVM IR的静态分析
此crate提供对LLVM IR的几个简单静态分析。特别是,此crate在llvm-ir Module 或 Function 上计算以下内容:
上述分析由FunctionAnalysis、ModuleAnalysis 和 CrossModuleAnalysis 对象提供,这些对象按需懒加载每个结构并缓存结果。
入门指南
llvm-ir-analysis 在 crates.io 上,因此您只需将其作为依赖项添加到您的 Cargo.toml 中,选择与您想要的LLVM版本对应的特性
[dependencies]
llvm-ir-analysis = { version = "0.4.0", features = ["llvm-17"] }
目前,支持的LLVM版本有 llvm-9、llvm-10、llvm-11、llvm-12、llvm-13、llvm-14、llvm-15、llvm-16 和 llvm-17。相应的LLVM库必须在您的系统上可用;有关更多详细信息和方法,请参阅llvm-sys README。
您还需要一些LLVM IR进行分析,形式为llvm-ir Module 或 Function。这可以轻松地从LLVM位码文件生成;有关更详细的说明,请参阅llvm-ir的README。(为了方便起见,此crate将llvm-ir的所有接口导出为模块llvm-ir。)
一旦你有了 Module,你可以构建一个 ModuleAnalysis 对象
let module = Module::from_bc_path(...)?;
let analysis = ModuleAnalysis::new(&module);
你可以直接从 ModuleAnalysis 对象中获取模块级别的分析,例如 analysis.call_graph()。你也可以使用 analysis.fn_analysis("my_func") 获取函数级别的分析,例如控制流图;或者你可以直接使用 FunctionAnalysis::new() 构建一个 FunctionAnalysis。
最后,你可以通过从 CrossModuleAnalysis 开始而不是仅仅一个 ModuleAnalysis 来获取多模块分析,例如跨模块调用图。此外,CrossModuleAnalysis 还为每个包含的模块提供了一个 ModuleAnalysis,这些分析也是按需懒加载的。
兼容性
llvm-ir-analysis 支持以下 "入门" 中列出的 LLVM 版本。你应该选择与你要链接的 LLVM 库版本相对应的 LLVM 版本(即系统中可用的版本)。有关与较旧 LLVM 的兼容性(以及较旧 LLVM 生成的位代码)的更多信息,请参阅 llvm-ir README。
llvm-ir-analysis 在稳定 Rust 上工作。截至本文撰写时,它需要 Rust 1.71+。
依赖项
~3MB
~44K SLoC