6 个版本
0.3.0 | 2023年8月14日 |
---|---|
0.2.1 | 2023年8月14日 |
0.1.3 | 2023年8月1日 |
#103 in #llvm
每月55次下载
85KB
2K SLoC
tblgen
本软件包提供了 TableGen 的原始绑定和安全的包装,TableGen 是 LLVM 项目使用的领域特定语言。
本软件包的目的是使用户能够在 Rust 中开发自定义 TableGen 后端。因此,本软件包的主要用途是从 TableGen 描述文件生成 Rust 代码的过程宏。
文档
请参阅https://danacus.gitlab.io/tblgen-rs/tblgen/上的文档。
支持的 LLVM 版本
要使用此软件包,需要安装 LLVM。本软件包仅旨在支持 LLVM 的最新版本。目前支持的 LLVM 版本是 17.x.x。
可以使用环境变量`1TABLEGEN_170_PREFIX`来指定 LLVM 安装的自定义目录。
lib.rs
:
本软件包提供了 TableGen 的原始绑定和安全的包装,TableGen 是 LLVM 项目使用的领域特定语言。
本软件包的目的是使用户能够在 Rust 中开发自定义 TableGen 后端。因此,本软件包的主要用途是从 TableGen 描述文件生成 Rust 代码的过程宏。
安全性
本软件包的目标是完全安全。
支持的 LLVM 版本
要使用此软件包,需要安装 LLVM。目前支持的 LLVM 版本是 16.x.x(默认)和 17.x.x。可以使用功能标志(llvm16-0 或 llvm17-0)选择不同的 LLVM 版本。
可以使用环境变量`TABLEGEN_VERSION_PREFIX`来指定 LLVM 安装的自定义目录。
示例
以下示例解析提供为 &str
的简单 TableGen 代码,并遍历在此文件中定义的类和定义。
use tblgen::{TableGenParser, RecordKeeper};
let keeper: RecordKeeper = TableGenParser::new()
.add_source(
r#"
class A;
def D: A;
"#,
)?
.parse()?;
assert_eq!(keeper.classes().next().unwrap().0, Ok("A"));
assert_eq!(keeper.defs().next().unwrap().0, Ok("D"));
assert_eq!(keeper.all_derived_definitions("A").next().unwrap().name(), Ok("D"));
通过添加包含路径,可以包含外部 TableGen 文件。
use tblgen::{TableGenParser, RecordKeeper};
use std::path::Path;
let keeper: RecordKeeper = TableGenParser::new()
.add_source(r#"include "mlir/IR/OpBase.td""#)?
.add_include_path(&format!("{}/include", std::env::var("TABLEGEN_170_PREFIX")?))
.parse()?;
let i32_def = keeper.def("I32").expect("has I32 def");
assert!(i32_def.subclass_of("I"));
assert_eq!(i32_def.int_value("bitwidth"), Ok(32));
API 稳定性
LLVM 不提供稳定 C API 用于 TableGen,本软件包提供的 C API 也不稳定。此外,安全包装器也不提供稳定的接口,因为本软件包仍在早期开发阶段。
依赖关系
~0.3–2.7MB
~55K SLoC