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