# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Modifications Copyright 2017 Google Inc. 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.

# Allow for platform-specific customization of use_asan_by_default
import("//$starboard_path/configuration.gni")

declare_args() {
  # Compile for Thread Sanitizer to find threading bugs.
  use_tsan = false
}

declare_args() {
  # Compile for Address Sanitizer to find memory bugs.
  use_asan =
      !use_tsan && (cobalt_config == "debug" || cobalt_config == "devel") &&
      (defined(use_asan_by_default) && use_asan_by_default)
}

assert(!(use_asan && use_tsan), "ASan and TSan are mutually exclusive")

if (current_toolchain != default_toolchain) {
  # Disable sanitizers for non-default toolchains.
  use_asan = false
  use_tsan = false
}
