Validate the SPIR-V code in debug builds

https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkShaderModuleCreateInfo.html
states that the "code must adhere to the validation rules described by
the Validation Rules within a Module section of the SPIR-V Environment
appendix"

This makes it the application's responsibility to only pass valid SPIR-V
code to vkCreateShaderModule. However, improperly validated code
may cause bugs which are hard to root cause, so validate in our
implementation as well in debug builds. This can also help with fuzzing
efforts.

Bug: b/158228522
Change-Id: Ib4f41fa70a021fb902e1f8504005b87c92286942
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45569
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkShaderModule.cpp b/src/Vulkan/VkShaderModule.cpp
index 337e188..55c091d 100644
--- a/src/Vulkan/VkShaderModule.cpp
+++ b/src/Vulkan/VkShaderModule.cpp
@@ -14,6 +14,8 @@
 
 #include "VkShaderModule.hpp"
 
+#include "spirv-tools/libspirv.hpp"
+
 #include <cstring>
 
 namespace vk {
@@ -26,6 +28,11 @@
 {
 	memcpy(code, pCreateInfo->pCode, pCreateInfo->codeSize);
 	wordCount = static_cast<uint32_t>(pCreateInfo->codeSize / sizeof(uint32_t));
+
+#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
+	spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
+	ASSERT(spirvTools.Validate(getCode()));  // The SPIR-V code passed to vkCreateShaderModule must be valid (b/158228522)
+#endif
 }
 
 void ShaderModule::destroy(const VkAllocationCallbacks *pAllocator)