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

import("//build/config/clang/clang.gni")
import("//build/toolchain/variant.gni")

config("frame_pointers") {
  cflags = [ "-fno-omit-frame-pointer" ]
  ldflags = cflags
}

declare_args() {
  # Default [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html)
  # options (before the `ASAN_OPTIONS` environment variable is read at
  # runtime).  This can be set as a build argument to affect most "asan"
  # variants in `known_variants` (which see), or overridden in
  # toolchain_args in one of those variants.  Note that setting this
  # nonempty may conflict with programs that define their own
  # `__asan_default_options` C function.
  asan_default_options = ""
  if (is_fuchsia) {
    # TODO(45047): Temporary until all lsan bugs are filed and marked with
    # deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
    asan_default_options = "detect_leaks=0"
  }

  # Default [UndefinedBehaviorSanitizer](https://llvm.org/docs/UndefinedBehaviorSanitizer.html)
  # options (before the `UBSAN_OPTIONS` environment variable is read at
  # runtime).  This can be set as a build argument to affect most "ubsan"
  # variants in `known_variants` (which see), or overridden in
  # toolchain_args in one of those variants.  Note that setting this
  # nonempty may conflict with programs that define their own
  # `__ubsan_default_options` C function.
  ubsan_default_options = "print_stacktrace=1:halt_on_error=1"
}

# TODO(45047): Temporary while leaks are plugged.
# As leak bugs are found, file a bug #nnnnn for the leaky test/component,
# and then add:
# ```
#   # TODO(nnnnn): Fix the leaks and remove this.
#   deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
# ```
# to the target that builds the leaky code.  When all leaky tests have been
# marked that way, the asan_default_options default above will be removed.
source_set("suppress-lsan.DO-NOT-USE-THIS") {
  # This would conflict with the generic one.
  if (asan_default_options == "") {
    sources = [ "asan_default_options.c" ]
    defines = [ "ASAN_DEFAULT_OPTIONS=\"detect_leaks=0\"" ]
    configs -= [ "//build/config:symbol_visibility_hidden" ]
    cflags = [ "-fPIE" ]
  }
}

variant("asan") {
  common_flags = [ "-fsanitize=address" ]

  # TODO(phosek): use runtime.json instead of invoking Clang.
  if (is_fuchsia) {
    extension = ".so"
  } else if (is_linux) {
    extension = ".a"
  } else if (is_mac) {
    extension = "_osx_dynamic.dylib"
  } else {
    extension = ".a"
  }
  libclang_rt_asan =
      exec_script("/usr/bin/env",
                  [
                    "${clang_prefix}/clang",
                    "--target=${clang_target}",
                    "-print-file-name=libclang_rt.asan${extension}",
                  ],
                  "trim string")
  rustflags = [ "-Clink-arg=${libclang_rt_asan}" ]
  if (is_fuchsia) {
    rustflags += [ "-Clink-arg=-dynamic-linker=asan/ld.so.1" ]
  }

  # ASan wants frame pointers because it captures stack traces
  # on allocations and such, not just on errors.
  configs = [ ":frame_pointers" ]

  if (asan_default_options != "") {
    deps = [ ":asan_default_options" ]
  }
}

if (asan_default_options != "") {
  source_set("asan_default_options") {
    visibility = [ ":*" ]
    sources = [ "asan_default_options.c" ]
    defines = [ "ASAN_DEFAULT_OPTIONS=\"${asan_default_options}\"" ]

    # On Fuchsia, the ASan runtime is dynamically linked and needs to have
    # the __asan_default_options symbol exported.  On systems where the
    # ASan runtime is statically linked, it doesn't matter either way.
    configs -= [ "//build/config:symbol_visibility_hidden" ]

    # This is the default on Fuchsia but not on all host platforms.
    # It's necessary to link into Rust binaries, which are PIE even
    # on platforms where C binaries are not PIE by default.
    cflags = [ "-fPIE" ]

    # TODO(45130): Remove this when GN is improved.  The link inputs from
    # this source_set() are just silently ignored by an executable() target
    # that uses rustc to link.  So shove the link input in through the back
    # door because we can't have nice things.
    public_configs = [ ":rust_asan_default_options" ]
  }

  # TODO(45130): I just can't even.
  config("rust_asan_default_options") {
    visibility = [ ":asan_default_options" ]
    rustflags =
        [ "-Clink-arg=" + rebase_path(
              "$target_out_dir/asan_default_options.asan_default_options.c.o",
              root_build_dir) ]
  }
}

variant("ubsan") {
  common_flags = [ "-fsanitize=undefined" ]

  libprefix = toolchain_variant.name
  if (libprefix == "ubsan-fuzzer") {
    # Fuchsia-built fuzzers don't have their own separate libprefix.
    # They just use the base variant.
    libprefix = "ubsan"
  }
  dynamic_linker_flags = "-dynamic-linker=$libprefix/ld.so.1"
  ldflags = [ "-Wl,$dynamic_linker_flags" ]
  rustflags = [ "-Clink-arg=$dynamic_linker_flags" ]

  if (ubsan_default_options != "") {
    deps = [ ":ubsan_default_options" ]
  }
}

if (ubsan_default_options != "") {
  source_set("ubsan_default_options") {
    visibility = [ ":*" ]
    sources = [ "ubsan_default_options.c" ]
    defines = [ "UBSAN_DEFAULT_OPTIONS=\"${ubsan_default_options}\"" ]

    # On Fuchsia, the UBSan runtime is dynamically linked and needs to have
    # the __ubsan_default_options symbol exported.  On systems where the
    # UBSan runtime is statically linked, it doesn't matter either way.
    configs -= [ "//build/config:symbol_visibility_hidden" ]
  }
}

variant("fuzzer") {
  common_flags = [ "-fsanitize=fuzzer" ]

  # TODO (TC-251): This shouldn't be necessary, but libzircon isn't currently
  # linked into libFuzzer on Fuchsia.
  if (is_fuchsia) {
    libs = [ "zircon" ]
  }
}

variant("sancov") {
  common_flags = [ "-fsanitize-coverage=trace-pc-guard" ]
}
