1use crate::Spanned;
2use crate::parser::Span;
3use crate::r#type::common::{AttributeDirective, DataType};
4use crate::r#type::{FunctionSymbol, Immediate, VariableSymbol};
5use serde::Serialize;
6
7#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
9pub enum ModuleVariableDirective {
10 Tex {
15 directive: VariableDirective,
16 span: Span,
17 },
18 Shared {
19 directive: VariableDirective,
20 span: Span,
21 },
22 Global {
23 directive: VariableDirective,
24 span: Span,
25 },
26 Const {
27 directive: VariableDirective,
28 span: Span,
29 },
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
34pub struct VariableDirective {
35 pub attributes: Vec<AttributeDirective>,
40 pub modifiers: Vec<VariableModifier>,
42 pub ty: DataType,
44 pub name: VariableSymbol,
46 pub array_dims: Vec<Option<u64>>,
50 pub initializer: Option<GlobalInitializer>,
52 pub span: Span,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
57pub enum VariableModifier {
58 Vector { value: u32, span: Span },
59 Alignment { value: u32, span: Span },
60 Ptr { span: Span },
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
65pub enum ParameterDirective {
66 Register {
67 ty: DataType,
68 name: VariableSymbol,
69 span: Span,
70 },
71 Parameter {
72 align: Option<u32>,
73 ptr: bool,
74 space: Option<ParamStateSpace>,
75 ty: DataType,
76 name: VariableSymbol,
77 array: Vec<Option<u64>>,
78 span: Span,
79 },
80}
81
82#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
84pub enum ParamStateSpace {
85 Const { span: Span },
87 Global { span: Span },
89 Local { span: Span },
91 Shared { span: Span },
93}
94
95#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
97pub enum InitializerValue {
98 NumericLiteral { value: Immediate, span: Span },
99 FunctionSymbol { name: FunctionSymbol, span: Span },
100 StringLiteral { value: String, span: Span },
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Spanned, Serialize)]
105pub enum GlobalInitializer {
106 Scalar {
107 value: InitializerValue,
108 span: Span,
109 },
110 Aggregate {
111 values: Vec<GlobalInitializer>,
112 span: Span,
113 },
114}