Add all accepted target environments to the tools' help texts (#2687)

Several tools take a --target-env option to specify the SPIR-V
environment to use. They all use spvParseTargetEnv to parse
the user-specified string and select the appropriate spv_target_env
but all tools list only _some_ of the valid values in their help
text.

This change makes the help text construction automatic from the
full list of valid values, establishing a single source of truth
for the values printed in the help text. The new utility function
added allows its user to specify padding and wrapping constraints
so the produced strings fits well in the various help texts.

Signed-off-by: Kévin Petit <kpet@free.fr>
This commit is contained in:
Kévin Petit 2019-06-20 14:41:28 +01:00 коммит произвёл David Neto
Родитель 51b0d5ce50
Коммит bec7e0393f
6 изменённых файлов: 87 добавлений и 89 удалений

Просмотреть файл

@ -15,6 +15,7 @@
#include "source/spirv_target_env.h"
#include <cstring>
#include <map>
#include <string>
#include "source/spirv_constant.h"
@ -103,80 +104,44 @@ uint32_t spvVersionForTargetEnv(spv_target_env env) {
return SPV_SPIRV_VERSION_WORD(0, 0);
}
static const std::map<std::string, spv_target_env> spvTargetEnvNameMap = {
{"vulkan1.1spv1.4", SPV_ENV_VULKAN_1_1_SPIRV_1_4},
{"vulkan1.0", SPV_ENV_VULKAN_1_0},
{"vulkan1.1", SPV_ENV_VULKAN_1_1},
{"spv1.0", SPV_ENV_UNIVERSAL_1_0},
{"spv1.1", SPV_ENV_UNIVERSAL_1_1},
{"spv1.2", SPV_ENV_UNIVERSAL_1_2},
{"spv1.3", SPV_ENV_UNIVERSAL_1_3},
{"spv1.4", SPV_ENV_UNIVERSAL_1_4},
{"opencl1.2embedded", SPV_ENV_OPENCL_EMBEDDED_1_2},
{"opencl1.2", SPV_ENV_OPENCL_1_2},
{"opencl2.0embedded", SPV_ENV_OPENCL_EMBEDDED_2_0},
{"opencl2.0", SPV_ENV_OPENCL_2_0},
{"opencl2.1embedded", SPV_ENV_OPENCL_EMBEDDED_2_1},
{"opencl2.1", SPV_ENV_OPENCL_2_1},
{"opencl2.2embedded", SPV_ENV_OPENCL_EMBEDDED_2_2},
{"opencl2.2", SPV_ENV_OPENCL_2_2},
{"opengl4.0", SPV_ENV_OPENGL_4_0},
{"opengl4.1", SPV_ENV_OPENGL_4_1},
{"opengl4.2", SPV_ENV_OPENGL_4_2},
{"opengl4.3", SPV_ENV_OPENGL_4_3},
{"opengl4.5", SPV_ENV_OPENGL_4_5},
{"webgpu0", SPV_ENV_WEBGPU_0},
};
bool spvParseTargetEnv(const char* s, spv_target_env* env) {
auto match = [s](const char* b) {
return s && (0 == strncmp(s, b, strlen(b)));
};
if (match("vulkan1.1spv1.4")) {
if (env) *env = SPV_ENV_VULKAN_1_1_SPIRV_1_4;
return true;
} else if (match("vulkan1.0")) {
if (env) *env = SPV_ENV_VULKAN_1_0;
return true;
} else if (match("vulkan1.1")) {
if (env) *env = SPV_ENV_VULKAN_1_1;
return true;
} else if (match("spv1.0")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_0;
return true;
} else if (match("spv1.1")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_1;
return true;
} else if (match("spv1.2")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_2;
return true;
} else if (match("spv1.3")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_3;
return true;
} else if (match("spv1.4")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_4;
return true;
} else if (match("opencl1.2embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
return true;
} else if (match("opencl1.2")) {
if (env) *env = SPV_ENV_OPENCL_1_2;
return true;
} else if (match("opencl2.0embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
return true;
} else if (match("opencl2.0")) {
if (env) *env = SPV_ENV_OPENCL_2_0;
return true;
} else if (match("opencl2.1embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
return true;
} else if (match("opencl2.1")) {
if (env) *env = SPV_ENV_OPENCL_2_1;
return true;
} else if (match("opencl2.2embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
return true;
} else if (match("opencl2.2")) {
if (env) *env = SPV_ENV_OPENCL_2_2;
return true;
} else if (match("opengl4.0")) {
if (env) *env = SPV_ENV_OPENGL_4_0;
return true;
} else if (match("opengl4.1")) {
if (env) *env = SPV_ENV_OPENGL_4_1;
return true;
} else if (match("opengl4.2")) {
if (env) *env = SPV_ENV_OPENGL_4_2;
return true;
} else if (match("opengl4.3")) {
if (env) *env = SPV_ENV_OPENGL_4_3;
return true;
} else if (match("opengl4.5")) {
if (env) *env = SPV_ENV_OPENGL_4_5;
return true;
} else if (match("webgpu0")) {
if (env) *env = SPV_ENV_WEBGPU_0;
return true;
} else {
if (env) *env = SPV_ENV_UNIVERSAL_1_0;
return false;
std::string envstr;
if (s != nullptr) {
envstr = s;
}
if (spvTargetEnvNameMap.count(envstr) != 0) {
if (env) {
*env = spvTargetEnvNameMap.at(envstr);
}
return true;
}
if (env) *env = SPV_ENV_UNIVERSAL_1_0;
return false;
}
bool spvIsVulkanEnv(spv_target_env env) {
@ -310,3 +275,29 @@ std::string spvLogStringForEnv(spv_target_env env) {
}
return "Unknown";
}
std::string spvTargetEnvList(const int pad, const int wrap) {
std::string ret;
size_t max_line_len = wrap - pad; // The first line isn't padded
std::string line;
std::string sep = "";
for (auto& env_name : spvTargetEnvNameMap) {
std::string word = sep + env_name.first;
if (line.length() + word.length() > max_line_len) {
// Adding one word wouldn't fit, commit the line in progress and
// start a new one.
ret += line + "\n";
line.assign(pad, ' ');
// The first line is done. The max length now comprises the
// padding.
max_line_len = wrap;
}
line += word;
sep = "|";
}
ret += line;
return ret;
}

Просмотреть файл

@ -38,4 +38,12 @@ uint32_t spvVersionForTargetEnv(spv_target_env env);
// environment, i.e. "Vulkan", "WebGPU", "OpenCL", etc.
std::string spvLogStringForEnv(spv_target_env env);
// Returns a formatted list of all SPIR-V target environment names that
// can be parsed by spvParseTargetEnv.
// |pad| is the number of space characters that the begining of each line
// except the first one will be padded with.
// |wrap| is the max length of lines the user desires. Word-wrapping will
// occur to satisfy this limit.
std::string spvTargetEnvList(const int pad, const int wrap);
#endif // SOURCE_SPIRV_TARGET_ENV_H_

Просмотреть файл

@ -21,6 +21,7 @@
#include "tools/io.h"
void print_usage(char* argv0) {
std::string target_env_list = spvTargetEnvList(19, 80);
printf(
R"(%s - Create a SPIR-V binary module from SPIR-V assembly text
@ -41,11 +42,10 @@ Options:
Numeric IDs in the binary will have the same values as in the
source. Non-numeric IDs are allocated by filling in the gaps,
starting with 1 and going up.
--target-env {vulkan1.0|vulkan1.1|spv1.0|spv1.1|spv1.2|spv1.3|spv1.4}
Use Vulkan 1.0, Vulkan 1.1, SPIR-V 1.0, SPIR-V 1.1,
SPIR-V 1.2, SPIR-V 1.3, or SPIR-V 1.4
--target-env {%s}
Use specified environment.
)",
argv0, argv0);
argv0, argv0, target_env_list.c_str());
}
static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_4;

Просмотреть файл

@ -23,6 +23,7 @@
#include "tools/io.h"
void print_usage(char* argv0) {
std::string target_env_list = spvTargetEnvList(27, 95);
printf(
R"(%s - Link SPIR-V binary files together.
@ -39,11 +40,10 @@ Options:
--allow-partial-linkage Allow partial linkage by accepting imported symbols to be unresolved.
--verify-ids Verify that IDs in the resulting modules are truly unique.
--version Display linker version information
--target-env {vulkan1.0|vulkan1.1|spv1.0|spv1.1|spv1.2|spv1.3|spv1.4|opencl2.1|opencl2.2}
Use Vulkan 1.0, Vulkan 1.1, SPIR-V 1.0, SPIR-V 1.1, SPIR-V 1.2, SPIR-V 1.3,
SPIR-V1.4, OpenCL 2.1, OpenCL 2.2 validation rules.
--target-env {%s}
Use validation rules from the specified environment.
)",
argv0, argv0);
argv0, argv0, target_env_list.c_str());
}
int main(int argc, char** argv) {

Просмотреть файл

@ -92,6 +92,7 @@ std::string GetWebGPUToVulkanPasses() {
}
void PrintUsage(const char* program) {
std::string target_env_list = spvTargetEnvList(16, 80);
// NOTE: Please maintain flags in lexicographical order.
printf(
R"(%s - Optimize a SPIR-V binary file.
@ -436,9 +437,9 @@ Options (in lexicographical order):)",
printf(R"(
--target-env=<env>
Set the target environment. Without this flag the target
enviroment defaults to spv1.3.
<env> must be one of vulkan1.0, vulkan1.1, opencl2.2, spv1.0,
spv1.1, spv1.2, spv1.3, or webgpu0.)");
enviroment defaults to spv1.3. <env> must be one of
{%s})",
target_env_list.c_str());
printf(R"(
--time-report
Print the resource utilization of each pass (e.g., CPU time,

Просмотреть файл

@ -25,6 +25,7 @@
#include "tools/util/cli_consumer.h"
void print_usage(char* argv0) {
std::string target_env_list = spvTargetEnvList(36, 105);
printf(
R"(%s - Validate a SPIR-V binary file.
@ -65,13 +66,10 @@ Options:
--before-hlsl-legalization Allows code patterns that are intended to be
fixed by spirv-opt's legalization passes.
--version Display validator version information.
--target-env {vulkan1.0|vulkan1.1|vulkan1.1spv1.4|opencl2.2|spv1.0|spv1.1|
spv1.2|spv1.3|spv1.4|webgpu0}
Use Vulkan 1.0, Vulkan 1.1, Vulkan 1.1 with SPIR-V 1.4,
OpenCL 2.2, SPIR-V 1.0, SPIR-V 1.1, SPIR-V 1.2, SPIR-V 1.3,
SPIR-V 1.4, or WIP WebGPU validation rules.
--target-env {%s}
Use validation rules from the specified environment.
)",
argv0, argv0);
argv0, argv0, target_env_list.c_str());
}
int main(int argc, char** argv) {