Add fuzzer instrumentation when building fuzzers

Without this the fuzzing is unguided and takes exponentially more time to find interesting corpus cases.

Change-Id: I1b66de153bc41a829a5276a02a729f4e6bb50ef0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33722
Reviewed-by: David Neto <dneto@google.com>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
Auto-Submit: Ben Clayton <bclayton@google.com>
diff --git a/fuzzers/CMakeLists.txt b/fuzzers/CMakeLists.txt
index 90e3fb8..3599d42 100644
--- a/fuzzers/CMakeLists.txt
+++ b/fuzzers/CMakeLists.txt
@@ -14,20 +14,9 @@
 
 function(add_tint_fuzzer NAME)
   add_executable(${NAME} ${NAME}.cc)
-  target_link_libraries(${NAME} libtint)
+  target_link_libraries(${NAME} libtint-fuzz)
   tint_default_compile_options(${NAME})
-  target_link_options(${NAME} PRIVATE
-    -fno-omit-frame-pointer
-    -fsanitize=fuzzer,address,undefined
-    -fsanitize-address-use-after-scope
-    -O1
-    -g
-  )
-
-  target_compile_options(${NAME} PRIVATE
-    -fsanitize=fuzzer,address,undefined
-    -Wno-missing-prototypes
-  )
+  target_compile_options(${NAME} PRIVATE -Wno-missing-prototypes)
 endfunction()
 
 if (${TINT_BUILD_WGSL_READER})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 90dc67c..0ff1ee2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -435,10 +435,24 @@
   target_compile_options(libtint PRIVATE -fvisibility=hidden)
 endif()
 
+if (${TINT_BUILD_FUZZERS})
+  # Tint library with fuzzer instrumentation
+  add_library(libtint-fuzz ${TINT_LIB_SRCS})
+  tint_default_compile_options(libtint-fuzz)
+  if (${COMPILER_IS_LIKE_GNU})
+    target_compile_options(libtint-fuzz PRIVATE -fvisibility=hidden)
+  endif()
+  target_compile_options(libtint-fuzz PUBLIC -fsanitize=fuzzer -fsanitize-coverage=trace-cmp)
+  target_link_options(libtint-fuzz PUBLIC -fsanitize=fuzzer -fsanitize-coverage=trace-cmp)
+endif()
+
 set_target_properties(libtint PROPERTIES OUTPUT_NAME "tint")
 
 if(${TINT_BUILD_SPV_READER} OR ${TINT_BUILD_SPV_WRITER})
   tint_spvtools_compile_options(libtint)
+  if (${TINT_BUILD_FUZZERS})
+    tint_spvtools_compile_options(libtint-fuzz)
+  endif()
 endif()
 
 if(${TINT_BUILD_SPV_READER})