[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