# Copyright 2020 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.

# The list of all valid variant tag strings that can appear inside a
# variant definition scope, or in `exclude_variant_tags` target or toolchain
# fields.
#
# Tags are used to specify various properties of a variant, and allows some
# filtering to happen during variant toolchain selection, or directly inside
# a target's build rules by looking at `toolchain_variant.variant_tags`.
#
all_variant_tags = [
  # The `instrumented` tag is used for variants that generate instrumented
  # machine code (e.g. profiling and sanitizers). As a special case, if this
  # tag is listed by a variant descriptor, the global
  # toolchain_variant.instrumented flag will be set to true in the
  # context of the corresponding variant toolchain.
  "instrumented",

  # The `instrumentation-runtime` tag is used for instrumented variants that
  # also require linking a specific instrumentation runtime to linkable
  # binaries. Note that any variant that has this tag should also have
  # the `instrumented` tag as well.
  "instrumentation-runtime",

  # The `asan` tag is used for variants that implement address-sanitizers.
  # These should always list `instrumented` and `instrumentation-runtime`
  # as well.
  "asan",

  # The `hwasan` tag is used for variants that use Hardware-assisted AddressSanitizer.
  "hwasan",

  # The `tsan` tag is used for variants that implement thread-sanitizers.
  # These should always list `instrumented` and `instrumentation-runtime`
  # as well.
  "tsan",

  # The `ubsan` tag is used for variants that implement undefined-behaviour
  # sanitizers. These should always list 'instrumented' as well.
  "ubsan",

  # The `sancov` tag is used for variants that implement code coverage
  # collection.
  "sancov",

  # The `replaces-allocator` tag is used for instrumentation runtimes that
  # provide alternative implementations of the standard C/C++ memory allocation
  # APIs.
  "replaces-allocator",

  # The `lsan` tag is used for variants that implement leak checking.
  "lsan",

  # The `fuzzer` tag is used for variants that implement fuzzers only.
  "fuzzer",

  # The `gcc` tag is used for variants that use GCC instead of Clang to
  # build C/C++ binaries. This should only be used for Zircon specific
  # toolchains.
  "gcc",

  # The `profile` tag is used for profile instrumentation.
  "profile",

  # The `coverage` tag is used for coverage instrumentation.
  "coverage",

  # The `llvm-profdata` tag is used for all instrumentation that emits the
  # `llvm-profdata` format.
  "llvm-profdata",

  # The `lto` tag is used for LTO and ThinLTO.
  "lto",

  # The 'kernel-excluded' and 'kernel-only' tags are used to indicate
  # that a given variant should never be applied to the kernel toolchains,
  # or should only be applied to them respectively. Note that these are
  # treated specially by toolchain_variant_suite(), based on the
  # presence of the 'kernel' tag in the toolchain suite's tags.
  "kernel-excluded",
  "kernel-only",
]
