[spirv-reader] Support Location on module vars
Bug: tint:3
Change-Id: If7fc85251cbffab477b0b4f86c204de6c6a853f6
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/25103
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index ebddea9..69fe861 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -942,6 +942,15 @@
ast_decorations.emplace_back(
std::make_unique<ast::BuiltinDecoration>(ast_builtin));
}
+ if (deco[0] == SpvDecorationLocation) {
+ if (deco.size() != 2) {
+ Fail() << "malformed Location decoration on ID " << id
+ << ": requires one literal operand";
+ return nullptr;
+ }
+ ast_decorations.emplace_back(
+ std::make_unique<ast::LocationDecoration>(deco[1]));
+ }
}
if (!ast_decorations.empty()) {
auto decorated_var =
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index 11e0f4a..da57fd8 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -1117,6 +1117,57 @@
<< module_str;
}
+TEST_F(SpvParserTest, ModuleScopeVar_LocationDecoration_Valid) {
+ auto* p = parser(test::Assemble(R"(
+ OpName %myvar "myvar"
+ OpDecorate %myvar Location 3
+)" + CommonTypes() + R"(
+ %ptr = OpTypePointer Input %uint
+ %myvar = OpVariable %ptr Input
+ )"));
+ ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
+ EXPECT_TRUE(p->error().empty());
+ const auto module_str = p->module().to_str();
+ EXPECT_THAT(module_str, HasSubstr(R"(
+ DecoratedVariable{
+ Decorations{
+ LocationDecoration{3}
+ }
+ myvar
+ in
+ __u32
+ })"))
+ << module_str;
+}
+
+TEST_F(SpvParserTest,
+ ModuleScopeVar_LocationDecoration_MissingOperandWontAssemble) {
+ const auto assembly = R"(
+ OpName %myvar "myvar"
+ OpDecorate %myvar Location
+)" + CommonTypes() + R"(
+ %ptr = OpTypePointer Input %uint
+ %myvar = OpVariable %ptr Input
+ )";
+ EXPECT_THAT(test::AssembleFailure(assembly),
+ Eq("4:4: Expected operand, found next instruction instead."));
+}
+
+TEST_F(SpvParserTest,
+ ModuleScopeVar_LocationDecoration_TwoOperandsWontAssemble) {
+ const auto assembly = R"(
+ OpName %myvar "myvar"
+ OpDecorate %myvar Location 3 4
+)" + CommonTypes() + R"(
+ %ptr = OpTypePointer Input %uint
+ %myvar = OpVariable %ptr Input
+ )";
+ EXPECT_THAT(
+ test::AssembleFailure(assembly),
+ Eq("2:34: Expected <opcode> or <result-id> at the beginning of an "
+ "instruction, found '4'."));
+}
+
} // namespace
} // namespace spirv
} // namespace reader