79 uint32_t getNextID() {
return nextID++; }
85 uint32_t getSpecConstID(StringRef constName)
const {
86 return specConstIDMap.lookup(constName);
89 uint32_t getVariableID(StringRef varName)
const {
90 return globalVarIDMap.lookup(varName);
93 uint32_t getFunctionID(StringRef fnName)
const {
94 return funcIDMap.lookup(fnName);
99 uint32_t getOrCreateFunctionID(StringRef fnName);
101 void processCapability();
103 void processDebugInfo();
105 LogicalResult processExtension();
116 void addLongCompositesCapability();
118 void processMemoryModel();
120 LogicalResult processConstantOp(spirv::ConstantOp op);
122 LogicalResult processCompositeConstructOp(spirv::CompositeConstructOp op);
124 LogicalResult processConstantCompositeReplicateOp(
125 spirv::EXTConstantCompositeReplicateOp op);
127 LogicalResult processSpecConstantOp(spirv::SpecConstantOp op);
130 processSpecConstantCompositeOp(spirv::SpecConstantCompositeOp op);
132 LogicalResult processSpecConstantCompositeReplicateOp(
133 spirv::EXTSpecConstantCompositeReplicateOp op);
136 processSpecConstantOperationOp(spirv::SpecConstantOperationOp op);
138 LogicalResult processGraphConstantARMOp(spirv::GraphConstantARMOp op);
144 LogicalResult processUndefOp(spirv::UndefOp op);
147 LogicalResult processName(uint32_t resultID, StringRef name);
150 LogicalResult processFuncOp(spirv::FuncOp op);
151 LogicalResult processFuncParameter(spirv::FuncOp op);
154 LogicalResult processGraphARMOp(spirv::GraphARMOp op);
157 LogicalResult processGraphEntryPointARMOp(spirv::GraphEntryPointARMOp op);
160 LogicalResult processGraphOutputsARMOp(spirv::GraphOutputsARMOp op);
162 LogicalResult processVariableOp(spirv::VariableOp op);
165 LogicalResult processGlobalVariableOp(spirv::GlobalVariableOp varOp);
168 LogicalResult processDecorationAttr(
Location loc, uint32_t resultID,
170 LogicalResult processDecoration(
Location loc, uint32_t resultID,
173 template <
typename DType>
174 LogicalResult processTypeDecoration(
Location loc, DType type,
176 return emitError(loc,
"unhandled decoration for type:") << type;
180 LogicalResult processMemberDecoration(
188 uint32_t getTypeID(
Type type)
const {
return typeIDMap.lookup(type); }
190 Type getVoidType() {
return mlirBuilder.getNoneType(); }
192 bool isVoidType(
Type type)
const {
return isa<NoneType>(type); }
196 bool isInterfaceStructPtrType(
Type type)
const;
200 LogicalResult processType(
Location loc,
Type type, uint32_t &typeID);
201 LogicalResult processTypeImpl(
Location loc,
Type type, uint32_t &typeID,
206 LogicalResult prepareBasicType(
Location loc,
Type type, uint32_t resultID,
207 spirv::Opcode &typeEnum,
209 bool &deferSerialization,
212 LogicalResult prepareFunctionType(
Location loc, FunctionType type,
213 spirv::Opcode &typeEnum,
216 LogicalResult prepareGraphType(
Location loc, GraphType type,
217 spirv::Opcode &typeEnum,
224 uint32_t getConstantID(
Attribute value)
const {
225 return constIDMap.lookup(value);
228 uint32_t getConstantCompositeReplicateID(
229 std::pair<Attribute, Type> valueTypePair)
const {
230 return constCompositeReplicateIDMap.lookup(valueTypePair);
252 uint32_t prepareDenseElementsConstant(
Location loc,
Type constType,
261 bool isSpec =
false);
264 bool isSpec =
false);
266 uint32_t prepareConstantInt(
Location loc, IntegerAttr intAttr,
267 bool isSpec =
false);
269 uint32_t getGraphConstantARMId(
Attribute value)
const {
270 return graphConstIDMap.lookup(value);
273 uint32_t prepareGraphConstantId(
Location loc,
Type graphConstType,
274 IntegerAttr intAttr);
276 uint32_t prepareConstantFp(
Location loc, FloatAttr floatAttr,
277 bool isSpec =
false);
282 uint32_t prepareConstantCompositeReplicate(
Location loc,
Type resultType,
290 uint32_t getBlockID(
Block *block)
const {
return blockIDMap.lookup(block); }
294 uint32_t getOrCreateBlockID(
Block *block);
306 LogicalResult processBlock(
Block *block,
bool omitLabel =
false,
310 LogicalResult emitPhiForBlockArguments(
Block *block);
312 LogicalResult processSelectionOp(spirv::SelectionOp selectionOp);
314 LogicalResult processLoopOp(spirv::LoopOp loopOp);
316 LogicalResult processBranchConditionalOp(spirv::BranchConditionalOp);
318 LogicalResult processBranchOp(spirv::BranchOp branchOp);
320 LogicalResult processSwitchOp(spirv::SwitchOp switchOp);
326 LogicalResult encodeExtensionInstruction(
Operation *op,
327 StringRef extensionSetName,
331 uint32_t getValueID(
Value val)
const {
return valueIDMap.lookup(val); }
333 LogicalResult processAddressOfOp(spirv::AddressOfOp addressOfOp);
335 LogicalResult processReferenceOfOp(spirv::ReferenceOfOp referenceOfOp);
338 LogicalResult processOperation(
Operation *op);
345 LogicalResult processOpWithoutGrammarAttr(
Operation *op, StringRef extInstSet,
352 LogicalResult dispatchToAutogenSerialization(
Operation *op);
357 template <
typename OpTy>
358 LogicalResult processOp(OpTy op) {
359 return op.emitError(
"unsupported op serialization");
368 LogicalResult emitDecoration(uint32_t
target, spirv::Decoration decoration,
373 LogicalResult emitDecorationId(uint32_t
target, spirv::Decoration decoration,
382 spirv::ModuleOp module;
394 bool lastProcessedWasMergeInst =
false;
403 bool longCompositesEmitted =
false;
426 struct RecursiveStructPointerInfo {
427 uint32_t pointerTypeID;
428 spirv::StorageClass storageClass;
433 recursiveStructInfos;
465 llvm::StringMap<uint32_t> specConstIDMap;
471 llvm::StringMap<uint32_t> globalVarIDMap;
474 llvm::StringMap<uint32_t> funcIDMap;
486 llvm::StringMap<uint32_t> extendedInstSetIDMap;