spirv-fuzz: Fix regression (#3396)
Fixes #3392.
diff --git a/source/fuzz/fuzzer_util.cpp b/source/fuzz/fuzzer_util.cpp
index f09943f..a5475d1 100644
--- a/source/fuzz/fuzzer_util.cpp
+++ b/source/fuzz/fuzzer_util.cpp
@@ -550,6 +550,39 @@
type.AsDeviceEvent() || type.AsReserveId() || type.AsQueue();
}
+bool GlobalVariablesMustBeDeclaredInEntryPointInterfaces(
+ const opt::IRContext* ir_context) {
+ // TODO(afd): We capture the universal environments for which this requirement
+ // holds. The check should be refined on demand for other target
+ // environments.
+ switch (ir_context->grammar().target_env()) {
+ case SPV_ENV_UNIVERSAL_1_0:
+ case SPV_ENV_UNIVERSAL_1_1:
+ case SPV_ENV_UNIVERSAL_1_2:
+ case SPV_ENV_UNIVERSAL_1_3:
+ return false;
+ default:
+ return true;
+ }
+}
+
+void AddVariableIdToEntryPointInterfaces(opt::IRContext* context, uint32_t id) {
+ if (GlobalVariablesMustBeDeclaredInEntryPointInterfaces(context)) {
+ // Conservatively add this global to the interface of every entry point in
+ // the module. This means that the global is available for other
+ // transformations to use.
+ //
+ // A downside of this is that the global will be in the interface even if it
+ // ends up never being used.
+ //
+ // TODO(https://github.com/KhronosGroup/SPIRV-Tools/issues/3111) revisit
+ // this if a more thorough approach to entry point interfaces is taken.
+ for (auto& entry_point : context->module()->entry_points()) {
+ entry_point.AddOperand({SPV_OPERAND_TYPE_ID, {id}});
+ }
+ }
+}
+
} // namespace fuzzerutil
} // namespace fuzz
diff --git a/source/fuzz/fuzzer_util.h b/source/fuzz/fuzzer_util.h
index bccd1d0..fb2686b 100644
--- a/source/fuzz/fuzzer_util.h
+++ b/source/fuzz/fuzzer_util.h
@@ -215,6 +215,17 @@
// to have an OpConstantNull value.
bool IsNullConstantSupported(const opt::analysis::Type& type);
+// Returns true if and only if the SPIR-V version being used requires that
+// global variables accessed in the static call graph of an entry point need
+// to be listed in that entry point's interface.
+bool GlobalVariablesMustBeDeclaredInEntryPointInterfaces(
+ const opt::IRContext* context);
+
+// Adds |id| into the interface of every entry point of the shader.
+// Does nothing if SPIR-V doesn't require global variables, that are accessed
+// from an entry point function, to be listed in that function's interface.
+void AddVariableIdToEntryPointInterfaces(opt::IRContext* context, uint32_t id);
+
} // namespace fuzzerutil
} // namespace fuzz
diff --git a/source/fuzz/transformation_add_global_variable.cpp b/source/fuzz/transformation_add_global_variable.cpp
index 6464bfb..077ed6b 100644
--- a/source/fuzz/transformation_add_global_variable.cpp
+++ b/source/fuzz/transformation_add_global_variable.cpp
@@ -105,20 +105,8 @@
input_operands));
fuzzerutil::UpdateModuleIdBound(ir_context, message_.fresh_id());
- if (GlobalVariablesMustBeDeclaredInEntryPointInterfaces(ir_context)) {
- // Conservatively add this global to the interface of every entry point in
- // the module. This means that the global is available for other
- // transformations to use.
- //
- // A downside of this is that the global will be in the interface even if it
- // ends up never being used.
- //
- // TODO(https://github.com/KhronosGroup/SPIRV-Tools/issues/3111) revisit
- // this if a more thorough approach to entry point interfaces is taken.
- for (auto& entry_point : ir_context->module()->entry_points()) {
- entry_point.AddOperand({SPV_OPERAND_TYPE_ID, {message_.fresh_id()}});
- }
- }
+ fuzzerutil::AddVariableIdToEntryPointInterfaces(ir_context,
+ message_.fresh_id());
if (message_.value_is_irrelevant()) {
transformation_context->GetFactManager()->AddFactValueOfPointeeIsIrrelevant(
@@ -137,22 +125,5 @@
return result;
}
-bool TransformationAddGlobalVariable::
- GlobalVariablesMustBeDeclaredInEntryPointInterfaces(
- opt::IRContext* ir_context) {
- // TODO(afd): We capture the universal environments for which this requirement
- // holds. The check should be refined on demand for other target
- // environments.
- switch (ir_context->grammar().target_env()) {
- case SPV_ENV_UNIVERSAL_1_0:
- case SPV_ENV_UNIVERSAL_1_1:
- case SPV_ENV_UNIVERSAL_1_2:
- case SPV_ENV_UNIVERSAL_1_3:
- return false;
- default:
- return true;
- }
-}
-
} // namespace fuzz
} // namespace spvtools
diff --git a/source/fuzz/transformation_add_global_variable.h b/source/fuzz/transformation_add_global_variable.h
index 289af9e..89bd044 100644
--- a/source/fuzz/transformation_add_global_variable.h
+++ b/source/fuzz/transformation_add_global_variable.h
@@ -58,12 +58,6 @@
protobufs::Transformation ToMessage() const override;
private:
- // Returns true if and only if the SPIR-V version being used requires that
- // global variables accessed in the static call graph of an entry point need
- // to be listed in that entry point's interface.
- static bool GlobalVariablesMustBeDeclaredInEntryPointInterfaces(
- opt::IRContext* ir_context);
-
protobufs::TransformationAddGlobalVariable message_;
};
diff --git a/source/fuzz/transformation_push_id_through_variable.cpp b/source/fuzz/transformation_push_id_through_variable.cpp
index c691148..fb7946a 100644
--- a/source/fuzz/transformation_push_id_through_variable.cpp
+++ b/source/fuzz/transformation_push_id_through_variable.cpp
@@ -109,6 +109,9 @@
ir_context, SpvOpVariable, pointer_type_id, message_.variable_id(),
opt::Instruction::OperandList(
{{SPV_OPERAND_TYPE_STORAGE_CLASS, {SpvStorageClassPrivate}}})));
+
+ fuzzerutil::AddVariableIdToEntryPointInterfaces(ir_context,
+ message_.variable_id());
} else {
ir_context
->get_instr_block(
diff --git a/test/fuzz/transformation_push_id_through_variable_test.cpp b/test/fuzz/transformation_push_id_through_variable_test.cpp
index e00ee3a..f0bd3a6 100644
--- a/test/fuzz/transformation_push_id_through_variable_test.cpp
+++ b/test/fuzz/transformation_push_id_through_variable_test.cpp
@@ -350,7 +350,7 @@
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main" %92 %52 %53
+ OpEntryPoint Fragment %4 "main" %92 %52 %53 %109
OpExecutionMode %4 OriginUpperLeft
OpSource ESSL 310
OpDecorate %92 BuiltIn FragCoord