Path: blob/main/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
35266 views
//===--- SPIRVCommandLine.cpp ---- Command Line Options ---------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains definitions of classes and functions needed for9// processing, parsing, and using CLI options for the SPIR-V backend.10//11//===----------------------------------------------------------------------===//1213#include "SPIRVCommandLine.h"14#include "llvm/ADT/StringRef.h"15#include <algorithm>16#include <map>1718#define DEBUG_TYPE "spirv-commandline"1920using namespace llvm;2122static const std::map<std::string, SPIRV::Extension::Extension>23SPIRVExtensionMap = {24{"SPV_EXT_shader_atomic_float_add",25SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float_add},26{"SPV_EXT_shader_atomic_float16_add",27SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float16_add},28{"SPV_EXT_shader_atomic_float_min_max",29SPIRV::Extension::Extension::SPV_EXT_shader_atomic_float_min_max},30{"SPV_INTEL_arbitrary_precision_integers",31SPIRV::Extension::Extension::SPV_INTEL_arbitrary_precision_integers},32{"SPV_INTEL_cache_controls",33SPIRV::Extension::Extension::SPV_INTEL_cache_controls},34{"SPV_INTEL_global_variable_fpga_decorations",35SPIRV::Extension::Extension::36SPV_INTEL_global_variable_fpga_decorations},37{"SPV_INTEL_global_variable_host_access",38SPIRV::Extension::Extension::SPV_INTEL_global_variable_host_access},39{"SPV_INTEL_optnone", SPIRV::Extension::Extension::SPV_INTEL_optnone},40{"SPV_INTEL_usm_storage_classes",41SPIRV::Extension::Extension::SPV_INTEL_usm_storage_classes},42{"SPV_INTEL_subgroups",43SPIRV::Extension::Extension::SPV_INTEL_subgroups},44{"SPV_KHR_uniform_group_instructions",45SPIRV::Extension::Extension::SPV_KHR_uniform_group_instructions},46{"SPV_KHR_no_integer_wrap_decoration",47SPIRV::Extension::Extension::SPV_KHR_no_integer_wrap_decoration},48{"SPV_KHR_float_controls",49SPIRV::Extension::Extension::SPV_KHR_float_controls},50{"SPV_KHR_expect_assume",51SPIRV::Extension::Extension::SPV_KHR_expect_assume},52{"SPV_KHR_bit_instructions",53SPIRV::Extension::Extension::SPV_KHR_bit_instructions},54{"SPV_KHR_linkonce_odr",55SPIRV::Extension::Extension::SPV_KHR_linkonce_odr},56{"SPV_INTEL_inline_assembly",57SPIRV::Extension::Extension::SPV_INTEL_inline_assembly},58{"SPV_INTEL_bfloat16_conversion",59SPIRV::Extension::Extension::SPV_INTEL_bfloat16_conversion},60{"SPV_KHR_subgroup_rotate",61SPIRV::Extension::Extension::SPV_KHR_subgroup_rotate},62{"SPV_INTEL_variable_length_array",63SPIRV::Extension::Extension::SPV_INTEL_variable_length_array},64{"SPV_INTEL_function_pointers",65SPIRV::Extension::Extension::SPV_INTEL_function_pointers},66{"SPV_KHR_shader_clock",67SPIRV::Extension::Extension::SPV_KHR_shader_clock},68{"SPV_KHR_cooperative_matrix",69SPIRV::Extension::Extension::SPV_KHR_cooperative_matrix},70};7172bool SPIRVExtensionsParser::parse(cl::Option &O, llvm::StringRef ArgName,73llvm::StringRef ArgValue,74std::set<SPIRV::Extension::Extension> &Vals) {75llvm::SmallVector<llvm::StringRef, 10> Tokens;76ArgValue.split(Tokens, ",", -1, false);77std::sort(Tokens.begin(), Tokens.end());7879std::set<SPIRV::Extension::Extension> EnabledExtensions;8081for (const auto &Token : Tokens) {82if (Token == "all") {83for (const auto &[ExtensionName, ExtensionEnum] : SPIRVExtensionMap)84EnabledExtensions.insert(ExtensionEnum);8586continue;87}8889if (Token.empty() || (!Token.starts_with("+") && !Token.starts_with("-")))90return O.error("Invalid extension list format: " + Token.str());9192llvm::StringRef ExtensionName = Token.substr(1);93auto NameValuePair = SPIRVExtensionMap.find(ExtensionName.str());9495if (NameValuePair == SPIRVExtensionMap.end())96return O.error("Unknown SPIR-V extension: " + Token.str());9798if (Token.starts_with("+")) {99EnabledExtensions.insert(NameValuePair->second);100} else if (EnabledExtensions.count(NameValuePair->second)) {101if (std::find(Tokens.begin(), Tokens.end(), "+" + ExtensionName.str()) !=102Tokens.end())103return O.error(104"Extension cannot be allowed and disallowed at the same time: " +105ExtensionName.str());106107EnabledExtensions.erase(NameValuePair->second);108}109}110111Vals = std::move(EnabledExtensions);112return false;113}114115116