ptx_parser/type/
variable.rs

1use crate::r#type::common::{AddressSpace, AttributeDirective, DataLinkage, DataType};
2
3/// Module-level declarations that reserve storage in a specific address space.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum ModuleVariableDirective {
6    Tex(VariableDirective),
7    Shared(VariableDirective),
8    Global(VariableDirective),
9    Const(VariableDirective),
10}
11
12/// Module-scoped variable declaration shared by `.tex`, `.shared`, `.global`, and `.const`.
13#[derive(Debug, Clone, PartialEq, Eq)]
14pub struct VariableDirective {
15    pub address_space: Option<AddressSpace>,
16    pub attributes: Vec<AttributeDirective>,
17    pub ty: Option<DataType>,
18    pub modifiers: Vec<VariableModifier>,
19    pub name: String,
20    pub array: Vec<Option<u64>>,
21    pub initializer: Option<GlobalInitializer>,
22    pub raw: String,
23}
24
25/// Qualifiers left on module variable declarations (e.g. `.v4`).
26#[derive(Debug, Clone, PartialEq, Eq)]
27pub enum VariableModifier {
28    Vector(u32),
29    Alignment(u32),
30    Linkage(DataLinkage),
31    Ptr,
32}
33
34//// Numeric literal kinds allowed inside initialisers.
35#[derive(Debug, Clone, Copy, PartialEq, Eq)]
36pub enum NumericLiteral {
37    Signed(i64),
38    Unsigned(u64),
39    Float64(u64),
40    Float32(u32),
41}
42
43// Values that can appear in global initialiser lists.
44#[derive(Debug, Clone, PartialEq, Eq)]
45pub enum InitializerValue {
46    Numeric(NumericLiteral),
47    Symbol(String),
48    StringLiteral(String),
49}
50
51/// Structured representation of a global variable initialiser.
52#[derive(Debug, Clone, PartialEq, Eq)]
53pub enum GlobalInitializer {
54    Scalar(InitializerValue),
55    Aggregate(Vec<GlobalInitializer>),
56}