LLVM: lib/Target/SPIRV/SPIRVCommandLine.cpp Source File (original) (raw)
31 {"SPV_EXT_shader_atomic_float_add",
32 SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float_add},
33 {"SPV_EXT_shader_atomic_float16_add",
34 SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float16_add},
35 {"SPV_EXT_shader_atomic_float_min_max",
36 SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float_min_max},
37 {"SPV_INTEL_16bit_atomics",
38 SPIRV::Extension::Extension::SPV_INTEL_16bit_atomics},
39 {"SPV_NV_shader_atomic_fp16_vector",
40 SPIRV::Extension::Extension::SPV_NV_shader_atomic_fp16_vector},
41 {"SPV_EXT_arithmetic_fence",
42 SPIRV::Extension::Extension::SPV_EXT_arithmetic_fence},
43 {"SPV_EXT_demote_to_helper_invocation",
44 SPIRV::Extension::Extension::SPV_EXT_demote_to_helper_invocation},
45 {"SPV_EXT_descriptor_indexing",
46 SPIRV::Extension::Extension::SPV_EXT_descriptor_indexing},
47 {"SPV_EXT_fragment_fully_covered",
48 SPIRV::Extension::Extension::SPV_EXT_fragment_fully_covered},
49 {"SPV_EXT_fragment_invocation_density",
50 SPIRV::Extension::Extension::SPV_EXT_fragment_invocation_density},
51 {"SPV_EXT_fragment_shader_interlock",
52 SPIRV::Extension::Extension::SPV_EXT_fragment_shader_interlock},
53 {"SPV_EXT_mesh_shader",
54 SPIRV::Extension::Extension::SPV_EXT_mesh_shader},
55 {"SPV_EXT_shader_stencil_export",
56 SPIRV::Extension::Extension::SPV_EXT_shader_stencil_export},
57 {"SPV_EXT_shader_viewport_index_layer",
58 SPIRV::Extension::Extension::SPV_EXT_shader_viewport_index_layer},
59 {"SPV_GOOGLE_hlsl_functionality1",
60 SPIRV::Extension::Extension::SPV_GOOGLE_hlsl_functionality1},
61 {"SPV_GOOGLE_user_type",
62 SPIRV::Extension::Extension::SPV_GOOGLE_user_type},
63 {"SPV_ALTERA_arbitrary_precision_integers",
64 SPIRV::Extension::Extension::SPV_ALTERA_arbitrary_precision_integers},
65 {"SPV_INTEL_cache_controls",
66 SPIRV::Extension::Extension::SPV_INTEL_cache_controls},
67 {"SPV_INTEL_float_controls2",
68 SPIRV::Extension::Extension::SPV_INTEL_float_controls2},
69 {"SPV_INTEL_global_variable_fpga_decorations",
70 SPIRV::Extension::Extension::
71 SPV_INTEL_global_variable_fpga_decorations},
72 {"SPV_INTEL_global_variable_host_access",
73 SPIRV::Extension::Extension::SPV_INTEL_global_variable_host_access},
74 {"SPV_INTEL_optnone", SPIRV::Extension::Extension::SPV_INTEL_optnone},
75 {"SPV_EXT_optnone", SPIRV::Extension::Extension::SPV_EXT_optnone},
76 {"SPV_INTEL_usm_storage_classes",
77 SPIRV::Extension::Extension::SPV_INTEL_usm_storage_classes},
78 {"SPV_INTEL_split_barrier",
79 SPIRV::Extension::Extension::SPV_INTEL_split_barrier},
80 {"SPV_INTEL_subgroups",
81 SPIRV::Extension::Extension::SPV_INTEL_subgroups},
82 {"SPV_INTEL_media_block_io",
83 SPIRV::Extension::Extension::SPV_INTEL_media_block_io},
84 {"SPV_INTEL_memory_access_aliasing",
85 SPIRV::Extension::Extension::SPV_INTEL_memory_access_aliasing},
86 {"SPV_INTEL_joint_matrix",
87 SPIRV::Extension::Extension::SPV_INTEL_joint_matrix},
88 {"SPV_KHR_16bit_storage",
89 SPIRV::Extension::Extension::SPV_KHR_16bit_storage},
90 {"SPV_KHR_device_group",
91 SPIRV::Extension::Extension::SPV_KHR_device_group},
92 {"SPV_KHR_fragment_shading_rate",
93 SPIRV::Extension::Extension::SPV_KHR_fragment_shading_rate},
94 {"SPV_KHR_multiview", SPIRV::Extension::Extension::SPV_KHR_multiview},
95 {"SPV_KHR_post_depth_coverage",
96 SPIRV::Extension::Extension::SPV_KHR_post_depth_coverage},
97 {"SPV_KHR_shader_draw_parameters",
98 SPIRV::Extension::Extension::SPV_KHR_shader_draw_parameters},
99 {"SPV_KHR_ray_tracing",
100 SPIRV::Extension::Extension::SPV_KHR_ray_tracing},
101 {"SPV_KHR_uniform_group_instructions",
102 SPIRV::Extension::Extension::SPV_KHR_uniform_group_instructions},
103 {"SPV_KHR_no_integer_wrap_decoration",
104 SPIRV::Extension::Extension::SPV_KHR_no_integer_wrap_decoration},
105 {"SPV_KHR_float_controls",
106 SPIRV::Extension::Extension::SPV_KHR_float_controls},
107 {"SPV_KHR_expect_assume",
108 SPIRV::Extension::Extension::SPV_KHR_expect_assume},
109 {"SPV_KHR_bit_instructions",
110 SPIRV::Extension::Extension::SPV_KHR_bit_instructions},
111 {"SPV_KHR_integer_dot_product",
112 SPIRV::Extension::Extension::SPV_KHR_integer_dot_product},
113 {"SPV_KHR_linkonce_odr",
114 SPIRV::Extension::Extension::SPV_KHR_linkonce_odr},
115 {"SPV_INTEL_inline_assembly",
116 SPIRV::Extension::Extension::SPV_INTEL_inline_assembly},
117 {"SPV_INTEL_bindless_images",
118 SPIRV::Extension::Extension::SPV_INTEL_bindless_images},
119 {"SPV_INTEL_bfloat16_arithmetic",
120 SPIRV::Extension::Extension::SPV_INTEL_bfloat16_arithmetic},
121 {"SPV_INTEL_bfloat16_conversion",
122 SPIRV::Extension::Extension::SPV_INTEL_bfloat16_conversion},
123 {"SPV_KHR_subgroup_rotate",
124 SPIRV::Extension::Extension::SPV_KHR_subgroup_rotate},
125 {"SPV_INTEL_variable_length_array",
126 SPIRV::Extension::Extension::SPV_INTEL_variable_length_array},
127 {"SPV_INTEL_function_pointers",
128 SPIRV::Extension::Extension::SPV_INTEL_function_pointers},
129 {"SPV_KHR_shader_clock",
130 SPIRV::Extension::Extension::SPV_KHR_shader_clock},
131 {"SPV_KHR_cooperative_matrix",
132 SPIRV::Extension::Extension::SPV_KHR_cooperative_matrix},
133 {"SPV_KHR_non_semantic_info",
134 SPIRV::Extension::Extension::SPV_KHR_non_semantic_info},
135 {"SPV_KHR_ray_query", SPIRV::Extension::Extension::SPV_KHR_ray_query},
136 {"SPV_EXT_shader_image_int64",
137 SPIRV::Extension::Extension::SPV_EXT_shader_image_int64},
138 {"SPV_KHR_fragment_shader_barycentric",
139 SPIRV::Extension::Extension::SPV_KHR_fragment_shader_barycentric},
140 {"SPV_KHR_physical_storage_buffer",
141 SPIRV::Extension::Extension::SPV_KHR_physical_storage_buffer},
142 {"SPV_KHR_vulkan_memory_model",
143 SPIRV::Extension::Extension::SPV_KHR_vulkan_memory_model},
144 {"SPV_NV_shader_subgroup_partitioned",
145 SPIRV::Extension::Extension::SPV_NV_shader_subgroup_partitioned},
146 {"SPV_INTEL_long_composites",
147 SPIRV::Extension::Extension::SPV_INTEL_long_composites},
148 {"SPV_INTEL_fp_max_error",
149 SPIRV::Extension::Extension::SPV_INTEL_fp_max_error},
150 {"SPV_INTEL_subgroup_matrix_multiply_accumulate",
151 SPIRV::Extension::Extension::
152 SPV_INTEL_subgroup_matrix_multiply_accumulate},
153 {"SPV_INTEL_ternary_bitwise_function",
154 SPIRV::Extension::Extension::SPV_INTEL_ternary_bitwise_function},
155 {"SPV_INTEL_2d_block_io",
156 SPIRV::Extension::Extension::SPV_INTEL_2d_block_io},
157 {"SPV_INTEL_int4", SPIRV::Extension::Extension::SPV_INTEL_int4},
158 {"SPV_KHR_float_controls2",
159 SPIRV::Extension::Extension::SPV_KHR_float_controls2},
160 {"SPV_INTEL_tensor_float32_conversion",
161 SPIRV::Extension::Extension::SPV_INTEL_tensor_float32_conversion},
162 {"SPV_KHR_bfloat16", SPIRV::Extension::Extension::SPV_KHR_bfloat16},
163 {"SPV_EXT_relaxed_printf_string_address_space",
164 SPIRV::Extension::Extension::
165 SPV_EXT_relaxed_printf_string_address_space},
166 {"SPV_INTEL_predicated_io",
167 SPIRV::Extension::Extension::SPV_INTEL_predicated_io},
168 {"SPV_KHR_maximal_reconvergence",
169 SPIRV::Extension::Extension::SPV_KHR_maximal_reconvergence},
170 {"SPV_INTEL_kernel_attributes",
171 SPIRV::Extension::Extension::SPV_INTEL_kernel_attributes},
172 {"SPV_ALTERA_blocking_pipes",
173 SPIRV::Extension::Extension::SPV_ALTERA_blocking_pipes},
174 {"SPV_INTEL_int4", SPIRV::Extension::Extension::SPV_INTEL_int4},
175 {"SPV_ALTERA_arbitrary_precision_fixed_point",
176 SPIRV::Extension::Extension::
177 SPV_ALTERA_arbitrary_precision_fixed_point}};
181 std::setSPIRV::Extension::Extension &Vals) {
183 ArgValue.split(Tokens, ",", -1, false);
184 llvm::sort(Tokens, [](auto &&LHS, auto &&RHS) {
185
186
187
188
189 if (LHS == "all")
190 return true;
191 if (RHS == "all")
192 return false;
193 return !(RHS < LHS);
194 });
195
196 std::setSPIRV::Extension::Extension EnabledExtensions;
197
198 for (const auto &Token : Tokens) {
199 if (Token == "all") {
200 for (const auto &[ExtensionName, ExtensionEnum] : SPIRVExtensionMap)
201 EnabledExtensions.insert(ExtensionEnum);
202
203 continue;
204 }
205
206 if (Token.size() == 3 && Token.upper() == "KHR") {
207 for (const auto &[ExtensionName, ExtensionEnum] : SPIRVExtensionMap)
209 EnabledExtensions.insert(ExtensionEnum);
210 continue;
211 }
212
213 if (Token.empty() || (!Token.starts_with("+") && !Token.starts_with("-")))
214 return O.error("Invalid extension list format: " + Token.str());
215
218
220 return O.error("Unknown SPIR-V extension: " + Token.str());
221
222 if (Token.starts_with("+")) {
223 EnabledExtensions.insert(NameValuePair->second);
224 } else if (EnabledExtensions.count(NameValuePair->second)) {
226 return O.error(
227 "Extension cannot be allowed and disallowed at the same time: " +
228 ExtensionName.str());
229
230 EnabledExtensions.erase(NameValuePair->second);
231 }
232 }
233
234 Vals = std::move(EnabledExtensions);
235 return false;
236}
239 const std::vectorstd::string &ExtNames,
240 std::setSPIRV::Extension::Extension &AllowedExtensions) {
241 for (const auto &Ext : ExtNames) {
242 if (Ext == "all") {
243 for (const auto &[ExtensionName, ExtensionEnum] : SPIRVExtensionMap)
244 AllowedExtensions.insert(ExtensionEnum);
245 break;
246 }
249 return Ext;
250 AllowedExtensions.insert(It->second);
251 }
253}
257 std::setSPIRV::Extension::Extension R;
258 SPIRV::Environment::Environment CurrentEnvironment =
259 SPIRV::Environment::Environment::EnvOpenCL;
261 CurrentEnvironment = SPIRV::Environment::Environment::EnvVulkan;
262
263 for (const auto &[ExtensionName, ExtensionEnum] : SPIRVExtensionMap) {
265 SPIRV::OperandCategory::OperandCategory::ExtensionOperand,
266 ExtensionEnum);
267
269 R.insert(ExtensionEnum);
270 }
271
273
274
275 R.erase(SPIRV::Extension::SPV_KHR_float_controls2);
276 }
277
278 return R;
279}