1use repc_impl::layout::{BuiltinType, FieldLayout, RecordKind, TypeLayout};
3
4pub struct State {
5 pub next_id: usize,
6}
7
8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
10pub struct Span(pub usize, pub usize);
11
12#[derive(Clone, Debug, Eq, PartialEq)]
14pub struct Declaration {
15 pub name: String,
16 pub span: Span,
17 pub ty: DeclarationType,
18}
19
20#[derive(Clone, Debug, Eq, PartialEq)]
21pub enum DeclarationType {
22 Type(Type),
23 Const(Expr),
24}
25
26#[derive(Clone, Debug, Eq, PartialEq)]
27pub enum Annotation {
28 PragmaPack(Box<Expr>),
29 AttrPacked,
30 Aligned(Option<Box<Expr>>),
31}
32
33#[derive(Clone, Debug, Eq, PartialEq)]
35pub struct Type {
36 pub id: usize,
37 pub lo: usize,
38 pub layout: Option<TypeLayout>,
39 pub layout_hi: usize,
40 pub annotations: Vec<Annotation>,
41 pub variant: TypeVariant,
42}
43
44#[derive(Clone, Debug, Eq, PartialEq)]
46pub struct Record {
47 pub kind: RecordKind,
48 pub fields: Vec<RecordField>,
49}
50
51#[derive(Clone, Debug, Eq, PartialEq)]
53pub struct RecordField {
54 pub parent_id: usize,
55 pub pos: Option<usize>,
56 pub lo: usize,
57 pub layout: Option<FieldLayout>,
58 pub layout_hi: usize,
59 pub annotations: Vec<Annotation>,
60 pub name: Option<String>,
61 pub bit_width: Option<Box<Expr>>,
62 pub ty: Type,
63}
64
65#[derive(Clone, Debug, Eq, PartialEq)]
67pub enum TypeVariant {
68 Builtin(BuiltinType),
69 Record(Record),
70 Typedef(Box<Type>),
71 Array(Array),
72 Opaque(OpaqueTypeLayout),
73 Name(String, Span),
74 Enum(Vec<Expr>),
75}
76
77#[derive(Clone, Debug, Eq, PartialEq)]
78pub struct OpaqueTypeLayout {
79 pub size_bits: Box<Expr>,
80 pub pointer_alignment_bits: Box<Expr>,
81 pub field_alignment_bits: Box<Expr>,
82 pub required_alignment_bits: Box<Expr>,
83}
84
85#[derive(Clone, Debug, Eq, PartialEq)]
87pub struct Array {
88 pub element_type: Box<Type>,
89 pub num_elements: Option<Box<Expr>>,
90}
91
92#[derive(Clone, Debug, Eq, PartialEq)]
93pub struct Expr {
94 pub span: Span,
95 pub value: Option<i128>,
96 pub value_hi: usize,
97 pub ty: ExprType,
98}
99
100#[derive(Clone, Debug, Eq, PartialEq)]
101pub enum ExprType {
102 Lit(i128),
103 Unary(UnaryExprType, Box<Expr>),
104 Binary(BinaryExprType, Box<Expr>, Box<Expr>),
105 TypeExpr(TypeExprType, Box<Type>),
106 Builtin(BuiltinExpr),
107 Name(String),
108 Offsetof(OffsetofType, Type, Vec<Index>),
109}
110
111#[derive(Copy, Clone, Debug, Eq, PartialEq)]
112pub enum BuiltinExpr {
113 BitsPerByte,
114}
115
116#[derive(Copy, Clone, Debug, Eq, PartialEq)]
117pub enum UnaryExprType {
118 Neg,
119 Not,
120}
121
122#[derive(Copy, Clone, Debug, Eq, PartialEq)]
123pub enum TypeExprType {
124 Sizeof,
125 SizeofBits,
126}
127
128#[derive(Copy, Clone, Debug, Eq, PartialEq)]
129pub enum BinaryExprType {
130 Add,
131 Sub,
132 Mul,
133 Div,
134 Mod,
135 LogicalAnd,
136 LogicalOr,
137 Eq,
138 NotEq,
139 Lt,
140 Le,
141 Gt,
142 Ge,
143}
144
145#[derive(Clone, Debug, Eq, PartialEq)]
146pub struct Index {
147 pub span: Span,
148 pub ty: IndexType,
149}
150
151#[derive(Clone, Debug, Eq, PartialEq)]
152pub enum IndexType {
153 Field(String),
154 Array(Box<Expr>),
155}
156
157#[derive(Copy, Clone, Debug, Eq, PartialEq)]
158pub enum OffsetofType {
159 Bytes,
160 Bits,
161}