MLIR  18.0.0git
SPIRVParsingUtils.h
Go to the documentation of this file.
1 //===- SPIRVParsingUtils.h - MLIR SPIR-V Dialect Parsing Utilities --------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 #include "mlir/IR/Builders.h"
11 #include "mlir/IR/OpDefinition.h"
13 
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/FunctionExtras.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringRef.h"
18 
19 #include <type_traits>
20 
21 namespace mlir::spirv {
22 namespace AttrNames {
23 // TODO: generate these strings using ODS.
24 inline constexpr char kAlignmentAttrName[] = "alignment";
25 inline constexpr char kBranchWeightAttrName[] = "branch_weights";
26 inline constexpr char kCallee[] = "callee";
27 inline constexpr char kClusterSize[] = "cluster_size";
28 inline constexpr char kControl[] = "control";
29 inline constexpr char kDefaultValueAttrName[] = "default_value";
30 inline constexpr char kEqualSemanticsAttrName[] = "equal_semantics";
31 inline constexpr char kExecutionScopeAttrName[] = "execution_scope";
32 inline constexpr char kFnNameAttrName[] = "fn";
33 inline constexpr char kGroupOperationAttrName[] = "group_operation";
34 inline constexpr char kIndicesAttrName[] = "indices";
35 inline constexpr char kInitializerAttrName[] = "initializer";
36 inline constexpr char kInterfaceAttrName[] = "interface";
37 inline constexpr char kKhrCooperativeMatrixLayoutAttrName[] = "matrix_layout";
38 inline constexpr char kMemoryAccessAttrName[] = "memory_access";
39 inline constexpr char kMemoryOperandAttrName[] = "memory_operand";
40 inline constexpr char kMemoryScopeAttrName[] = "memory_scope";
41 inline constexpr char kPackedVectorFormatAttrName[] = "format";
42 inline constexpr char kSemanticsAttrName[] = "semantics";
43 inline constexpr char kSourceAlignmentAttrName[] = "source_alignment";
44 inline constexpr char kSourceMemoryAccessAttrName[] = "source_memory_access";
45 inline constexpr char kSpecIdAttrName[] = "spec_id";
46 inline constexpr char kTypeAttrName[] = "type";
47 inline constexpr char kUnequalSemanticsAttrName[] = "unequal_semantics";
48 inline constexpr char kValueAttrName[] = "value";
49 inline constexpr char kValuesAttrName[] = "values";
50 inline constexpr char kCompositeSpecConstituentsName[] = "constituents";
51 } // namespace AttrNames
52 
53 template <typename Ty>
54 ArrayAttr getStrArrayAttrForEnumList(Builder &builder, ArrayRef<Ty> enumValues,
55  function_ref<StringRef(Ty)> stringifyFn) {
56  if (enumValues.empty()) {
57  return nullptr;
58  }
59  SmallVector<StringRef, 1> enumValStrs;
60  enumValStrs.reserve(enumValues.size());
61  for (auto val : enumValues) {
62  enumValStrs.emplace_back(stringifyFn(val));
63  }
64  return builder.getStrArrayAttr(enumValStrs);
65 }
66 
67 /// Parses the next keyword in `parser` as an enumerant of the given
68 /// `EnumClass`.
69 template <typename EnumClass, typename ParserType>
71 parseEnumKeywordAttr(EnumClass &value, ParserType &parser,
72  StringRef attrName = spirv::attributeName<EnumClass>()) {
73  StringRef keyword;
75  auto loc = parser.getCurrentLocation();
76  if (parser.parseKeyword(&keyword))
77  return failure();
78 
79  if (std::optional<EnumClass> attr =
80  spirv::symbolizeEnum<EnumClass>(keyword)) {
81  value = *attr;
82  return success();
83  }
84  return parser.emitError(loc, "invalid ")
85  << attrName << " attribute specification: " << keyword;
86 }
87 
88 /// Parses the next string attribute in `parser` as an enumerant of the given
89 /// `EnumClass`.
90 template <typename EnumClass>
92 parseEnumStrAttr(EnumClass &value, OpAsmParser &parser,
93  StringRef attrName = spirv::attributeName<EnumClass>()) {
94  static_assert(std::is_enum_v<EnumClass>);
95  Attribute attrVal;
96  NamedAttrList attr;
97  auto loc = parser.getCurrentLocation();
98  if (parser.parseAttribute(attrVal, parser.getBuilder().getNoneType(),
99  attrName, attr))
100  return failure();
101  if (!llvm::isa<StringAttr>(attrVal))
102  return parser.emitError(loc, "expected ")
103  << attrName << " attribute specified as string";
104  auto attrOptional = spirv::symbolizeEnum<EnumClass>(
105  llvm::cast<StringAttr>(attrVal).getValue());
106  if (!attrOptional)
107  return parser.emitError(loc, "invalid ")
108  << attrName << " attribute specification: " << attrVal;
109  value = *attrOptional;
110  return success();
111 }
112 
113 /// Parses the next string attribute in `parser` as an enumerant of the given
114 /// `EnumClass` and inserts the enumerant into `state` as an 32-bit integer
115 /// attribute with the enum class's name as attribute name.
116 template <typename EnumAttrClass,
117  typename EnumClass = typename EnumAttrClass::ValueType>
119 parseEnumStrAttr(EnumClass &value, OpAsmParser &parser, OperationState &state,
120  StringRef attrName = spirv::attributeName<EnumClass>()) {
121  static_assert(std::is_enum_v<EnumClass>);
122  if (parseEnumStrAttr(value, parser, attrName))
123  return failure();
124  state.addAttribute(attrName,
125  parser.getBuilder().getAttr<EnumAttrClass>(value));
126  return success();
127 }
128 
129 /// Parses the next keyword in `parser` as an enumerant of the given `EnumClass`
130 /// and inserts the enumerant into `state` as an 32-bit integer attribute with
131 /// the enum class's name as attribute name.
132 template <typename EnumAttrClass,
133  typename EnumClass = typename EnumAttrClass::ValueType>
135 parseEnumKeywordAttr(EnumClass &value, OpAsmParser &parser,
136  OperationState &state,
137  StringRef attrName = spirv::attributeName<EnumClass>()) {
138  static_assert(std::is_enum_v<EnumClass>);
139  if (parseEnumKeywordAttr(value, parser))
140  return failure();
141  state.addAttribute(attrName,
142  parser.getBuilder().getAttr<EnumAttrClass>(value));
143  return success();
144 }
145 
146 /// Parses optional memory access (a.k.a. memory operand) attributes attached to
147 /// a memory access operand/pointer. Specifically, parses the following syntax:
148 /// (`[` memory-access `]`)?
149 /// where:
150 /// memory-access ::= `"None"` | `"Volatile"` | `"Aligned", `
151 /// integer-literal | `"NonTemporal"`
153  OpAsmParser &parser, OperationState &state,
154  StringRef attrName = AttrNames::kMemoryAccessAttrName);
155 
157  OperationState &state);
158 
159 } // namespace mlir::spirv
virtual Builder & getBuilder() const =0
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
virtual InFlightDiagnostic emitError(SMLoc loc, const Twine &message={})=0
Emit a diagnostic at the specified location and return failure.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
virtual ParseResult parseAttribute(Attribute &result, Type type={})=0
Parse an arbitrary attribute of a given type and return it in result.
Attributes are known-constant values of operations.
Definition: Attributes.h:25
This class is a general helper class for creating context-global objects like types,...
Definition: Builders.h:50
NoneType getNoneType()
Definition: Builders.cpp:104
ArrayAttr getStrArrayAttr(ArrayRef< StringRef > values)
Definition: Builders.cpp:313
Attr getAttr(Args &&...args)
Get or construct an instance of the attribute Attr with provided arguments.
Definition: Builders.h:100
NamedAttrList is array of NamedAttributes that tracks whether it is sorted and does some basic work t...
The OpAsmParser has methods for interacting with the asm parser: parsing things from it,...
This class represents success/failure for parsing-like operations that find it important to chain tog...
constexpr char kFnNameAttrName[]
constexpr char kMemoryAccessAttrName[]
constexpr char kInitializerAttrName[]
constexpr char kCallee[]
constexpr char kPackedVectorFormatAttrName[]
constexpr char kSourceMemoryAccessAttrName[]
constexpr char kIndicesAttrName[]
constexpr char kExecutionScopeAttrName[]
constexpr char kEqualSemanticsAttrName[]
constexpr char kMemoryOperandAttrName[]
constexpr char kKhrCooperativeMatrixLayoutAttrName[]
constexpr char kSpecIdAttrName[]
constexpr char kValuesAttrName[]
constexpr char kValueAttrName[]
constexpr char kGroupOperationAttrName[]
constexpr char kBranchWeightAttrName[]
constexpr char kCompositeSpecConstituentsName[]
constexpr char kControl[]
constexpr char kSourceAlignmentAttrName[]
constexpr char kInterfaceAttrName[]
constexpr char kMemoryScopeAttrName[]
constexpr char kTypeAttrName[]
constexpr char kAlignmentAttrName[]
constexpr char kDefaultValueAttrName[]
constexpr char kClusterSize[]
constexpr char kSemanticsAttrName[]
constexpr char kUnequalSemanticsAttrName[]
ParseResult parseEnumStrAttr(EnumClass &value, OpAsmParser &parser, StringRef attrName=spirv::attributeName< EnumClass >())
Parses the next string attribute in parser as an enumerant of the given EnumClass.
ParseResult parseMemoryAccessAttributes(OpAsmParser &parser, OperationState &state, StringRef attrName)
Parses optional memory access (a.k.a.
ParseResult parseEnumKeywordAttr(EnumClass &value, ParserType &parser, StringRef attrName=spirv::attributeName< EnumClass >())
Parses the next keyword in parser as an enumerant of the given EnumClass.
ArrayAttr getStrArrayAttrForEnumList(Builder &builder, ArrayRef< Ty > enumValues, function_ref< StringRef(Ty)> stringifyFn)
ParseResult parseVariableDecorations(OpAsmParser &parser, OperationState &state)
LogicalResult failure(bool isFailure=true)
Utility function to generate a LogicalResult.
Definition: LogicalResult.h:62
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
Definition: LogicalResult.h:56
This represents an operation in an abstracted form, suitable for use with the builder APIs.