summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSteven Perron <stevenperron@google.com>2017-10-24 15:13:13 -0400
committerDavid Neto <dneto@google.com>2017-10-28 18:48:21 -0400
commit716138ee14c88ba0f0aa65a9a995f67e5ad252ec (patch)
tree2ac6d02b4449691aac7736c6b6af6d0da67fe29f /tools
parent6724c272515686398105813de0801407566ae914 (diff)
downloadSPIRV-Tools-716138ee14c88ba0f0aa65a9a995f67e5ad252ec.tar.gz
SPIRV-Tools-716138ee14c88ba0f0aa65a9a995f67e5ad252ec.tar.bz2
SPIRV-Tools-716138ee14c88ba0f0aa65a9a995f67e5ad252ec.zip
Add option to relax validation of store types.
There are a number of users of spriv-opt that are hitting errors because of stores with different types. In general, this is wrong, but, in these cases, the types are the exact same except for decorations. The options is "--relax-store-struct", and it can be used with the validator or the optimizer. We assume that if layout information is missing it is consistent. For example if one struct has a offset of one of its members, and the other one does not, we will still consider them as being layout compatible. The problem will be if both struct has and offset decoration for corresponding members, and the offset are different.
Diffstat (limited to 'tools')
-rw-r--r--tools/opt/opt.cpp25
-rw-r--r--tools/val/val.cpp5
2 files changed, 25 insertions, 5 deletions
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index dd44d248..4236c935 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#include <spirv_validator_options.h>
#include <algorithm>
#include <cassert>
#include <cstring>
@@ -155,6 +156,10 @@ Options:
Replaces instructions with equivalent and less expensive ones.
--eliminate-dead-variables
Deletes module scope variables that are not referenced.
+ --relax-store-struct
+ Allow store from one struct type to a different type with
+ compatible layout and members. This option is forwarded to the
+ validator.
-O
Optimize for performance. Apply a sequence of transformations
in an attempt to improve the performance of the generated
@@ -242,7 +247,8 @@ bool ReadFlagsFromFile(const char* oconfig_flag,
}
OptStatus ParseFlags(int argc, const char** argv, Optimizer* optimizer,
- const char** in_file, const char** out_file);
+ const char** in_file, const char** out_file,
+ spv_validator_options options);
// Parses and handles the -Oconfig flag. |prog_name| contains the name of
// the spirv-opt binary (used to build a new argv vector for the recursive
@@ -276,7 +282,7 @@ OptStatus ParseOconfigFlag(const char* prog_name, const char* opt_flag,
}
return ParseFlags(static_cast<int>(flags.size()), new_argv, optimizer,
- in_file, out_file);
+ in_file, out_file, nullptr);
}
// Parses command-line flags. |argc| contains the number of command-line flags.
@@ -288,7 +294,8 @@ OptStatus ParseOconfigFlag(const char* prog_name, const char* opt_flag,
// optimization should continue and a status code indicating an error or
// success.
OptStatus ParseFlags(int argc, const char** argv, Optimizer* optimizer,
- const char** in_file, const char** out_file) {
+ const char** in_file, const char** out_file,
+ spv_validator_options options) {
for (int argi = 1; argi < argc; ++argi) {
const char* cur_arg = argv[argi];
if ('-' == cur_arg[0]) {
@@ -369,6 +376,8 @@ OptStatus ParseFlags(int argc, const char** argv, Optimizer* optimizer,
optimizer->RegisterPass(CreateCompactIdsPass());
} else if (0 == strcmp(cur_arg, "--cfg-cleanup")) {
optimizer->RegisterPass(CreateCFGCleanupPass());
+ } else if (0 == strcmp(cur_arg, "--relax-store-struct")) {
+ options->relax_struct_store = true;
} else if (0 == strcmp(cur_arg, "-O")) {
optimizer->RegisterPerformancePasses();
} else if (0 == strcmp(cur_arg, "-Os")) {
@@ -414,6 +423,7 @@ int main(int argc, const char** argv) {
const char* out_file = nullptr;
spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+ spv_validator_options options = spvValidatorOptionsCreate();
spvtools::Optimizer optimizer(target_env);
optimizer.SetMessageConsumer([](spv_message_level_t level, const char* source,
@@ -423,7 +433,9 @@ int main(int argc, const char** argv) {
<< std::endl;
});
- OptStatus status = ParseFlags(argc, argv, &optimizer, &in_file, &out_file);
+ OptStatus status =
+ ParseFlags(argc, argv, &optimizer, &in_file, &out_file, options);
+
if (status.action == OPT_STOP) {
return status.code;
}
@@ -442,14 +454,17 @@ int main(int argc, const char** argv) {
spv_context context = spvContextCreate(target_env);
spv_diagnostic diagnostic = nullptr;
spv_const_binary_t binary_struct = {binary.data(), binary.size()};
- spv_result_t error = spvValidate(context, &binary_struct, &diagnostic);
+ spv_result_t error =
+ spvValidateWithOptions(context, options, &binary_struct, &diagnostic);
if (error) {
spvDiagnosticPrint(diagnostic);
spvDiagnosticDestroy(diagnostic);
+ spvValidatorOptionsDestroy(options);
spvContextDestroy(context);
return error;
}
spvDiagnosticDestroy(diagnostic);
+ spvValidatorOptionsDestroy(options);
spvContextDestroy(context);
// By using the same vector as input and output, we save time in the case
diff --git a/tools/val/val.cpp b/tools/val/val.cpp
index 2c065196..050e7d68 100644
--- a/tools/val/val.cpp
+++ b/tools/val/val.cpp
@@ -44,6 +44,9 @@ Options:
--max-function-args <maximum number arguments allowed per function>
--max-control-flow-nesting-depth <maximum Control Flow nesting depth allowed>
--max-access-chain-indexes <maximum number of indexes allowed to use for Access Chain instructions>
+ --relax-struct-store Allow store from one struct type to a
+ different type with compatible layout and
+ members.
--version Display validator version information.
--target-env {vulkan1.0|spv1.0|spv1.1|spv1.2}
Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1/SPIR-V1.2 validation rules.
@@ -109,6 +112,8 @@ int main(int argc, char** argv) {
continue_processing = false;
return_code = 1;
}
+ } else if (0 == strcmp(cur_arg, "--relax-struct-store")) {
+ options.SetRelaxStructStore(true);
} else if (0 == cur_arg[1]) {
// Setting a filename of "-" to indicate stdin.
if (!inFile) {