80 uint32_t getNextID() {
return nextID++; }
86 uint32_t getSpecConstID(StringRef constName)
const {
87 return specConstIDMap.lookup(constName);
90 uint32_t getVariableID(StringRef varName)
const {
91 return globalVarIDMap.lookup(varName);
94 uint32_t getFunctionID(StringRef fnName)
const {
95 return funcIDMap.lookup(fnName);
100 uint32_t getOrCreateFunctionID(StringRef fnName);
102 void processCapability();
104 void processDebugInfo();
106 LogicalResult processExtension();
117 void addLongCompositesCapability();
119 void processMemoryModel();
121 LogicalResult processConstantOp(spirv::ConstantOp op);
123 LogicalResult processCompositeConstructOp(spirv::CompositeConstructOp op);
125 LogicalResult processConstantCompositeReplicateOp(
126 spirv::EXTConstantCompositeReplicateOp op);
128 LogicalResult processSpecConstantOp(spirv::SpecConstantOp op);
131 processSpecConstantCompositeOp(spirv::SpecConstantCompositeOp op);
133 LogicalResult processSpecConstantCompositeReplicateOp(
134 spirv::EXTSpecConstantCompositeReplicateOp op);
137 processSpecConstantOperationOp(spirv::SpecConstantOperationOp op);
139 LogicalResult processGraphConstantARMOp(spirv::GraphConstantARMOp op);
145 LogicalResult processUndefOp(spirv::UndefOp op);
148 LogicalResult processName(uint32_t resultID, StringRef name);
151 LogicalResult processFuncOp(spirv::FuncOp op);
152 LogicalResult processFuncParameter(spirv::FuncOp op);
155 LogicalResult processGraphARMOp(spirv::GraphARMOp op);
158 LogicalResult processGraphEntryPointARMOp(spirv::GraphEntryPointARMOp op);
161 LogicalResult processGraphOutputsARMOp(spirv::GraphOutputsARMOp op);
163 LogicalResult processVariableOp(spirv::VariableOp op);
166 LogicalResult processGlobalVariableOp(spirv::GlobalVariableOp varOp);
169 LogicalResult processDecorationAttr(
Location loc, uint32_t resultID,
171 LogicalResult processDecoration(
Location loc, uint32_t resultID,
174 template <
typename DType>
175 LogicalResult processTypeDecoration(
Location loc, DType type,
177 return emitError(loc,
"unhandled decoration for type:") << type;
181 LogicalResult processMemberDecoration(
189 uint32_t getTypeID(
Type type)
const {
return typeIDMap.lookup(type); }
191 Type getVoidType() {
return mlirBuilder.getNoneType(); }
193 bool isVoidType(
Type type)
const {
return isa<NoneType>(type); }
197 bool isInterfaceStructPtrType(
Type type)
const;
201 LogicalResult processType(
Location loc,
Type type, uint32_t &typeID);
202 LogicalResult processTypeImpl(
Location loc,
Type type, uint32_t &typeID,
207 LogicalResult prepareBasicType(
Location loc,
Type type, uint32_t resultID,
208 spirv::Opcode &typeEnum,
210 bool &deferSerialization,
213 LogicalResult prepareFunctionType(
Location loc, FunctionType type,
214 spirv::Opcode &typeEnum,
217 LogicalResult prepareGraphType(
Location loc, GraphType type,
218 spirv::Opcode &typeEnum,
225 uint32_t getConstantID(
Attribute value)
const {
226 return constIDMap.lookup(value);
229 uint32_t getConstantCompositeReplicateID(
230 std::pair<Attribute, Type> valueTypePair)
const {
231 return constCompositeReplicateIDMap.lookup(valueTypePair);
253 uint32_t prepareDenseElementsConstant(
Location loc,
Type constType,
262 bool isSpec =
false);
265 bool isSpec =
false);
267 uint32_t prepareConstantInt(
Location loc, IntegerAttr intAttr,
268 bool isSpec =
false);
270 uint32_t getGraphConstantARMId(
Attribute value)
const {
271 return graphConstIDMap.lookup(value);
274 uint32_t prepareGraphConstantId(
Location loc,
Type graphConstType,
275 IntegerAttr intAttr);
277 uint32_t prepareConstantFp(
Location loc, FloatAttr floatAttr,
278 bool isSpec =
false);
283 uint32_t prepareConstantCompositeReplicate(
Location loc,
Type resultType,
291 uint32_t getBlockID(
Block *block)
const {
return blockIDMap.lookup(block); }
295 uint32_t getOrCreateBlockID(
Block *block);
307 LogicalResult processBlock(
Block *block,
bool omitLabel =
false,
311 LogicalResult emitPhiForBlockArguments(
Block *block);
313 LogicalResult processSelectionOp(spirv::SelectionOp selectionOp);
315 LogicalResult processLoopOp(spirv::LoopOp loopOp);
317 LogicalResult processBranchConditionalOp(spirv::BranchConditionalOp);
319 LogicalResult processBranchOp(spirv::BranchOp branchOp);
321 LogicalResult processSwitchOp(spirv::SwitchOp switchOp);
327 LogicalResult encodeExtensionInstruction(
Operation *op,
328 StringRef extensionSetName,
332 LogicalResult encodeExtensionInstruction(
Operation *op,
333 StringRef extensionSetName,
338 uint32_t encodeDebugStringInst(StringRef str);
340 LogicalResult encodeDebugInfoGraphInst(spirv::GraphARMOp op,
341 uint32_t &debugGraphID);
343 LogicalResult encodeDebugInfoOperationInst(uint32_t debugGraphID,
346 LogicalResult encodeDebugInfoTensorInst(
Value tensor);
348 uint32_t getValueID(
Value val)
const {
return valueIDMap.lookup(val); }
350 LogicalResult processAddressOfOp(spirv::AddressOfOp addressOfOp);
352 LogicalResult processReferenceOfOp(spirv::ReferenceOfOp referenceOfOp);
355 LogicalResult processOperation(
Operation *op);
362 LogicalResult processOpWithoutGrammarAttr(
Operation *op, StringRef extInstSet,
369 LogicalResult dispatchToAutogenSerialization(
Operation *op);
374 template <
typename OpTy>
375 LogicalResult processOp(OpTy op) {
376 return op.emitError(
"unsupported op serialization");
388 LogicalResult emitDecoration(uint32_t
target, spirv::Decoration decoration,
393 LogicalResult emitDecorationId(uint32_t
target, spirv::Decoration decoration,
402 spirv::ModuleOp module;
414 bool lastProcessedWasMergeInst =
false;
421 llvm::StringMap<uint32_t> debugStringIDMap;
426 bool longCompositesEmitted =
false;
450 struct RecursiveStructPointerInfo {
451 uint32_t pointerTypeID;
452 spirv::StorageClass storageClass;
457 recursiveStructInfos;
489 llvm::StringMap<uint32_t> specConstIDMap;
495 llvm::StringMap<uint32_t> globalVarIDMap;
498 llvm::StringMap<uint32_t> funcIDMap;
510 llvm::StringMap<uint32_t> extendedInstSetIDMap;