
Not all SPIR-V extensions are allows in every environment. When we use the `-spirv-ext=all` option, the backend currently believes that all extensions can be used. This commit filters out the extensions on the command line to remove those that are not known to be allowed for the current environment. Alternatives considered: I considered modifying the SPIRVExtensionsParser::parse to use a different list of extensions for "all" depending on the target triple. However that does not work because the target triple is not available, and cannot be made available in a reasonable way. Fixes #147717 --------- Co-authored-by: Victor Lomuller <victor@codeplay.com>
55 lines
1.9 KiB
C++
55 lines
1.9 KiB
C++
//===--- SPIRVCommandLine.h ---- Command Line Options -----------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains classes and functions needed for processing, parsing, and
|
|
// using CLI options for the SPIR-V backend.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_SPIRV_COMMANDLINE_H
|
|
#define LLVM_LIB_TARGET_SPIRV_COMMANDLINE_H
|
|
|
|
#include "MCTargetDesc/SPIRVBaseInfo.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include <set>
|
|
#include <string>
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
class Triple;
|
|
|
|
/// Command line parser for toggling SPIR-V extensions.
|
|
struct SPIRVExtensionsParser
|
|
: public cl::parser<std::set<SPIRV::Extension::Extension>> {
|
|
public:
|
|
SPIRVExtensionsParser(cl::Option &O)
|
|
: cl::parser<std::set<SPIRV::Extension::Extension>>(O) {}
|
|
|
|
/// Parses SPIR-V extension name from CLI arguments.
|
|
///
|
|
/// \return Returns true on error.
|
|
bool parse(cl::Option &O, StringRef ArgName, StringRef ArgValue,
|
|
std::set<SPIRV::Extension::Extension> &Vals);
|
|
|
|
/// Validates and converts extension names into internal enum values.
|
|
///
|
|
/// \return Returns a reference to the unknown SPIR-V extension name from the
|
|
/// list if present, or an empty StringRef on success.
|
|
static StringRef
|
|
checkExtensions(const std::vector<std::string> &ExtNames,
|
|
std::set<SPIRV::Extension::Extension> &AllowedExtensions);
|
|
|
|
/// Returns the list of extensions that are valid for a particular
|
|
/// target environment (i.e., OpenCL or Vulkan).
|
|
static std::set<SPIRV::Extension::Extension>
|
|
getValidExtensions(const Triple &TT);
|
|
};
|
|
|
|
} // namespace llvm
|
|
#endif // LLVM_LIB_TARGET_SPIRV_COMMANDLINE_H
|