Coverage Report

Created: 2025-11-19 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/shaderc/third_party/spirv-tools/source/operand.cpp
Line
Count
Source
1
// Copyright (c) 2015-2020 The Khronos Group Inc.
2
// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights
3
// reserved.
4
//
5
// Licensed under the Apache License, Version 2.0 (the "License");
6
// you may not use this file except in compliance with the License.
7
// You may obtain a copy of the License at
8
//
9
//     http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing, software
12
// distributed under the License is distributed on an "AS IS" BASIS,
13
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
// See the License for the specific language governing permissions and
15
// limitations under the License.
16
17
#include "source/operand.h"
18
19
#include <assert.h>
20
#include <string.h>
21
22
#include <algorithm>
23
24
#include "DebugInfo.h"
25
#include "OpenCLDebugInfo100.h"
26
#include "source/macro.h"
27
#include "source/opcode.h"
28
#include "source/spirv_constant.h"
29
#include "source/table2.h"
30
#include "spirv-tools/libspirv.h"
31
32
12
const char* spvOperandTypeStr(spv_operand_type_t type) {
33
12
  switch (type) {
34
0
    case SPV_OPERAND_TYPE_ID:
35
0
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
36
0
      return "ID";
37
0
    case SPV_OPERAND_TYPE_TYPE_ID:
38
0
      return "type ID";
39
0
    case SPV_OPERAND_TYPE_RESULT_ID:
40
0
      return "result ID";
41
0
    case SPV_OPERAND_TYPE_LITERAL_INTEGER:
42
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
43
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
44
0
    case SPV_OPERAND_TYPE_LITERAL_FLOAT:
45
0
      return "literal number";
46
0
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
47
0
      return "possibly multi-word literal integer";
48
0
    case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
49
0
      return "possibly multi-word literal number";
50
0
    case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
51
0
      return "extension instruction number";
52
0
    case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
53
0
      return "OpSpecConstantOp opcode";
54
0
    case SPV_OPERAND_TYPE_LITERAL_STRING:
55
0
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
56
0
      return "literal string";
57
0
    case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
58
0
      return "source language";
59
0
    case SPV_OPERAND_TYPE_EXECUTION_MODEL:
60
0
      return "execution model";
61
0
    case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
62
0
      return "addressing model";
63
0
    case SPV_OPERAND_TYPE_MEMORY_MODEL:
64
0
      return "memory model";
65
0
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
66
0
      return "execution mode";
67
0
    case SPV_OPERAND_TYPE_STORAGE_CLASS:
68
0
      return "storage class";
69
0
    case SPV_OPERAND_TYPE_DIMENSIONALITY:
70
0
      return "dimensionality";
71
0
    case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
72
0
      return "sampler addressing mode";
73
0
    case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
74
0
      return "sampler filter mode";
75
0
    case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
76
0
      return "image format";
77
0
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
78
0
      return "floating-point fast math mode";
79
0
    case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
80
0
      return "floating-point rounding mode";
81
0
    case SPV_OPERAND_TYPE_LINKAGE_TYPE:
82
0
      return "linkage type";
83
0
    case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
84
0
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
85
0
      return "access qualifier";
86
0
    case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
87
0
      return "function parameter attribute";
88
4
    case SPV_OPERAND_TYPE_DECORATION:
89
4
      return "decoration";
90
8
    case SPV_OPERAND_TYPE_BUILT_IN:
91
8
      return "built-in";
92
0
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
93
0
      return "selection control";
94
0
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
95
0
      return "loop control";
96
0
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
97
0
      return "function control";
98
0
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
99
0
      return "memory semantics ID";
100
0
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
101
0
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
102
0
      return "memory access";
103
0
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
104
0
      return "shading rate";
105
0
    case SPV_OPERAND_TYPE_SCOPE_ID:
106
0
      return "scope ID";
107
0
    case SPV_OPERAND_TYPE_GROUP_OPERATION:
108
0
      return "group operation";
109
0
    case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
110
0
      return "kernel enqeue flags";
111
0
    case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
112
0
      return "kernel profiling info";
113
0
    case SPV_OPERAND_TYPE_CAPABILITY:
114
0
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
115
0
      return "capability";
116
0
    case SPV_OPERAND_TYPE_RAY_FLAGS:
117
0
      return "ray flags";
118
0
    case SPV_OPERAND_TYPE_RAY_QUERY_INTERSECTION:
119
0
      return "ray query intersection";
120
0
    case SPV_OPERAND_TYPE_RAY_QUERY_COMMITTED_INTERSECTION_TYPE:
121
0
      return "ray query committed intersection type";
122
0
    case SPV_OPERAND_TYPE_RAY_QUERY_CANDIDATE_INTERSECTION_TYPE:
123
0
      return "ray query candidate intersection type";
124
0
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
125
0
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
126
0
      return "packed vector format";
127
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
128
0
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
129
0
      return "cooperative matrix operands";
130
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
131
0
      return "cooperative matrix layout";
132
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
133
0
      return "cooperative matrix use";
134
0
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
135
0
      return "tensor clamp mode";
136
0
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
137
0
      return "cooperative matrix reduce";
138
0
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
139
0
      return "tensor addressing operands";
140
0
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
141
0
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
142
0
      return "matrix multiply accumulate operands";
143
0
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
144
0
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
145
0
      return "tensor operands";
146
0
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
147
0
      return "initialization mode qualifier";
148
0
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
149
0
      return "host access qualifier";
150
0
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
151
0
      return "load cache control";
152
0
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
153
0
      return "store cache control";
154
0
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
155
0
      return "named maximum number of registers";
156
0
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
157
0
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
158
0
      return "raw access chain operands";
159
0
    case SPV_OPERAND_TYPE_IMAGE:
160
0
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
161
0
      return "image";
162
0
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
163
0
      return "context-insensitive value";
164
0
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
165
0
      return "debug info flags";
166
0
    case SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
167
0
      return "debug base type encoding";
168
0
    case SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE:
169
0
      return "debug composite type";
170
0
    case SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER:
171
0
      return "debug type qualifier";
172
0
    case SPV_OPERAND_TYPE_DEBUG_OPERATION:
173
0
      return "debug operation";
174
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
175
0
      return "OpenCL.DebugInfo.100 debug info flags";
176
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
177
0
      return "OpenCL.DebugInfo.100 debug base type encoding";
178
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_COMPOSITE_TYPE:
179
0
      return "OpenCL.DebugInfo.100 debug composite type";
180
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_TYPE_QUALIFIER:
181
0
      return "OpenCL.DebugInfo.100 debug type qualifier";
182
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION:
183
0
      return "OpenCL.DebugInfo.100 debug operation";
184
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_IMPORTED_ENTITY:
185
0
      return "OpenCL.DebugInfo.100 debug imported entity";
186
0
    case SPV_OPERAND_TYPE_FPENCODING:
187
0
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
188
0
      return "FP encoding";
189
190
    // The next values are for values returned from an instruction, not actually
191
    // an operand.  So the specific strings don't matter.  But let's add them
192
    // for completeness and ease of testing.
193
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
194
0
      return "image channel order";
195
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
196
0
      return "image channel data type";
197
198
0
    case SPV_OPERAND_TYPE_FPDENORM_MODE:
199
0
      return "FP denorm mode";
200
0
    case SPV_OPERAND_TYPE_FPOPERATION_MODE:
201
0
      return "FP operation mode";
202
0
    case SPV_OPERAND_TYPE_QUANTIZATION_MODES:
203
0
      return "quantization mode";
204
0
    case SPV_OPERAND_TYPE_OVERFLOW_MODES:
205
0
      return "overflow mode";
206
0
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
207
0
      return "cooperative vector matrix layout";
208
0
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
209
0
      return "component type";
210
211
0
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
212
0
      return "kernel property flags";
213
0
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
214
0
      return "NonSemantic.Shader.DebugInfo.100 debug build identifier flags";
215
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
216
0
      return "NonSemantic.Shader.DebugInfo.100 debug base type attribute "
217
0
             "encoding";
218
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
219
0
      return "NonSemantic.Shader.DebugInfo.100 debug composite type";
220
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
221
0
      return "NonSemantic.Shader.DebugInfo.100 debug imported entity";
222
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
223
0
      return "NonSemantic.Shader.DebugInfo.100 debug info flags";
224
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
225
0
      return "NonSemantic.Shader.DebugInfo.100 debug operation";
226
0
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
227
0
      return "NonSemantic.Shader.DebugInfo.100 debug type qualifier";
228
229
0
    case SPV_OPERAND_TYPE_NONE:
230
0
      return "NONE";
231
0
    default:
232
0
      break;
233
12
  }
234
0
  return "unknown";
235
12
}
236
237
void spvPushOperandTypes(const spv_operand_type_t* types,
238
0
                         spv_operand_pattern_t* pattern) {
239
  // Push them on in backward order.
240
0
  const spv_operand_type_t* endTypes;
241
0
  for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes) {
242
0
  }
243
244
0
  while (endTypes-- != types) {
245
0
    pattern->push_back(*endTypes);
246
0
  }
247
0
}
248
249
void spvPushOperandTypes(
250
    const spvtools::utils::Span<const spv_operand_type_t>& types,
251
1.18M
    spv_operand_pattern_t* pattern) {
252
  // Push them on in backward order.
253
1.18M
  auto n = types.size();
254
4.16M
  for (auto i = 0u; i < n; i++) {
255
2.97M
    auto type = types[n - 1 - i];
256
    // Check against the NONE type, in case the tables have them.
257
    // This might be cleaned up.
258
2.97M
    if (type != SPV_OPERAND_TYPE_NONE) {
259
2.97M
      pattern->push_back(type);
260
2.97M
    }
261
2.97M
  }
262
1.18M
}
263
264
void spvPushOperandTypesForMask(const spv_operand_type_t type,
265
                                const uint32_t mask,
266
0
                                spv_operand_pattern_t* pattern) {
267
  // Scan from highest bits to lowest bits because we will append in LIFO
268
  // fashion, and we need the operands for lower order bits to be consumed first
269
0
  for (uint32_t candidate_bit = (1u << 31u); candidate_bit;
270
0
       candidate_bit >>= 1) {
271
0
    if (candidate_bit & mask) {
272
0
      const spvtools::OperandDesc* entry = nullptr;
273
0
      if (SPV_SUCCESS == spvtools::LookupOperand(type, candidate_bit, &entry)) {
274
0
        spvPushOperandTypes(entry->operands(), pattern);
275
0
      }
276
0
    }
277
0
  }
278
0
}
279
280
109
bool spvOperandIsConcrete(spv_operand_type_t type) {
281
109
  if (spvIsIdType(type) || spvOperandIsConcreteMask(type)) {
282
0
    return true;
283
0
  }
284
109
  switch (type) {
285
0
    case SPV_OPERAND_TYPE_LITERAL_INTEGER:
286
0
    case SPV_OPERAND_TYPE_LITERAL_FLOAT:
287
0
    case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
288
0
    case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
289
0
    case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
290
0
    case SPV_OPERAND_TYPE_LITERAL_STRING:
291
0
    case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
292
0
    case SPV_OPERAND_TYPE_EXECUTION_MODEL:
293
0
    case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
294
0
    case SPV_OPERAND_TYPE_MEMORY_MODEL:
295
0
    case SPV_OPERAND_TYPE_EXECUTION_MODE:
296
0
    case SPV_OPERAND_TYPE_STORAGE_CLASS:
297
0
    case SPV_OPERAND_TYPE_DIMENSIONALITY:
298
0
    case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
299
0
    case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
300
0
    case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
301
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
302
0
    case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
303
0
    case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
304
0
    case SPV_OPERAND_TYPE_LINKAGE_TYPE:
305
0
    case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
306
0
    case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
307
0
    case SPV_OPERAND_TYPE_DECORATION:
308
0
    case SPV_OPERAND_TYPE_BUILT_IN:
309
0
    case SPV_OPERAND_TYPE_GROUP_OPERATION:
310
0
    case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
311
0
    case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
312
0
    case SPV_OPERAND_TYPE_CAPABILITY:
313
0
    case SPV_OPERAND_TYPE_RAY_FLAGS:
314
0
    case SPV_OPERAND_TYPE_RAY_QUERY_INTERSECTION:
315
0
    case SPV_OPERAND_TYPE_RAY_QUERY_COMMITTED_INTERSECTION_TYPE:
316
0
    case SPV_OPERAND_TYPE_RAY_QUERY_CANDIDATE_INTERSECTION_TYPE:
317
0
    case SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
318
0
    case SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE:
319
0
    case SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER:
320
0
    case SPV_OPERAND_TYPE_DEBUG_OPERATION:
321
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
322
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_COMPOSITE_TYPE:
323
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_TYPE_QUALIFIER:
324
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION:
325
0
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_IMPORTED_ENTITY:
326
0
    case SPV_OPERAND_TYPE_FPDENORM_MODE:
327
0
    case SPV_OPERAND_TYPE_FPOPERATION_MODE:
328
0
    case SPV_OPERAND_TYPE_QUANTIZATION_MODES:
329
0
    case SPV_OPERAND_TYPE_OVERFLOW_MODES:
330
109
    case SPV_OPERAND_TYPE_PACKED_VECTOR_FORMAT:
331
109
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_LAYOUT:
332
109
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_USE:
333
109
    case SPV_OPERAND_TYPE_INITIALIZATION_MODE_QUALIFIER:
334
109
    case SPV_OPERAND_TYPE_HOST_ACCESS_QUALIFIER:
335
109
    case SPV_OPERAND_TYPE_LOAD_CACHE_CONTROL:
336
109
    case SPV_OPERAND_TYPE_STORE_CACHE_CONTROL:
337
109
    case SPV_OPERAND_TYPE_NAMED_MAXIMUM_NUMBER_OF_REGISTERS:
338
109
    case SPV_OPERAND_TYPE_FPENCODING:
339
109
    case SPV_OPERAND_TYPE_TENSOR_CLAMP_MODE:
340
109
    case SPV_OPERAND_TYPE_COOPERATIVE_VECTOR_MATRIX_LAYOUT:
341
109
    case SPV_OPERAND_TYPE_COMPONENT_TYPE:
342
109
    case SPV_OPERAND_TYPE_KERNEL_PROPERTY_FLAGS:
343
109
    case SPV_OPERAND_TYPE_SHDEBUG100_BUILD_IDENTIFIER_FLAGS:
344
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING:
345
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_COMPOSITE_TYPE:
346
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_IMPORTED_ENTITY:
347
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_INFO_FLAGS:
348
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_OPERATION:
349
109
    case SPV_OPERAND_TYPE_SHDEBUG100_DEBUG_TYPE_QUALIFIER:
350
109
      return true;
351
0
    default:
352
0
      break;
353
109
  }
354
0
  return false;
355
109
}
356
357
722k
bool spvOperandIsConcreteMask(spv_operand_type_t type) {
358
722k
  switch (type) {
359
910
    case SPV_OPERAND_TYPE_IMAGE:
360
910
    case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
361
3.58k
    case SPV_OPERAND_TYPE_SELECTION_CONTROL:
362
4.69k
    case SPV_OPERAND_TYPE_LOOP_CONTROL:
363
6.69k
    case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
364
7.17k
    case SPV_OPERAND_TYPE_MEMORY_ACCESS:
365
7.17k
    case SPV_OPERAND_TYPE_FRAGMENT_SHADING_RATE:
366
7.17k
    case SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS:
367
7.17k
    case SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_INFO_FLAGS:
368
7.17k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_OPERANDS:
369
7.17k
    case SPV_OPERAND_TYPE_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
370
7.17k
    case SPV_OPERAND_TYPE_RAW_ACCESS_CHAIN_OPERANDS:
371
7.17k
    case SPV_OPERAND_TYPE_COOPERATIVE_MATRIX_REDUCE:
372
7.17k
    case SPV_OPERAND_TYPE_TENSOR_ADDRESSING_OPERANDS:
373
7.17k
    case SPV_OPERAND_TYPE_TENSOR_OPERANDS:
374
7.17k
      return true;
375
715k
    default:
376
715k
      break;
377
722k
  }
378
715k
  return false;
379
722k
}
380
381
423k
bool spvOperandIsOptional(spv_operand_type_t type) {
382
423k
  switch (type) {
383
62.1k
    case SPV_OPERAND_TYPE_OPTIONAL_ID:
384
62.5k
    case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
385
243k
    case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
386
243k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
387
243k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
388
243k
    case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
389
243k
    case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
390
247k
    case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
391
257k
    case SPV_OPERAND_TYPE_OPTIONAL_PACKED_VECTOR_FORMAT:
392
257k
    case SPV_OPERAND_TYPE_OPTIONAL_COOPERATIVE_MATRIX_OPERANDS:
393
257k
    case SPV_OPERAND_TYPE_OPTIONAL_MATRIX_MULTIPLY_ACCUMULATE_OPERANDS:
394
257k
    case SPV_OPERAND_TYPE_OPTIONAL_CIV:
395
257k
    case SPV_OPERAND_TYPE_OPTIONAL_RAW_ACCESS_CHAIN_OPERANDS:
396
261k
    case SPV_OPERAND_TYPE_OPTIONAL_FPENCODING:
397
261k
    case SPV_OPERAND_TYPE_OPTIONAL_TENSOR_OPERANDS:
398
261k
    case SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY:
399
261k
      return true;
400
162k
    default:
401
162k
      break;
402
423k
  }
403
  // Any variable operand is also optional.
404
162k
  return spvOperandIsVariable(type);
405
423k
}
406
407
162k
bool spvOperandIsVariable(spv_operand_type_t type) {
408
162k
  switch (type) {
409
96.3k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
410
160k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
411
162k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
412
162k
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
413
162k
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
414
162k
      return true;
415
0
    default:
416
0
      break;
417
162k
  }
418
0
  return false;
419
162k
}
420
421
bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
422
3.04M
                                  spv_operand_pattern_t* pattern) {
423
3.04M
  switch (type) {
424
172k
    case SPV_OPERAND_TYPE_VARIABLE_ID:
425
172k
      pattern->push_back(type);
426
172k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
427
172k
      return true;
428
69.5k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
429
69.5k
      pattern->push_back(type);
430
69.5k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER);
431
69.5k
      return true;
432
5.09k
    case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
433
      // Represents Zero or more (Literal number, Id) pairs,
434
      // where the literal number must be a scalar integer.
435
5.09k
      pattern->push_back(type);
436
5.09k
      pattern->push_back(SPV_OPERAND_TYPE_ID);
437
5.09k
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER);
438
5.09k
      return true;
439
0
    case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
440
      // Represents Zero or more (Id, Literal number) pairs.
441
0
      pattern->push_back(type);
442
0
      pattern->push_back(SPV_OPERAND_TYPE_LITERAL_INTEGER);
443
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_ID);
444
0
      return true;
445
0
    case SPV_OPERAND_TYPE_VARIABLE_CAPABILITY:
446
0
      pattern->push_back(type);
447
0
      pattern->push_back(SPV_OPERAND_TYPE_OPTIONAL_CAPABILITY);
448
0
      return true;
449
2.79M
    default:
450
2.79M
      break;
451
3.04M
  }
452
2.79M
  return false;
453
3.04M
}
454
455
spv_operand_type_t spvTakeFirstMatchableOperand(
456
2.79M
    spv_operand_pattern_t* pattern) {
457
2.79M
  assert(!pattern->empty());
458
2.79M
  spv_operand_type_t result;
459
3.04M
  do {
460
3.04M
    result = pattern->back();
461
3.04M
    pattern->pop_back();
462
3.04M
  } while (spvExpandOperandSequenceOnce(result, pattern));
463
2.79M
  return result;
464
2.79M
}
465
466
spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
467
0
    const spv_operand_pattern_t& pattern) {
468
0
  auto it =
469
0
      std::find(pattern.crbegin(), pattern.crend(), SPV_OPERAND_TYPE_RESULT_ID);
470
0
  if (it != pattern.crend()) {
471
0
    spv_operand_pattern_t alternatePattern(it - pattern.crbegin() + 2,
472
0
                                           SPV_OPERAND_TYPE_OPTIONAL_CIV);
473
0
    alternatePattern[1] = SPV_OPERAND_TYPE_RESULT_ID;
474
0
    return alternatePattern;
475
0
  }
476
477
  // No result-id found, so just expect CIVs.
478
0
  return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
479
0
}
480
481
8.27M
bool spvIsIdType(spv_operand_type_t type) {
482
8.27M
  switch (type) {
483
4.30M
    case SPV_OPERAND_TYPE_ID:
484
5.58M
    case SPV_OPERAND_TYPE_TYPE_ID:
485
7.12M
    case SPV_OPERAND_TYPE_RESULT_ID:
486
7.13M
    case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
487
7.13M
    case SPV_OPERAND_TYPE_SCOPE_ID:
488
7.13M
      return true;
489
1.13M
    default:
490
1.13M
      return false;
491
8.27M
  }
492
8.27M
}
493
494
5.75M
bool spvIsInIdType(spv_operand_type_t type) {
495
5.75M
  if (!spvIsIdType(type)) {
496
    // If it is not an ID it cannot be an input ID.
497
636k
    return false;
498
636k
  }
499
5.11M
  switch (type) {
500
    // Deny non-input IDs.
501
921k
    case SPV_OPERAND_TYPE_TYPE_ID:
502
2.05M
    case SPV_OPERAND_TYPE_RESULT_ID:
503
2.05M
      return false;
504
3.06M
    default:
505
3.06M
      return true;
506
5.11M
  }
507
5.11M
}
508
509
std::function<bool(unsigned)> spvOperandCanBeForwardDeclaredFunction(
510
250k
    spv::Op opcode) {
511
250k
  std::function<bool(unsigned index)> out;
512
250k
  if (spvOpcodeGeneratesType(opcode)) {
513
    // All types can use forward pointers.
514
23.8k
    out = [](unsigned) { return true; };
515
23.8k
    return out;
516
23.8k
  }
517
226k
  switch (opcode) {
518
10
    case spv::Op::OpExecutionMode:
519
10
    case spv::Op::OpExecutionModeId:
520
1.14k
    case spv::Op::OpEntryPoint:
521
23.7k
    case spv::Op::OpName:
522
27.9k
    case spv::Op::OpMemberName:
523
30.6k
    case spv::Op::OpSelectionMerge:
524
39.5k
    case spv::Op::OpDecorate:
525
43.5k
    case spv::Op::OpMemberDecorate:
526
43.5k
    case spv::Op::OpDecorateId:
527
43.5k
    case spv::Op::OpDecorateStringGOOGLE:
528
43.5k
    case spv::Op::OpMemberDecorateStringGOOGLE:
529
51.2k
    case spv::Op::OpBranch:
530
52.4k
    case spv::Op::OpLoopMerge:
531
52.4k
    case spv::Op::OpConditionalEntryPointINTEL:
532
52.4k
    case spv::Op::OpConditionalCapabilityINTEL:
533
52.4k
    case spv::Op::OpConditionalExtensionINTEL:
534
54.1k
      out = [](unsigned) { return true; };
535
52.4k
      break;
536
0
    case spv::Op::OpGroupDecorate:
537
0
    case spv::Op::OpGroupMemberDecorate:
538
3.46k
    case spv::Op::OpBranchConditional:
539
3.76k
    case spv::Op::OpSwitch:
540
8.36k
      out = [](unsigned index) { return index != 0; };
541
3.76k
      break;
542
543
2.19k
    case spv::Op::OpFunctionCall:
544
      // The Function parameter.
545
2.19k
      out = [](unsigned index) { return index == 2; };
546
2.19k
      break;
547
548
404
    case spv::Op::OpPhi:
549
404
      out = [](unsigned index) { return index > 1; };
550
404
      break;
551
552
0
    case spv::Op::OpEnqueueKernel:
553
      // The Invoke parameter.
554
0
      out = [](unsigned index) { return index == 8; };
555
0
      break;
556
557
0
    case spv::Op::OpGetKernelNDrangeSubGroupCount:
558
0
    case spv::Op::OpGetKernelNDrangeMaxSubGroupSize:
559
      // The Invoke parameter.
560
0
      out = [](unsigned index) { return index == 3; };
561
0
      break;
562
563
0
    case spv::Op::OpGetKernelWorkGroupSize:
564
0
    case spv::Op::OpGetKernelPreferredWorkGroupSizeMultiple:
565
      // The Invoke parameter.
566
0
      out = [](unsigned index) { return index == 2; };
567
0
      break;
568
110
    case spv::Op::OpTypeForwardPointer:
569
110
      out = [](unsigned index) { return index == 0; };
570
110
      break;
571
0
    case spv::Op::OpTypeArray:
572
0
      out = [](unsigned index) { return index == 1; };
573
0
      break;
574
0
    case spv::Op::OpCooperativeMatrixPerElementOpNV:
575
0
      out = [](unsigned index) { return index == 3; };
576
0
      break;
577
0
    case spv::Op::OpCooperativeMatrixReduceNV:
578
0
      out = [](unsigned index) { return index == 4; };
579
0
      break;
580
0
    case spv::Op::OpCooperativeMatrixLoadTensorNV:
581
      // approximate, due to variable operands
582
0
      out = [](unsigned index) { return index > 6; };
583
0
      break;
584
0
    case spv::Op::OpGraphEntryPointARM:
585
0
      out = [](unsigned index) { return index == 0; };
586
0
      break;
587
167k
    default:
588
167k
      out = [](unsigned) { return false; };
589
167k
      break;
590
226k
  }
591
226k
  return out;
592
226k
}
593
594
std::function<bool(unsigned)> spvDbgInfoExtOperandCanBeForwardDeclaredFunction(
595
0
    spv::Op opcode, spv_ext_inst_type_t ext_type, uint32_t key) {
596
  // The Vulkan debug info extended instruction set is non-semantic so allows no
597
  // forward references except if used through OpExtInstWithForwardRefsKHR.
598
0
  if (ext_type == SPV_EXT_INST_TYPE_NONSEMANTIC_SHADER_DEBUGINFO_100) {
599
0
    return [opcode](unsigned) {
600
0
      return opcode == spv::Op::OpExtInstWithForwardRefsKHR;
601
0
    };
602
0
  }
603
604
  // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/532): Forward
605
  // references for debug info instructions are still in discussion. We must
606
  // update the following lines of code when we conclude the spec.
607
0
  std::function<bool(unsigned index)> out;
608
0
  if (ext_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
609
0
    switch (OpenCLDebugInfo100Instructions(key)) {
610
0
      case OpenCLDebugInfo100DebugFunction:
611
0
        out = [](unsigned index) { return index == 13; };
612
0
        break;
613
0
      case OpenCLDebugInfo100DebugTypeComposite:
614
0
        out = [](unsigned index) { return index >= 13; };
615
0
        break;
616
0
      default:
617
0
        out = [](unsigned) { return false; };
618
0
        break;
619
0
    }
620
0
  } else {
621
0
    switch (DebugInfoInstructions(key)) {
622
0
      case DebugInfoDebugFunction:
623
0
        out = [](unsigned index) { return index == 13; };
624
0
        break;
625
0
      case DebugInfoDebugTypeComposite:
626
0
        out = [](unsigned index) { return index >= 12; };
627
0
        break;
628
0
      default:
629
0
        out = [](unsigned) { return false; };
630
0
        break;
631
0
    }
632
0
  }
633
0
  return out;
634
0
}
635
636
0
spv_fp_encoding_t spvFPEncodingFromOperandFPEncoding(spv::FPEncoding encoding) {
637
0
  switch (encoding) {
638
0
    case spv::FPEncoding::BFloat16KHR:
639
0
      return SPV_FP_ENCODING_BFLOAT16;
640
0
    case spv::FPEncoding::Float8E4M3EXT:
641
0
      return SPV_FP_ENCODING_FLOAT8_E4M3;
642
0
    case spv::FPEncoding::Float8E5M2EXT:
643
0
      return SPV_FP_ENCODING_FLOAT8_E5M2;
644
0
    case spv::FPEncoding::Max:
645
0
      break;
646
0
  }
647
0
  return SPV_FP_ENCODING_UNKNOWN;
648
0
}