[clang] [llvm] [SPIRV][HLSL] Add DXC compatibility option for extension (PR #151554)

Steven Perron via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 1 08:12:00 PDT 2025


https://github.com/s-perron updated https://github.com/llvm/llvm-project/pull/151554

>From 900c99b8b3f317adcb8d897dbdc5f90fb91b4ddf Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Thu, 31 Jul 2025 12:16:43 -0400
Subject: [PATCH 1/7] [SPIRV][HLSL] Add DXC compatibility option for extension

The default behaviour in DXC is to allow all extesions the compiler
knows about. We did the same in clang: all extensions that clang knows
about. However, this causes the shader to use different extensions
because the two compilers have different sets of extensions.

To avoid using a new extension when moving from DXC to Clang, we add the
special DXC suboptions to `-fspv-extension". If `-fspv-extension=DXC` is
used, then the available extensions will be those available in DXC.
---
 clang/include/clang/Driver/Options.td      |  8 ++-
 clang/lib/Driver/ToolChains/HLSL.cpp       | 66 ++++++++++++++++++++--
 clang/test/Driver/dxc_fspv_extension.hlsl  |  8 +++
 llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp | 42 ++++++++++++++
 4 files changed, 116 insertions(+), 8 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index eb53821bbf4d5..9471e9edcfd76 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -9428,8 +9428,12 @@ def fspv_target_env_EQ : Joined<["-"], "fspv-target-env=">, Group<dxc_Group>,
 def fspv_extension_EQ
     : Joined<["-"], "fspv-extension=">,
       Group<dxc_Group>,
-      HelpText<"Specify the available SPIR-V extensions. If this option is not "
-               "specified, then all extensions are available.">;
+      HelpText<
+          "Specify the available SPIR-V extensions. If this option is not "
+          "specified, then all extensions are available. If KHR is specified, "
+          "then all KHR extensions will be available. If DXC is specified, "
+          "then all extensions implemented by the DirectXShader compiler will "
+          "be available. This option is useful for moving from DXC to Clang.">;
 def fvk_use_dx_layout
     : DXCFlag<"fvk-use-dx-layout">,
       HelpText<"Use DirectX memory layout for Vulkan resources.">;
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 38f4643abad98..48761c254dfd8 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -173,24 +173,78 @@ bool isLegalValidatorVersion(StringRef ValVersionStr, const Driver &D) {
   return true;
 }
 
+std::string getSpirvExtOperand(llvm::StringRef SpvExtensionArg) {
+  // The extensions that are commented out are supported in DXC, but the SPIR-V
+  // backend does not know about them yet.
+  static const std::vector<std::string> DxcSupportedExtensions = {
+      "SPV_KHR_16bit_storage",
+      "SPV_KHR_device_group",
+      "SPV_KHR_fragment_shading_rate",
+      "SPV_KHR_multiview",
+      "SPV_KHR_post_depth_coverage",
+      "SPV_KHR_non_semantic_info",
+      "SPV_KHR_shader_draw_parameters",
+      "SPV_KHR_ray_tracing",
+      "SPV_KHR_shader_clock",
+      "SPV_EXT_demote_to_helper_invocation",
+      "SPV_EXT_descriptor_indexing",
+      "SPV_EXT_fragment_fully_covered",
+      "SPV_EXT_fragment_invocation_density",
+      "SPV_EXT_fragment_shader_interlock",
+      "SPV_EXT_mesh_shader",
+      "SPV_EXT_shader_stencil_export",
+      "SPV_EXT_shader_viewport_index_layer",
+      // "SPV_AMD_shader_early_and_late_fragment_tests",
+      "SPV_GOOGLE_hlsl_functionality1",
+      "SPV_GOOGLE_user_type",
+      "SPV_KHR_ray_query",
+      "SPV_EXT_shader_image_int64",
+      "SPV_KHR_fragment_shader_barycentric",
+      "SPV_KHR_physical_storage_buffer",
+      "SPV_KHR_vulkan_memory_model",
+      // "SPV_KHR_compute_shader_derivatives",
+      // "SPV_KHR_maximal_reconvergence",
+      "SPV_KHR_float_controls",
+      "SPV_NV_shader_subgroup_partitioned",
+      // "SPV_KHR_quad_control"
+  };
+
+  if (SpvExtensionArg.starts_with("SPV_")) {
+    return ("+" + SpvExtensionArg).str();
+  }
+  if (SpvExtensionArg.compare_insensitive("DXC") == 0) {
+    bool first = true;
+    std::string Operand;
+    for (llvm::StringRef E : DxcSupportedExtensions) {
+      if (first) {
+        Operand = (Operand + "+" + E).str();
+        first = false;
+        continue;
+      }
+      Operand = (Operand + ",+" + E).str();
+    }
+    return Operand;
+  }
+  return SpvExtensionArg.str();
+}
+
 std::string getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
   if (SpvExtensionArgs.empty()) {
     return "-spirv-ext=all";
   }
 
   std::string LlvmOption =
-      (Twine("-spirv-ext=+") + SpvExtensionArgs.front()).str();
+      "-spirv-ext=" + getSpirvExtOperand(SpvExtensionArgs[0]);
   SpvExtensionArgs = SpvExtensionArgs.slice(1);
-  for (auto Extension : SpvExtensionArgs) {
-    if (Extension != "KHR")
-      Extension = (Twine("+") + Extension).str();
-    LlvmOption = (Twine(LlvmOption) + "," + Extension).str();
+  for (llvm::StringRef Extension : SpvExtensionArgs) {
+    LlvmOption =
+        (Twine(LlvmOption) + "," + getSpirvExtOperand(Extension)).str();
   }
   return LlvmOption;
 }
 
 bool isValidSPIRVExtensionName(const std::string &str) {
-  std::regex pattern("KHR|SPV_[a-zA-Z0-9_]+");
+  std::regex pattern("dxc|DXC|KHR|SPV_[a-zA-Z0-9_]+");
   return std::regex_match(str, pattern);
 }
 
diff --git a/clang/test/Driver/dxc_fspv_extension.hlsl b/clang/test/Driver/dxc_fspv_extension.hlsl
index f09f21e8a72c9..0c9d3f5409984 100644
--- a/clang/test/Driver/dxc_fspv_extension.hlsl
+++ b/clang/test/Driver/dxc_fspv_extension.hlsl
@@ -14,6 +14,14 @@
 // RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=SPV_TEST1 -fspv-extension=KHR -fspv-extension=SPV_TEST2 2>&1 | FileCheck %s -check-prefix=TEST3
 // TEST3: "-spirv-ext=+SPV_TEST1,KHR,+SPV_TEST2"
 
+// Merge KHR with other extensions.
+// RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=KHR -fspv-extension=SPV_TEST2 2>&1 | FileCheck %s -check-prefix=TEST4
+// TEST4: "-spirv-ext=KHR,+SPV_TEST2"
+
+// Merge KHR with other extensions.
+// RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=DXC 2>&1 | FileCheck %s -check-prefix=TEST5
+// TEST5: "-spirv-ext={{(\+SPV_[a-zA-Z0-9_]+,?)+}}"
+
 // Check for the error message if the extension name is not properly formed.
 // RUN: not %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=KHR_BAD -fspv-extension=TEST1 -fspv-extension=SPV_GOOD -fspv-extension=TEST2 2>&1 | FileCheck %s -check-prefix=FAIL
 // FAIL: invalid value 'KHR_BAD' in '-fspv-extension'
diff --git a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
index 2726203d253ad..08fe8111a15b7 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
@@ -32,6 +32,24 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
          SPIRV::Extension::Extension::SPV_EXT_arithmetic_fence},
         {"SPV_EXT_demote_to_helper_invocation",
          SPIRV::Extension::Extension::SPV_EXT_demote_to_helper_invocation},
+        {"SPV_EXT_descriptor_indexing",
+         SPIRV::Extension::Extension::SPV_EXT_descriptor_indexing},
+        {"SPV_EXT_fragment_fully_covered",
+         SPIRV::Extension::Extension::SPV_EXT_fragment_fully_covered},
+        {"SPV_EXT_fragment_invocation_density",
+         SPIRV::Extension::Extension::SPV_EXT_fragment_invocation_density},
+        {"SPV_EXT_fragment_shader_interlock",
+         SPIRV::Extension::Extension::SPV_EXT_fragment_shader_interlock},
+        {"SPV_EXT_mesh_shader",
+         SPIRV::Extension::Extension::SPV_EXT_mesh_shader},
+        {"SPV_EXT_shader_stencil_export",
+         SPIRV::Extension::Extension::SPV_EXT_shader_stencil_export},
+        {"SPV_EXT_shader_viewport_index_layer",
+         SPIRV::Extension::Extension::SPV_EXT_shader_viewport_index_layer},
+        {"SPV_GOOGLE_hlsl_functionality1",
+         SPIRV::Extension::Extension::SPV_GOOGLE_hlsl_functionality1},
+        {"SPV_GOOGLE_user_type",
+         SPIRV::Extension::Extension::SPV_GOOGLE_user_type},
         {"SPV_INTEL_arbitrary_precision_integers",
          SPIRV::Extension::Extension::SPV_INTEL_arbitrary_precision_integers},
         {"SPV_INTEL_cache_controls",
@@ -57,6 +75,19 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
          SPIRV::Extension::Extension::SPV_INTEL_memory_access_aliasing},
         {"SPV_INTEL_joint_matrix",
          SPIRV::Extension::Extension::SPV_INTEL_joint_matrix},
+        {"SPV_KHR_16bit_storage",
+         SPIRV::Extension::Extension::SPV_KHR_16bit_storage},
+        {"SPV_KHR_device_group",
+         SPIRV::Extension::Extension::SPV_KHR_device_group},
+        {"SPV_KHR_fragment_shading_rate",
+         SPIRV::Extension::Extension::SPV_KHR_fragment_shading_rate},
+        {"SPV_KHR_multiview", SPIRV::Extension::Extension::SPV_KHR_multiview},
+        {"SPV_KHR_post_depth_coverage",
+         SPIRV::Extension::Extension::SPV_KHR_post_depth_coverage},
+        {"SPV_KHR_shader_draw_parameters",
+         SPIRV::Extension::Extension::SPV_KHR_shader_draw_parameters},
+        {"SPV_KHR_ray_tracing",
+         SPIRV::Extension::Extension::SPV_KHR_ray_tracing},
         {"SPV_KHR_uniform_group_instructions",
          SPIRV::Extension::Extension::SPV_KHR_uniform_group_instructions},
         {"SPV_KHR_no_integer_wrap_decoration",
@@ -89,6 +120,17 @@ static const std::map<std::string, SPIRV::Extension::Extension, std::less<>>
          SPIRV::Extension::Extension::SPV_KHR_cooperative_matrix},
         {"SPV_KHR_non_semantic_info",
          SPIRV::Extension::Extension::SPV_KHR_non_semantic_info},
+        {"SPV_KHR_ray_query", SPIRV::Extension::Extension::SPV_KHR_ray_query},
+        {"SPV_EXT_shader_image_int64",
+         SPIRV::Extension::Extension::SPV_EXT_shader_image_int64},
+        {"SPV_KHR_fragment_shader_barycentric",
+         SPIRV::Extension::Extension::SPV_KHR_fragment_shader_barycentric},
+        {"SPV_KHR_physical_storage_buffer",
+         SPIRV::Extension::Extension::SPV_KHR_physical_storage_buffer},
+        {"SPV_KHR_vulkan_memory_model",
+         SPIRV::Extension::Extension::SPV_KHR_vulkan_memory_model},
+        {"SPV_NV_shader_subgroup_partitioned",
+         SPIRV::Extension::Extension::SPV_NV_shader_subgroup_partitioned},
         {"SPV_INTEL_long_composites",
          SPIRV::Extension::Extension::SPV_INTEL_long_composites},
         {"SPV_INTEL_fp_max_error",

>From 82730ee8c8ba3f8efcd7ff78bf462dd605d323d2 Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Thu, 31 Jul 2025 21:39:50 -0400
Subject: [PATCH 2/7] Use ostream to build strings.

---
 clang/include/clang/Driver/Options.td |  4 +--
 clang/lib/Driver/ToolChains/HLSL.cpp  | 40 +++++++++++++++------------
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 9471e9edcfd76..e9d25e70b7ab6 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -9431,8 +9431,8 @@ def fspv_extension_EQ
       HelpText<
           "Specify the available SPIR-V extensions. If this option is not "
           "specified, then all extensions are available. If KHR is specified, "
-          "then all KHR extensions will be available. If DXC is specified, "
-          "then all extensions implemented by the DirectXShader compiler will "
+          "then all KHR extensions will be available. If DXC is specifided, "
+          "then all extensions implemented by the DirectX Shader compiler will "
           "be available. This option is useful for moving from DXC to Clang.">;
 def fvk_use_dx_layout
     : DXCFlag<"fvk-use-dx-layout">,
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 48761c254dfd8..1572ab87f7491 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -173,10 +173,10 @@ bool isLegalValidatorVersion(StringRef ValVersionStr, const Driver &D) {
   return true;
 }
 
-std::string getSpirvExtOperand(llvm::StringRef SpvExtensionArg) {
+void getSpirvExtOperand(llvm::StringRef SpvExtensionArg, raw_ostream &out) {
   // The extensions that are commented out are supported in DXC, but the SPIR-V
   // backend does not know about them yet.
-  static const std::vector<std::string> DxcSupportedExtensions = {
+  static const std::vector<StringRef> DxcSupportedExtensions = {
       "SPV_KHR_16bit_storage",
       "SPV_KHR_device_group",
       "SPV_KHR_fragment_shading_rate",
@@ -210,35 +210,41 @@ std::string getSpirvExtOperand(llvm::StringRef SpvExtensionArg) {
   };
 
   if (SpvExtensionArg.starts_with("SPV_")) {
-    return ("+" + SpvExtensionArg).str();
+    out << "+" << SpvExtensionArg;
+    return;
   }
+
   if (SpvExtensionArg.compare_insensitive("DXC") == 0) {
     bool first = true;
     std::string Operand;
     for (llvm::StringRef E : DxcSupportedExtensions) {
-      if (first) {
-        Operand = (Operand + "+" + E).str();
+      if (!first)
+        out << ",";
+      else
         first = false;
-        continue;
-      }
-      Operand = (Operand + ",+" + E).str();
+      out << "+" << E;
     }
-    return Operand;
+    return;
   }
-  return SpvExtensionArg.str();
+  out << SpvExtensionArg;
+  return;
 }
 
-std::string getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
+llvm::SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
   if (SpvExtensionArgs.empty()) {
-    return "-spirv-ext=all";
+    return llvm::StringRef("-spirv-ext=all");
   }
 
-  std::string LlvmOption =
-      "-spirv-ext=" + getSpirvExtOperand(SpvExtensionArgs[0]);
+  llvm::SmallString<1024> LlvmOption;
+  raw_svector_ostream out(LlvmOption);
+
+  out << "-spirv-ext=";
+  getSpirvExtOperand(SpvExtensionArgs[0], out);
+
   SpvExtensionArgs = SpvExtensionArgs.slice(1);
   for (llvm::StringRef Extension : SpvExtensionArgs) {
-    LlvmOption =
-        (Twine(LlvmOption) + "," + getSpirvExtOperand(Extension)).str();
+    out << ",";
+    getSpirvExtOperand(Extension, out);
   }
   return LlvmOption;
 }
@@ -425,7 +431,7 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
     std::vector<std::string> SpvExtensionArgs =
         Args.getAllArgValues(options::OPT_fspv_extension_EQ);
     if (checkExtensionArgsAreValid(SpvExtensionArgs, getDriver())) {
-      std::string LlvmOption = getSpirvExtArg(SpvExtensionArgs);
+      llvm::SmallString<1024> LlvmOption = getSpirvExtArg(SpvExtensionArgs);
       DAL->AddSeparateArg(nullptr, Opts.getOption(options::OPT_mllvm),
                           LlvmOption);
     }

>From 96b944fc8b50715f1c8cf42176d4b6cfca905de7 Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 1 Aug 2025 11:10:45 -0400
Subject: [PATCH 3/7] Update clang/lib/Driver/ToolChains/HLSL.cpp

Co-authored-by: Chris B <beanz at abolishcrlf.org>
---
 clang/lib/Driver/ToolChains/HLSL.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 1572ab87f7491..b751471a16274 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -217,7 +217,7 @@ void getSpirvExtOperand(llvm::StringRef SpvExtensionArg, raw_ostream &out) {
   if (SpvExtensionArg.compare_insensitive("DXC") == 0) {
     bool first = true;
     std::string Operand;
-    for (llvm::StringRef E : DxcSupportedExtensions) {
+    for (StringRef E : DxcSupportedExtensions) {
       if (!first)
         out << ",";
       else

>From 0049bac6e2d136454370c4a879d814db500f056a Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 1 Aug 2025 11:11:08 -0400
Subject: [PATCH 4/7] Update clang/lib/Driver/ToolChains/HLSL.cpp

Co-authored-by: Chris B <beanz at abolishcrlf.org>
---
 clang/lib/Driver/ToolChains/HLSL.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index b751471a16274..9022bbdd635f9 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -173,7 +173,7 @@ bool isLegalValidatorVersion(StringRef ValVersionStr, const Driver &D) {
   return true;
 }
 
-void getSpirvExtOperand(llvm::StringRef SpvExtensionArg, raw_ostream &out) {
+void getSpirvExtOperand(StringRef SpvExtensionArg, raw_ostream &out) {
   // The extensions that are commented out are supported in DXC, but the SPIR-V
   // backend does not know about them yet.
   static const std::vector<StringRef> DxcSupportedExtensions = {

>From ea2db605a0881c93e863d3c1bf79c8339d23be71 Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 1 Aug 2025 11:11:22 -0400
Subject: [PATCH 5/7] Update clang/lib/Driver/ToolChains/HLSL.cpp

Co-authored-by: Chris B <beanz at abolishcrlf.org>
---
 clang/lib/Driver/ToolChains/HLSL.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 9022bbdd635f9..82974701a4859 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -230,7 +230,7 @@ void getSpirvExtOperand(StringRef SpvExtensionArg, raw_ostream &out) {
   return;
 }
 
-llvm::SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
+SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
   if (SpvExtensionArgs.empty()) {
     return llvm::StringRef("-spirv-ext=all");
   }

>From 4371f50dd7dbc32da14a6d2b24586f77de38636e Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 1 Aug 2025 11:11:31 -0400
Subject: [PATCH 6/7] Update clang/lib/Driver/ToolChains/HLSL.cpp

Co-authored-by: Chris B <beanz at abolishcrlf.org>
---
 clang/lib/Driver/ToolChains/HLSL.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 82974701a4859..79b49d1fad549 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -232,7 +232,7 @@ void getSpirvExtOperand(StringRef SpvExtensionArg, raw_ostream &out) {
 
 SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
   if (SpvExtensionArgs.empty()) {
-    return llvm::StringRef("-spirv-ext=all");
+    return StringRef("-spirv-ext=all");
   }
 
   llvm::SmallString<1024> LlvmOption;

>From 78e60e695b0550351c500d9521a4fbfea62d1c8e Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 1 Aug 2025 11:11:49 -0400
Subject: [PATCH 7/7] Update clang/lib/Driver/ToolChains/HLSL.cpp

Co-authored-by: Chris B <beanz at abolishcrlf.org>
---
 clang/lib/Driver/ToolChains/HLSL.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 79b49d1fad549..0a39ab1352bdb 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -242,7 +242,7 @@ SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
   getSpirvExtOperand(SpvExtensionArgs[0], out);
 
   SpvExtensionArgs = SpvExtensionArgs.slice(1);
-  for (llvm::StringRef Extension : SpvExtensionArgs) {
+  for (StringRef Extension : SpvExtensionArgs) {
     out << ",";
     getSpirvExtOperand(Extension, out);
   }



More information about the llvm-commits mailing list