2个版本
0.1.1 | 2022年1月4日 |
---|---|
0.1.0 | 2021年2月11日 |
在 数据结构 中排名第 984
每月下载量 24
用于 jay-compositor
130KB
2.5K SLoC
repc
此crate包含用于计算C数据结构布局的API。
示例
请参阅 http://docs.rs/repc。
支持的目标
此crate支持Rust支持的 所有目标。
测试
此crate通过将其输出与目标C编译器的输出进行比较进行测试。有关更多详细信息,请参阅 ../tests。
许可证
此crate可根据以下任一许可证进行许可:
- Apache许可证,版本2.0
- MIT许可证
由您选择。
lib.rs
:
此crate包含允许您计算C类型布局的API。
示例
考虑以下C类型
struct __attribute__((packed)) X {
char c;
int i:2 __attribute__((aligned(16)));
};
您可以按以下方式计算此类型的布局
let ty = Type::<()> {
layout: (),
annotations: vec![Annotation::AttrPacked],
variant: TypeVariant::Record(Record {
kind: RecordKind::Struct,
fields: vec![
RecordField {
layout: None,
annotations: vec![],
named: true,
bit_width: None,
ty: Type {
layout: (),
annotations: vec![],
variant: TypeVariant::Builtin(BuiltinType::Char),
},
},
RecordField {
layout: None,
annotations: vec![Annotation::Align(Some(128))],
named: true,
bit_width: Some(2),
ty: Type {
layout: (),
annotations: vec![],
variant: TypeVariant::Builtin(BuiltinType::Int),
},
},
]
}),
};
let layout = compute_layout(Target::X86_64UnknownLinuxGnu, &ty).unwrap();
assert_eq!(layout.layout, TypeLayout {
size_bits: 256,
field_alignment_bits: 128,
pointer_alignment_bits: 128,
required_alignment_bits: 8,
});
let fields = match &layout.variant {
TypeVariant::Record(r) => &r.fields,
_ => unreachable!(),
};
assert_eq!(fields[0].layout.unwrap(), FieldLayout {
offset_bits: 0,
size_bits: 8,
});
assert_eq!(fields[1].layout.unwrap(), FieldLayout {
offset_bits: 128,
size_bits: 2,
});
println!("{:#?}", layout);
描述C类型结构和布局的类型。
这些类型可能使用一个 Layout
类型参数。`Layout
` 的两种主要实现是 `TypeLayout
` 和 `()
。`Type<TypeLayout>
` 可以通过调用 `Type::<TypeLayout>::into()
` 转换为 `Type<()>
`。允许您遍历一个 `Type
` 的类型和函数。