Add --target-env.
authorDejan Mircevski <deki@google.com>
Wed, 11 May 2016 13:48:52 +0000 (09:48 -0400)
committerDejan Mircevski <deki@google.com>
Wed, 11 May 2016 13:48:52 +0000 (09:48 -0400)
commit 7648187c344cfc7847607acb2a6fa5606a3d10c1
Author: Dejan Mircevski <deki@google.com>
Date:   Thu Apr 21 15:44:07 2016 -0400

    Turn --vulkan into --target-env.

source/CMakeLists.txt
source/spirv_target_env.cpp
source/spirv_target_env.h [new file with mode: 0644]
tools/CMakeLists.txt
tools/as/as.cpp
tools/val/val.cpp

index 5f238ee..c598846 100644 (file)
@@ -140,6 +140,7 @@ set(SPIRV_SOURCES
   ${CMAKE_CURRENT_SOURCE_DIR}/spirv_constant.h
   ${CMAKE_CURRENT_SOURCE_DIR}/spirv_definition.h
   ${CMAKE_CURRENT_SOURCE_DIR}/spirv_endian.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/spirv_target_env.h
   ${CMAKE_CURRENT_SOURCE_DIR}/table.h
   ${CMAKE_CURRENT_SOURCE_DIR}/text.h
   ${CMAKE_CURRENT_SOURCE_DIR}/text_handler.h
index 7713771..116d6b5 100644 (file)
@@ -24,7 +24,8 @@
 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 
-#include <assert.h>
+#include <cassert>
+#include <cstring>
 
 #include "spirv-tools/libspirv.h"
 #include "spirv_constant.h"
@@ -57,3 +58,19 @@ uint32_t spvVersionForTargetEnv(spv_target_env env) {
   assert(0 && "Unhandled SPIR-V target environment");
   return SPV_SPIRV_VERSION_WORD(0, 0);
 }
+
+bool spvParseTargetEnv(const char* s, spv_target_env* env) {
+  if (!strncmp(s, "vulkan1.0", strlen("vulkan1.0"))) {
+    if (env) *env = SPV_ENV_VULKAN_1_0;
+    return true;
+  } else if (!strncmp(s, "spv1.0", strlen("spv1.0"))) {
+    if (env) *env = SPV_ENV_UNIVERSAL_1_0;
+    return true;
+  } else if (!strncmp(s, "spv1.1", strlen("spv1.1"))) {
+    if (env) *env = SPV_ENV_UNIVERSAL_1_1;
+    return true;
+  } else {
+    if (env) *env = SPV_ENV_UNIVERSAL_1_0;
+    return false;
+  }
+}
diff --git a/source/spirv_target_env.h b/source/spirv_target_env.h
new file mode 100644 (file)
index 0000000..3b0975d
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright (c) 2016 Google.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
+// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
+// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
+//    https://www.khronos.org/registry/
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+#ifndef LIBSPIRV_SPIRV_TARGET_ENV_H_
+#define LIBSPIRV_SPIRV_TARGET_ENV_H_
+
+// Parses s into *env and returns true if successful.  If unparsable, returns
+// false and sets *env to SPV_ENV_UNIVERSAL_1_0.
+bool spvParseTargetEnv(const char* s, spv_target_env* env);
+
+#endif  // LIBSPIRV_SPIRV_TARGET_ENV_H_
index 702bc77..7ff3af5 100644 (file)
@@ -30,17 +30,20 @@ if (NOT ${SPIRV_SKIP_EXECUTABLES})
   add_executable(spirv-as ${CMAKE_CURRENT_SOURCE_DIR}/as/as.cpp)
   spvtools_default_compile_options(spirv-as)
   target_link_libraries(spirv-as PRIVATE ${SPIRV_TOOLS})
-  target_include_directories(spirv-as PRIVATE ${spirv-tools_BINARY_DIR})
+  target_include_directories(spirv-as
+    PRIVATE ${spirv-tools_BINARY_DIR} ${spirv-tools_SOURCE_DIR}/source)
 
   add_executable(spirv-dis ${CMAKE_CURRENT_SOURCE_DIR}/dis/dis.cpp)
   spvtools_default_compile_options(spirv-dis)
   target_link_libraries(spirv-dis PRIVATE ${SPIRV_TOOLS})
-  target_include_directories(spirv-dis PRIVATE ${spirv-tools_BINARY_DIR})
+  target_include_directories(spirv-dis
+    PRIVATE ${spirv-tools_BINARY_DIR} ${spirv-tools_SOURCE_DIR}/source)
 
   add_executable(spirv-val ${CMAKE_CURRENT_SOURCE_DIR}/val/val.cpp)
   spvtools_default_compile_options(spirv-val)
   target_link_libraries(spirv-val PRIVATE ${SPIRV_TOOLS})
-  target_include_directories(spirv-val PRIVATE ${spirv-tools_BINARY_DIR})
+  target_include_directories(spirv-val
+    PRIVATE ${spirv-tools_BINARY_DIR} ${spirv-tools_SOURCE_DIR}/source)
 
   install(TARGETS ${SPIRV_INSTALL_TARGETS}
     RUNTIME DESTINATION bin
index aec1b73..c894cfc 100644 (file)
 
 #include <cstdio>
 #include <cstring>
-
 #include <vector>
 
 #include "spirv-tools/libspirv.h"
+#include "spirv_target_env.h"
 
 void print_usage(char* argv0) {
   printf(
@@ -48,6 +48,8 @@ Options:
 
   -o <filename>   Set the output filename. Use '-' to mean stdout.
   --version       Display assembler version information.
+  --target-env {vulkan1.0|spv1.0|spv1.1}
+                  Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1 validation rules.
 )",
       argv0, argv0);
 }
@@ -55,7 +57,7 @@ Options:
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
   const char* outFile = nullptr;
-
+  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_1;
   for (int argi = 1; argi < argc; ++argi) {
     if ('-' == argv[argi][0]) {
       switch (argv[argi][1]) {
@@ -92,6 +94,19 @@ int main(int argc, char** argv) {
             print_usage(argv[0]);
             return 0;
           }
+          if (0 == strcmp(argv[argi], "--target-env")) {
+            if (argi + 1 < argc) {
+              const auto env_str = argv[++argi];
+              if (!spvParseTargetEnv(env_str, &target_env)) {
+                fprintf(stderr, "error: Unrecognized target env: %s\n",
+                        env_str);
+                return 1;
+              }
+            } else {
+              fprintf(stderr, "error: Missing argument to --target-env\n");
+              return 1;
+            }
+          }
         } break;
         default:
           print_usage(argv[0]);
@@ -125,7 +140,7 @@ int main(int argc, char** argv) {
 
   spv_binary binary;
   spv_diagnostic diagnostic = nullptr;
-  spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1);
+  spv_context context = spvContextCreate(target_env);
   spv_result_t error = spvTextToBinary(context, contents.data(),
                                        contents.size(), &binary, &diagnostic);
   spvContextDestroy(context);
index d7e998a..9a636af 100644 (file)
 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
+#include <cassert>
+#include <cstdio>
+#include <cstring>
 #include <vector>
 
 #include "spirv-tools/libspirv.h"
+#include "spirv_target_env.h"
 
 void print_usage(char* argv0) {
   printf(
@@ -46,6 +46,8 @@ NOTE: The validator is a work in progress.
 Options:
   -h, --help   Print this help.
   --version    Display validator version information.
+  --target-env {vulkan1.0|spv1.0|spv1.1}
+               Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1 validation rules.
 )",
       argv0, argv0);
 }
@@ -66,8 +68,17 @@ int main(int argc, char** argv) {
       } else if (0 == strcmp(cur_arg, "--help") || 0 == strcmp(cur_arg, "-h")) {
         print_usage(argv[0]);
         return 0;
-      } else if (0 == strcmp(cur_arg, "--vulkan")) {
-        target_env = SPV_ENV_VULKAN_1_0;
+      } else if (0 == strcmp(cur_arg, "--target-env")) {
+        if (argi + 1 < argc) {
+          const auto env_str = argv[++argi];
+          if (!spvParseTargetEnv(env_str, &target_env)) {
+            fprintf(stderr, "error: Unrecognized target env: %s\n", env_str);
+            return 1;
+          }
+        } else {
+          fprintf(stderr, "error: Missing argument to --target-env\n");
+          return 1;
+        }
       } else if (0 == cur_arg[1]) {
         // Setting a filename of "-" to indicate stdin.
         if (!inFile) {