[setup-build]: add ubsan option

The gn debug build does not support ubsan, so error out in that
case.

Change-Id: I1113abf13872b115d215987648d22981490a5350
No-Try: true
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/257274
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/tools/setup-build b/tools/setup-build
index 1df682c..95e50d3 100755
--- a/tools/setup-build
+++ b/tools/setup-build
@@ -44,6 +44,7 @@
 SISO="1"
 SHARED=""
 INSTALL=""
+UBSAN=""
 
 function show_usage() {
   echo "setup-build [-f] $POSSIBLE_BUILD_SYSTEMS $POSSIBLE_BUILD_TYPES $POSSIBLE_BUILD_ARCHS [fuzz|fuzzer]"
@@ -68,9 +69,10 @@
   echo "  local         Use local compilation instead of remote"
   echo "  remoteexec    Use siso to improve compile time (the default)"
   echo "  shared        Build shared libs (cmake only)"
+  echo "  ubsan         Enable undefined behaviour sanitizer"
   if [[ ! -z "$1" ]]; then
     echo
-    echo "$1"
+    echo "error: $1"
   fi
   exit 1
 }
@@ -140,6 +142,9 @@
     "shared")
       SHARED=1
     ;;
+    "ubsan")
+      UBSAN=1
+    ;;
     "--help" | "-help" | "-h")
       show_usage
     ;;
@@ -157,6 +162,10 @@
   show_usage "build type $POSSIBLE_BUILD_TYPES required"
 fi
 
+if [[ ( -n "$UBSAN" ) && ( "$BUILD_SYSTEM-$BUILD_TYPE" == "gn-debug" ) ]]; then
+  show_usage "the gn build does not support ubsan with debug builds: use a release build instead"
+fi
+
 BUILD_DIR="$BUILD_SYSTEM-$BUILD_TYPE"
 if [[ ! -z "$BUILD_ARCH" ]]; then
   BUILD_DIR+="-$BUILD_ARCH"
@@ -164,6 +173,9 @@
 if [[ ! -z "$BUILD_FUZZER" ]]; then
   BUILD_DIR+="-fuzz"
 fi
+if [[ ! -z "$UBSAN" ]]; then
+  BUILD_DIR+="-ubsan"
+fi
 
 function generate() {
   pushd "$ROOT_DIR" > /dev/null
@@ -211,6 +223,9 @@
     else
         GN_ARGS+=" use_siso=false"
     fi
+    if [[ -n "$UBSAN" ]]; then
+        GN_ARGS+=" is_ubsan=true"
+    fi
     if grep 'dawn_node.*True' .gclient >/dev/null; then
         GN_ARGS+=" dawn_build_node_bindings=true"
     fi
@@ -271,6 +286,9 @@
         show_usage "invalid build architecture '$BUILD_ARCH'"
       ;;
     esac
+    if [[ -n "$UBSAN" ]]; then
+      CMAKE_FLAGS+=("-DDAWN_ENABLE_UBSAN=ON")
+    fi
     if [[ -n "$INSTALL" ]]; then
       CMAKE_FLAGS+=("-DCMAKE_INSTALL_PREFIX=out/install")
       CMAKE_FLAGS+=("-DTINT_ENABLE_INSTALL=ON")