Skip to content

Commit e8527cd

Browse files
Fix parsing of command line options for the SPIR-V Bakend API call
1 parent 7211bf4 commit e8527cd

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

llvm/lib/Target/SPIRV/SPIRVAPI.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,22 @@ static cl::opt<char> SpirvOptLevel("spirv-O", cl::Hidden, cl::Prefix,
4747
static cl::opt<std::string> SpirvTargetTriple("spirv-mtriple", cl::Hidden,
4848
cl::init(""));
4949

50+
std::once_flag InitOnceOpts;
5051
// Utility to accept options in a command line style.
5152
void parseSPIRVCommandLineOptions(const std::vector<std::string> &Options,
5253
raw_ostream *Errs) {
5354
static constexpr const char *Origin = "SPIRVTranslateModule";
55+
// Initialize command line parser dependencies just once and in a
56+
// thread-safe manner.
57+
std::call_once(InitOnceOpts, []() {
58+
std::vector<const char *> Argv(1, Origin);
59+
cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin,
60+
&llvm::nulls());
61+
});
62+
cl::ResetAllOptionOccurrences();
5463
if (!Options.empty()) {
5564
std::vector<const char *> Argv(1, Origin);
65+
// Parse options.
5666
for (const auto &Arg : Options)
5767
Argv.push_back(Arg.c_str());
5868
cl::ParseCommandLineOptions(Argv.size(), Argv.data(), Origin, Errs);

llvm/unittests/Target/SPIRV/SPIRVAPITest.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,29 @@ TEST_F(SPIRVAPITest, checkTranslateOk) {
9292
}
9393

9494
TEST_F(SPIRVAPITest, checkTranslateError) {
95-
std::string Result, Error;
96-
bool Status = toSpirv(OkAssembly, Result, Error, {},
97-
{"-mtriple=spirv32-unknown-unknown"});
98-
EXPECT_FALSE(Status);
99-
EXPECT_TRUE(Result.empty());
100-
EXPECT_THAT(Error,
101-
StartsWith("SPIRVTranslateModule: Unknown command line argument "
102-
"'-mtriple=spirv32-unknown-unknown'"));
103-
Status = toSpirv(OkAssembly, Result, Error, {}, {"--spirv-O 5"});
104-
EXPECT_FALSE(Status);
105-
EXPECT_TRUE(Result.empty());
106-
EXPECT_EQ(Error, "Invalid optimization level!");
95+
{
96+
std::string Result, Error;
97+
bool Status = toSpirv(OkAssembly, Result, Error, {},
98+
{"-mtriple=spirv32-unknown-unknown"});
99+
EXPECT_FALSE(Status);
100+
EXPECT_TRUE(Result.empty());
101+
EXPECT_THAT(
102+
Error, StartsWith("SPIRVTranslateModule: Unknown command line argument "
103+
"'-mtriple=spirv32-unknown-unknown'"));
104+
}
105+
{
106+
std::string Result, Error;
107+
bool Status = toSpirv(OkAssembly, Result, Error, {}, {"--spirv-O 5"});
108+
EXPECT_FALSE(Status);
109+
EXPECT_TRUE(Result.empty());
110+
EXPECT_EQ(Error, "Invalid optimization level!");
111+
}
112+
{
113+
std::string Result, Error;
114+
bool Status = toSpirv(OkAssembly, Result, Error, {}, {});
115+
EXPECT_TRUE(Status && Error.empty() && !Result.empty());
116+
EXPECT_EQ(identify_magic(Result), file_magic::spirv_object);
117+
}
107118
}
108119

109120
TEST_F(SPIRVAPITest, checkTranslateSupportExtensionByOpts) {

0 commit comments

Comments
 (0)