2个版本

0.1.1 2022年1月4日
0.1.0 2021年2月11日

数据结构 中排名第 984

每月下载量 24
用于 jay-compositor

MIT/Apache

130KB
2.5K SLoC

repc

crates.io docs.rs

此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` 的类型和函数。

依赖关系