1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// SPDX-License-Identifier: MIT OR Apache-2.0
//! This crate contains APIs that allow you to calculate the layout of C types.
//!
//! # Example
//!
//! Consider the C type
//!
//! ```c
//! struct __attribute__((packed)) X {
//! char c;
//! int i:2 __attribute__((aligned(16)));
//! };
//! ```
//!
//! You can compute the layout of this type as follows:
//!
//! ```rust
//! # use repc::layout::{Type, Annotation, Record, RecordKind, RecordField, TypeVariant, BuiltinType, TypeLayout, FieldLayout};
//! # use repc::{compute_layout, Target};
//! 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);
//! ```
pub use compute_layout;
pub use ;
pub use ;