[llvm] [SPIR-V] Fix parsing of command line options for the SPIR-V Backend API call (PR #124653)

Vyacheslav Levytskyy via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 27 22:11:39 PST 2025


https://github.com/VyacheslavLevytskyy updated https://github.com/llvm/llvm-project/pull/124653

>From e8527cd9583e28d4b71b8579e797f7b87554f604 Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Mon, 27 Jan 2025 15:13:23 -0800
Subject: [PATCH 1/3] Fix parsing of command line options for the SPIR-V Bakend
 API call

---
 llvm/lib/Target/SPIRV/SPIRVAPI.cpp           | 10 ++++++
 llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp | 35 +++++++++++++-------
 2 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
index 95c9b0e52006085..6147198ce7e937c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
@@ -47,12 +47,22 @@ static cl::opt<char> SpirvOptLevel("spirv-O", cl::Hidden, cl::Prefix,
 static cl::opt<std::string> SpirvTargetTriple("spirv-mtriple", cl::Hidden,
                                               cl::init(""));
 
+std::once_flag InitOnceOpts;
 // Utility to accept options in a command line style.
 void parseSPIRVCommandLineOptions(const std::vector<std::string> &Options,
                                   raw_ostream *Errs) {
   static constexpr const char *Origin = "SPIRVTranslateModule";
+  // Initialize command line parser dependencies just once and in a
+  // thread-safe manner.
+  std::call_once(InitOnceOpts, []() {
+    std::vector<const char *> Argv(1, Origin);
+    cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin,
+                                &llvm::nulls());
+  });
+  cl::ResetAllOptionOccurrences();
   if (!Options.empty()) {
     std::vector<const char *> Argv(1, Origin);
+    // Parse options.
     for (const auto &Arg : Options)
       Argv.push_back(Arg.c_str());
     cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin, Errs);
diff --git a/llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp b/llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp
index f0b4a2f55c1519d..60458f86521328b 100644
--- a/llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp
+++ b/llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp
@@ -92,18 +92,29 @@ TEST_F(SPIRVAPITest, checkTranslateOk) {
 }
 
 TEST_F(SPIRVAPITest, checkTranslateError) {
-  std::string Result, Error;
-  bool Status = toSpirv(OkAssembly, Result, Error, {},
-                        {"-mtriple=spirv32-unknown-unknown"});
-  EXPECT_FALSE(Status);
-  EXPECT_TRUE(Result.empty());
-  EXPECT_THAT(Error,
-              StartsWith("SPIRVTranslateModule: Unknown command line argument "
-                         "'-mtriple=spirv32-unknown-unknown'"));
-  Status = toSpirv(OkAssembly, Result, Error, {}, {"--spirv-O 5"});
-  EXPECT_FALSE(Status);
-  EXPECT_TRUE(Result.empty());
-  EXPECT_EQ(Error, "Invalid optimization level!");
+  {
+    std::string Result, Error;
+    bool Status = toSpirv(OkAssembly, Result, Error, {},
+                          {"-mtriple=spirv32-unknown-unknown"});
+    EXPECT_FALSE(Status);
+    EXPECT_TRUE(Result.empty());
+    EXPECT_THAT(
+        Error, StartsWith("SPIRVTranslateModule: Unknown command line argument "
+                          "'-mtriple=spirv32-unknown-unknown'"));
+  }
+  {
+    std::string Result, Error;
+    bool Status = toSpirv(OkAssembly, Result, Error, {}, {"--spirv-O 5"});
+    EXPECT_FALSE(Status);
+    EXPECT_TRUE(Result.empty());
+    EXPECT_EQ(Error, "Invalid optimization level!");
+  }
+  {
+    std::string Result, Error;
+    bool Status = toSpirv(OkAssembly, Result, Error, {}, {});
+    EXPECT_TRUE(Status && Error.empty() && !Result.empty());
+    EXPECT_EQ(identify_magic(Result), file_magic::spirv_object);
+  }
 }
 
 TEST_F(SPIRVAPITest, checkTranslateSupportExtensionByOpts) {

>From ba9970b23d17cc6c40f1270641c9f625a18326ee Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Mon, 27 Jan 2025 22:05:23 -0800
Subject: [PATCH 2/3] Fix parsing of command line options for the SPIR-V Bakend
 API call

---
 llvm/lib/Target/SPIRV/SPIRVAPI.cpp | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
index 6147198ce7e937c..ba0f1eec13947c0 100644
--- a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
@@ -32,6 +32,7 @@
 #include "llvm/TargetParser/SubtargetFeature.h"
 #include "llvm/TargetParser/Triple.h"
 #include <optional>
+#include <mutex>
 #include <string>
 #include <utility>
 #include <vector>
@@ -47,25 +48,25 @@ static cl::opt<char> SpirvOptLevel("spirv-O", cl::Hidden, cl::Prefix,
 static cl::opt<std::string> SpirvTargetTriple("spirv-mtriple", cl::Hidden,
                                               cl::init(""));
 
-std::once_flag InitOnceOpts;
+std::mutex MParseOpts;
 // Utility to accept options in a command line style.
 void parseSPIRVCommandLineOptions(const std::vector<std::string> &Options,
                                   raw_ostream *Errs) {
   static constexpr const char *Origin = "SPIRVTranslateModule";
-  // Initialize command line parser dependencies just once and in a
-  // thread-safe manner.
-  std::call_once(InitOnceOpts, []() {
-    std::vector<const char *> Argv(1, Origin);
-    cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin,
-                                &llvm::nulls());
-  });
-  cl::ResetAllOptionOccurrences();
   if (!Options.empty()) {
     std::vector<const char *> Argv(1, Origin);
-    // Parse options.
     for (const auto &Arg : Options)
       Argv.push_back(Arg.c_str());
-    cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin, Errs);
+    {
+      const std::lock_guard<std::mutex> LParseOpts(MParseOpts);
+      // Reset previous run and parse in a thread-safe manner.
+      cl::ResetAllOptionOccurrences();
+      cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin, Errs);
+    }
+  } else {
+    const std::lock_guard<std::mutex> LParseOpts(MParseOpts);
+    // Reset previous run.
+    cl::ResetAllOptionOccurrences();
   }
 }
 

>From 898f393870c486a04f1396db54f0441dad8c6f76 Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Mon, 27 Jan 2025 22:11:29 -0800
Subject: [PATCH 3/3] clang-format

---
 llvm/lib/Target/SPIRV/SPIRVAPI.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
index ba0f1eec13947c0..4da9cde2c79c07a 100644
--- a/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVAPI.cpp
@@ -31,8 +31,8 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
 #include "llvm/TargetParser/Triple.h"
-#include <optional>
 #include <mutex>
+#include <optional>
 #include <string>
 #include <utility>
 #include <vector>



More information about the llvm-commits mailing list