cly_impl/
ast.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2use repc_impl::layout::{BuiltinType, FieldLayout, RecordKind, TypeLayout};
3
4pub struct State {
5    pub next_id: usize,
6}
7
8/// A type declaration.
9#[derive(Copy, Clone, Debug, Eq, PartialEq)]
10pub struct Span(pub usize, pub usize);
11
12/// A type declaration.
13#[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/// A type.
34#[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/// A struct or union.
45#[derive(Clone, Debug, Eq, PartialEq)]
46pub struct Record {
47    pub kind: RecordKind,
48    pub fields: Vec<RecordField>,
49}
50
51/// A struct or union field.
52#[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/// A type without its annotations.
66#[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/// An array.
86#[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}