@@ -124,6 +124,7 @@ match {
124124 ".popc",
125125 ".pragma",
126126 ".pred",
127+ ".ptr",
127128 ".r",
128129 ".red",
129130 ".reg",
@@ -566,6 +567,13 @@ KernelArguments: Vec<ast::VariableDeclaration<&'input str>> = {
566567 "(" <args:Comma<VariableDeclarationEntry>> ")" => args
567568};
568569
570+ // https://docs.nvidia.com/cuda/parallel-thread-execution/#kernel-function-parameter-attributes
571+ KernelParameterAttribute: ast::KernelParameterAttribute = {
572+ ".ptr" <state_space:StateSpaceSpecifier?> => {
573+ ast::KernelParameterAttribute::Pointer(state_space.unwrap_or(ast::StateSpace::Generic))
574+ }
575+ };
576+
569577FnArguments: Vec<ast::VariableDeclaration<&'input str>> = {
570578 "(" <args:Comma<VariableDeclarationFunc>> ")" => args
571579};
@@ -662,21 +670,21 @@ InitializerNoAdd: ast::Initializer<&'input str> = {
662670}
663671
664672VariableDeclarationFunc: ast::VariableDeclaration<&'input str> = {
665- <var:VariableDeclarationBase > =>
673+ <var:VariableDeclaration > =>
666674 validate_variable_declaration_func(var, errors)
667675}
668676
669677VariableDeclarationEntry: ast::VariableDeclaration<&'input str> = {
670- <var:VariableDeclarationBase > =>
678+ <var:VariableDeclaration > =>
671679 validate_variable_declaration_entry(var, errors)
672680}
673681
674682VariableDeclarationProto: ast::VariableDeclaration<&'input str> = {
675- <var:VariableDeclarationBase > =>
683+ <var:VariableDeclaration > =>
676684 validate_variable_declaration_proto(var, errors)
677685}
678686
679- VariableDeclarationBase : ast::VariableDeclaration<&'input str> = {
687+ VariableDeclaration : ast::VariableDeclaration<&'input str> = {
680688 <variable:VariableDeclarationBegin> <name:ExtendedIDOrBlank> <dims:ArrayDimensions?> => {
681689 let mut variable = variable.clone();
682690 variable.name = name;
@@ -710,16 +718,54 @@ MultiVariableDefinition: Vec<ast::MultiVariableDefinition<&'input str>> = {
710718}
711719
712720VariableDeclarationBegin: ast::VariableDeclaration<&'input str> = {
713- <state_space:StateSpaceSpecifier> <align:Align?> <type_:AnyType> => {
714- ast::VariableDeclaration {
721+ <state_space:StateSpaceSpecifier> <align:Align> <v_len:VectorPrefix?> <type_:ScalarType> => {
722+ let mut variable = ast::VariableDeclaration {
723+ align: Some(align),
724+ type_: ast::Type::Scalar(type_),
725+ state_space,
726+ name: ""
727+ };
728+ if let Some(v_len) = v_len {
729+ variable.type_ = ast::Type::Vector(type_, v_len)
730+ }
731+ variable
732+ },
733+ <state_space:StateSpaceSpecifier> <v_len:VectorPrefix?> <type_:ScalarType> <attr:KernelParameterAttribute?> <align:Align?> => {
734+ let mut variable = ast::VariableDeclaration {
715735 align,
716- type_,
736+ type_: ast::Type::Scalar(type_),
737+ state_space,
738+ name: ""
739+ };
740+ if let Some(v_len) = v_len {
741+ variable.type_ = ast::Type::Vector(type_, v_len)
742+ }
743+ if let Some(attr) = attr {
744+ variable.type_ = match attr {
745+ ast::KernelParameterAttribute::Pointer(state_space) => {
746+ ast::Type::Pointer(type_, state_space)
747+ }
748+ };
749+ }
750+ variable
751+ },
752+ <state_space:StateSpaceSpecifier> <var:VariableDeclarationBeginNonScalarTypeWithAlign> => {
753+ ast::VariableDeclaration {
754+ align: var.1,
755+ type_: var.0,
717756 state_space,
718757 name: ""
719758 }
720759 }
721760}
722761
762+ VariableDeclarationBeginNonScalarTypeWithAlign: (ast::Type, Option<u32>) = {
763+ <align:Align> ".texref" => (ast::Type::Texref, Some(align)),
764+ ".texref" <align:Align?> => (ast::Type::Texref, align),
765+ <align:Align> ".surfref" => (ast::Type::Surfref, Some(align)),
766+ ".surfref" <align:Align?> => (ast::Type::Surfref, align)
767+ }
768+
723769VariableDefinitionOnce: (&'input str, Option<Either<u32, Vec<u32>>>, Option<ast::Initializer<&'input str>>) = {
724770 <name:ExtendedIDOrBlank> <suffix:VariableDefinitionSuffix?> <init:VariableDefinitionInitializer?> => (name, suffix, init)
725771}
@@ -734,13 +780,6 @@ VariableDefinitionInitializer: ast::Initializer<&'input str> = {
734780 "=" <init:Initializer> => init
735781}
736782
737- AnyType: ast::Type = {
738- ".texref" => ast::Type::Texref,
739- ".surfref" => ast::Type::Surfref,
740- <v_len:VectorPrefix> <type_:ScalarType> => ast::Type::Vector(type_, v_len),
741- <type_:ScalarType> => ast::Type::Scalar(type_),
742- }
743-
744783#[inline]
745784SizedScalarType: ast::ScalarType = {
746785 ".b8" => ast::ScalarType::B8,
@@ -2780,58 +2819,6 @@ AnyBitType: ast::ScalarType = {
27802819 ".b64" => ast::ScalarType::B64,
27812820};
27822821
2783- VariableScalarUnitialized<T>: (Option<u32>, T, &'input str) = {
2784- <align:Align?> <type_:T> <name:ExtendedID> => {
2785- (align, type_, name)
2786- }
2787- }
2788-
2789- VariableScalar<T>: (Option<u32>, T, &'input str, Vec<u8>) = {
2790- <align:Align?> <type_:T> <name:ExtendedID> <init:VariableInitalizer?> => {
2791- let initializer = init.map(ast::ImmediateValue::to_bytes).unwrap_or(Vec::new());
2792- (align, type_, name, initializer)
2793- }
2794- }
2795-
2796- VariableInitalizer: ast::ImmediateValue = {
2797- "=" <v:ImmediateValue> => v
2798- }
2799-
2800- VariableVector<T>: (Option<u32>, u8, T, &'input str) = {
2801- <align:Align?> <v_len:VectorPrefix> <type_:T> <name:ExtendedID> => {
2802- (align, v_len, type_, name)
2803- }
2804- }
2805-
2806- // empty dimensions [0] means it's a pointer
2807- VariableArrayOrPointer<T>: (Option<u32>, T, &'input str, ast::ArrayOrPointer) = {
2808- <align:Align?> <typ:SizedScalarType> <name:ExtendedID> <dims:ArrayDimensions> <init:ArrayInitializer?> => {
2809- let mut dims = dims;
2810- let array_init = match init {
2811- Some(init) => {
2812- let init_vec = match init.to_vec(typ, &mut dims) {
2813- Err(error) => {
2814- errors.push(ParseError::User { error });
2815- Vec::new()
2816- }
2817- Ok(x) => x
2818- };
2819- ast::ArrayOrPointer::Array { dimensions: dims, init: init_vec }
2820- }
2821- None => {
2822- if dims.len() > 1 && dims.contains(&0) {
2823- errors.push(ParseError::User { error: ast::PtxError::ZeroDimensionArray });
2824- }
2825- match &*dims {
2826- [0] => ast::ArrayOrPointer::Pointer,
2827- _ => ast::ArrayOrPointer::Array { dimensions: dims, init: Vec::new() }
2828- }
2829- }
2830- };
2831- (align, typ, name, array_init)
2832- }
2833- }
2834-
28352822// [0] and [] are treated the same
28362823ArrayDimensions: Vec<u32> = {
28372824 ArrayEmptyDimension => vec![0u32],
0 commit comments