Device/Renderer: Work arounds for MemorySanitizer false-positives
MemorySanitizer has no visibility into writes performed by JIT'd code.
If we have built the project with the MemorySanitizer enabled, memset the Triangle and Primitive structs so the sanitizer has a write to see.
This is only cleared in MemorySanitizer enabled builds, as this adds a non negligable cost to Renderer construction.
Bug: chromium:998457
Change-Id: I3b4f9e48783c6e8a1109a578988567b0a42eb1f9
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/35688
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/System/Build.hpp b/src/System/Build.hpp
new file mode 100644
index 0000000..85dc018
--- /dev/null
+++ b/src/System/Build.hpp
@@ -0,0 +1,39 @@
+// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef Build_hpp
+#define Build_hpp
+
+// Define MEMORY_SANITIZER_ENABLED to 1 if the project was build with the memory
+// sanitizer enabled (-fsanitize=memory).
+#if defined(__SANITIZE_MEMORY__)
+#define MEMORY_SANITIZER_ENABLED 1
+#else // defined(__SANITIZE_MEMORY__)
+#if defined(__clang__)
+#if __has_feature(memory_sanitizer)
+#define MEMORY_SANITIZER_ENABLED 1
+#endif // __has_feature(memory_sanitizer)
+#endif // defined(__clang__)
+#endif // defined(__SANITIZE_MEMORY__)
+
+// MEMORY_SANITIZER_ONLY(X) resolves to X if MEMORY_SANITIZER_ENABLED is defined
+// to a non-zero value, otherwise MEMORY_SANITIZER_ONLY() is stripped by the
+// preprocessor.
+#if MEMORY_SANITIZER_ENABLED
+#define MEMORY_SANITIZER_ONLY(x) x
+#else
+#define MEMORY_SANITIZER_ONLY(x)
+#endif // MEMORY_SANITIZER_ENABLED
+
+#endif // Build_hpp