30个版本 (10个重大更新)
0.11.5 | 2024年6月26日 |
---|---|
0.11.1 | 2024年5月4日 |
0.10.2 | 2024年2月24日 |
0.9.0 | 2023年12月19日 |
0.4.2 | 2023年7月15日 |
在过程宏中排名第1641
每月下载量1,188次
在2个crate中使用(通过melior)
89KB
2.5K SLoC
Melior
Melior是Rust的MLIR绑定。它旨在提供简单、安全且完整的API,用于MLIR,并通过Rust类型系统表示的合理所有权模型。
此crate是对MLIR C API的包装。
示例
构建一个用于整数加法函数
use melior::{
Context,
dialect::{arith, DialectRegistry, func},
ir::{*, attribute::{StringAttribute, TypeAttribute}, r#type::FunctionType},
utility::register_all_dialects,
};
let registry = DialectRegistry::new();
register_all_dialects(®istry);
let context = Context::new();
context.append_dialect_registry(®istry);
context.load_all_available_dialects();
let location = Location::unknown(&context);
let module = Module::new(location);
let index_type = Type::index(&context);
module.body().append_operation(func::func(
&context,
StringAttribute::new(&context, "add"),
TypeAttribute::new(FunctionType::new(&context, &[index_type, index_type], &[index_type]).into()),
{
let block = Block::new(&[(index_type, location), (index_type, location)]);
let sum = block.append_operation(arith::addi(
block.argument(0).unwrap().into(),
block.argument(1).unwrap().into(),
location
));
block.append_operation(func::r#return( &[sum.result(0).unwrap().into()], location));
let region = Region::new();
region.append_block(block);
region
},
&[],
location,
));
assert!(module.as_operation().verify());
安装
cargo add melior
依赖项
LLVM/MLIR 17 需要安装到您的系统上。在Linux和macOS上,您可以通过Homebrew进行安装。
brew install llvm@17
文档
在GitHub Pages上。
贡献
欢迎贡献!但是,Melior仍然处于alpha阶段,MLIR C API也是如此。请注意,API是不稳定的,未来可能会有破坏性更改。
技术说明
- 我们始终使用
&T
表示MLIR对象,而不是&mut T
,以减轻在Rust中表示MLIR C API的松散所有权模型复杂性的需要。 - 仅支持UTF-8作为字符串编码。
- 大多数Rust和C之间的字符串转换都内部缓存。
命名约定
Mlir<X>
对象如果没有析构函数,则命名为<X>
。否则,对于拥有对象,它们命名为<X>
,对于借用引用,则命名为<X>Ref
。mlir<X>Create
函数被重命名为<X>::new
。mlir<X>Get<Y>
函数被重命名为以下名称- 如果生成的对象引用了
&self
,它们被命名为<X>::as_<Y>
。 - 否则,它们仅被命名为
<X>::<Y>
,并且可能包含如位置索引之类的参数。
- 如果生成的对象引用了
安全性
尽管 Melior 旨在实现完全类型安全,但当前 API 的某些部分并不具备。
- 访问属于未在上下文中加载的方言的操作、类型或属性可能导致运行时错误或最坏情况下的段错误。
- 修复计划:在创建上下文时默认加载所有方言,并为高级用户提供不安全的上下文构造函数。
- 从可能转移参数所有权的函数返回的 IR 对象引用可能在以后被取消有效性。
- 这是因为我们需要借用
&self
而不是&mut self
来返回此类引用。 - 例如
Region::append_block()
- 修复计划:对这些对象使用动态检查,如
RefCell
。
- 这是因为我们需要借用
参考
- C 语言的原始绑定生成依赖于 femtomc/mlir-sys。
- 整体设计灵感来源于 TheDan64/inkwell。
许可证
依赖项
~6–9.5MB
~180K SLoC