# Copyright 2019 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/build_id.gni")
import("//build/config/clang/clang.gni")
import("//build/config/clang/crash_diagnostics.gni")
import("//build/config/compiler.gni")
import("//build/config/linker.gni")
import("//build/config/zircon/levels.gni")
import("//build/toolchain/goma.gni")
import("//build/unification/global_variables.gni")

# NOTE: This file was written from the content of
# //zircon/public/gn/config/BUILD.zircon.gn and provides the GN configs used
# by zircon toolchains exclusively. See //build/toolchain/zircon/BUILD.gn.
#
# Major differences in the rewrite:
#
#  - Uses |zircon_toolchain| global variable, instead of |toolchain|.
#
#  - All code paths related to |is_host| has been removed (the Zircon toolchain
#    are never used to build host binaries).
#
#  - There are many configs here that redirect to an equivalent config
#    defined in //build/config/BUILD.gn. These are necessary to ensure
#    that build commands between the Zircon and Fuchsia builds are equivalent,
#    as verified by //zircon/public/canaries/compare_toolchains.py, because
#    the order of entries in `configs` list must be the same, even after
#    a `gn format` pass.
#
#    I.e. compare:
#
#      configs = [
#        "//build/config/zircon:default_include_dirs",
#        "//build/config/zircon:relative_paths",
#      ]
#
#    Which corresponds to the original configs list as it appeared in the
#    Zircon build, with:
#
#      configs = [
#        "//build/config:relative_paths",
#        "//build/config/zircon:default_include_dirs",
#      ]
#
#    Which is the properly formatted equivalent, when not using intermediate
#    configs here. Because the entries appear in different order, the build
#    commands will place tool flags in different position, making comparison
#    much more difficult.
#
#    Once the build is unified, these intermediate configs will be removed
#    since the order of build tool parameters is only important to minimize
#    surprises during unification.
#

# These flags are enabled by default in Fuchsia's Clang toolchain, but we set
# them explicitly to support other Clang toolchains and Clang-based tools.
config("clang_defaults") {
  cflags = [ "-fexperimental-new-pass-manager" ]
  asmflags = cflags
  ldflags = cflags
  if (current_cpu == "x64") {
    asmflags += [ "-Wa,--mrelax-relocations=yes" ]
  }
  if (current_os == "linux") {
    cflags_cc = [ "-stdlib=libc++" ]
    ldflags += [
      "-stdlib=libc++",
      "-unwindlib=",
      "-rtlib=compiler-rt",
    ]
  }
}

config("compiler") {
  compiler_flags = []
  defines = []
  ldflags = []

  # NOTE: This config should only be used with Zircon-specific toolchains
  # but this BUILD.gn file is also included from non-Zircon ones. To
  # avoid un-necessary GN errors, define a fake local zircon_toolchain
  # scope to ensure this config() definitions executes properly even if
  # it is never used.
  if (zircon_toolchain == false) {
    zircon_toolchain = {
      target_tuple = ""
      version_string = ""
      include_dirs = []
      lib_dirs = []
    }
  }

  # For GCC, the compiler command implies the target.
  # For Clang, there's a single compiler command that takes `--target`.
  if (!is_gcc) {
    compiler_flags += [ "--target=${zircon_toolchain.target_tuple}" ]
  }

  if (linker != "") {
    ldflags += [ "-fuse-ld=$linker" ]
  }

  if (defined(zircon_toolchain.version_string) &&
      zircon_toolchain.version_string != "") {
    # Nothing uses this define, but its presence on compilation command
    # lines ensures that Ninja will rebuild things when a new compiler
    # version arrives.
    defines += [ "TOOLCHAIN_VERSION=${zircon_toolchain.version_string}" ]
  }

  # This is the default already on Fuchsia and maybe others, but never hurts.
  cflags = [ "-fno-common" ]

  configs = [
    "//build/config:color_diagnostics",
    # TODO: "$current_os:compiler",
  ]
  if (!is_gcc) {
    configs += [ ":clang_defaults" ]
  }

  if (is_fuchsia) {
    # TODO(mcgrathr): These should all be default in the compiler driver.
    ldflags += [
      "-Wl,-z,combreloc",
      "-Wl,-z,relro",
      "-Wl,-z,now",
      "-Wl,-z,text",
    ]

    if (is_gcc) {
      # This is predefined by Clang --target=*-fuchsia.
      # But the GCC toolchain is the generic --target=*-elf one.
      defines += [ "__Fuchsia__" ]

      # These are done by default in the Clang toolchain.
      cflags += [ "-fasynchronous-unwind-tables" ]
      ldflags += [
        "-Wl,--build-id",
        "-Wl,--eh-frame-hdr",
        "-Wl,--hash-style=gnu",
      ]

      # In the Clang toolchain assembly files with no explicit marker don't
      # cause the presumption of executable stack as they do in GCC.
      ldflags += [ "-Wl,-z,noexecstack" ]
    } else {
      # TODO(mcgrathr): This should be default in the compiler driver.
      ldflags += [ "-Wl,--pack-dyn-relocs=relr" ]
    }

    if (current_cpu == "arm64") {
      # Generate code for the fairly generic cortex-a53.
      compiler_flags += [ "-mcpu=cortex-a53" ]

      # x18 is reserved in the Fuchsia ABI so it can be used
      # for things like -fsanitize=shadow-call-stack.
      compiler_flags += [ "-ffixed-x18" ]

      if (is_gcc) {
        # By default GCC 10 will generate outcalls to libgcc functions that can
        # do runtime switching between old and new atomic insns.  We want just
        # old atomic insns inline instead.  Eventually we'll have builds using
        # -march=armv8.1-a or better, which should get new atomic insns inline
        # regardless of this switch.
        cflags += [ "-mno-outline-atomics" ]
      }
    } else if (current_cpu == "x64") {
      # Let the compiler generate the cmpxchg16b instruction.
      compiler_flags += [
        "-mcx16",
        "-march=x86-64",
      ]
    }
  } else if (current_os == "win") {
    # This enables build ID-like PDB UUIDs without timestamp.
    ldflags += [ "-Wl,/Brepro" ]
  }

  if (!is_gcc && crash_diagnostics_dir != "") {
    compiler_flags += [ "-fcrash-diagnostics-dir=" +
                        rebase_path(crash_diagnostics_dir, root_build_dir) ]
  }

  # The toolchain-supplied headers come after include_dirs from targets and
  # configs but before libc.
  foreach(dir, zircon_toolchain.include_dirs) {
    compiler_flags += [
      "-isystem",
      rebase_path(dir, root_build_dir),
    ]
  }

  lib_dirs = zircon_toolchain.lib_dirs

  asmflags = compiler_flags
  cflags += compiler_flags
  ldflags += compiler_flags

  if (is_fuchsia && build_id_format != "") {
    ldflags += [ "-Wl,--build-id=$build_id_format" ]
  }
}

# NOTE: Do not remove this until unification completes (see explanation above).
config("language") {
  configs = [ "//build/config:language" ]
}

# NOTE: Do not remove this until unification completes (see explanation above).
config("relative_paths") {
  configs = [ "//build/config:relative_paths" ]
}

config("nolibc") {
  ldflags = [ "-nostartfiles" ]

  # Don't use -nostdlib, because the builtins (or libgcc) are what we want
  # and are otherwise annoying to find and specify.  It's just the -lc that
  # we really want to defeat, and that's handled by giving a -L that will
  # find exactly nothing but a dummy libc.so.  Clang has -nolibc to kill
  # the -lc, but for C++ it still uses -lm under -nolibc.  So this is still
  # needed to make -lm into a dummy, though for -lc only GCC needs it.
  lib_dirs = [ "libc-dummy" ]

  if (is_gcc) {
    # Include this in every link.
    # Note GN requires "./" so it doesn't think this should mean a -l switch.
    libs = [ "./dso_handle.ld" ]
  } else {
    # TODO(mcgrathr): GCC 9 has -nolibc, so use it when we get that toolchain.
    ldflags += [ "-nolibc" ]
  }
}

config("freestanding") {
  cflags = [ "-ffreestanding" ]

  # In Clang -fasynchronous-unwind-tables is the default for *-fuchsia
  # targets.  But -ffreestanding defeats that (in target-independent logic
  # in the Clang driver).  So add it back explicitly.  For GCC, it's
  # already added explicitly in :compiler regardless so don't double it.
  if (!is_gcc) {
    cflags += [ "-fasynchronous-unwind-tables" ]
  }

  ldflags = cflags
}

config("data_sections") {
  cflags = [ "-fdata-sections" ]
  ldflags = cflags
}

config("linker_gc") {
  configs = [ ":data_sections" ]
  cflags = [ "-ffunction-sections" ]
  ldflags = cflags
  if (current_os == "mac") {
    ldflags += [ "-Wl,-dead_strip" ]
  } else if (current_os == "win") {
    ldflags += [ "-Wl,/opt:ref" ]
  } else {
    ldflags += [ "-Wl,--gc-sections" ]
  }
}

config("assert_level") {
  assert(zx_assert_level >= 0)
  defines = [ "ZX_ASSERT_LEVEL=$zx_assert_level" ]
  if (zx_assert_level == 0) {
    defines += [ "NDEBUG" ]
  }
}

config("linker_string_merging") {
  if (current_os == "win") {
    ldflags = [ "-Wl,/opt:lldtailmerge" ]
  } else if (current_os != "mac") {
    ldflags = [ "-Wl,-O2" ]
  }
}

# IMPORTANT: //build/config/BUILD.gn also defines a list of optimize_${level}
# configs, but some of them have slightly different values. Until build
# unification completes, the configs below should match the Zircon build
# values instead.
#
# NOTE: Keep in sync with //zircon/public/gn:optimize_${level} definitions,
# keeping in mind that the Zircon build `optimize` variable is named
# `zircon_optimize` in the Fuchsia build.

config("optimize_none") {
  configs = [ "//build/config:optimize_none" ]
}

# NOTE: //build/config:optimize_debug is slightly different.
config("optimize_debug") {
  cflags = [ "-Og" ]
  ldflags = cflags
  rustflags = [ "-Copt-level=1" ]
}

config("optimize_default") {
  configs = [ "//build/config:optimize_default" ]
}

config("optimize_size") {
  configs = [ "//build/config:optimized_size" ]
}

# NOTE: //build/config:optimize_speed is slightly different.
config("optimize_speed") {
  cflags = [ "-O3" ]
  ldflags = cflags
  rustflags = [ "-Copt-level=3" ]
  configs = [ ":linker_string_merging" ]
}

config("optimize_sanitizer") {
  configs = [ "//build/config:optimize_sanitizer" ]
}

config("optimize_profile") {
  configs = [ "//build/config:optimize_profile" ]
}

config("default_optimize") {
  configs = [ ":optimize_${zircon_optimize}" ]
}

config("linker_gc_none") {
  # No linker GC when wholly unoptimized.
}

# Linker GC is a good default for most cases.
config("linker_gc_debug") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_default") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_size") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_speed") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_sanitizer") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_profile") {
  # TODO(fxbug.dev/51509): See if we can enable linker GC for profile.
}

config("default_linker_gc") {
  configs = [ ":linker_gc_${zircon_optimize}" ]
}

# This is separate from default_optimize so it can be removed.
config("default_icf") {
  if (optimize != "none" && optimize != "debug") {
    # Our code should never rely on C's unique function pointer semantics,
    # which is broken by --icf=all for sometimes substantial space savings.
    configs = [ ":icf" ]
  }
}

# Each of the debuginfo_$debuginfo configs below corresponds to a single setting
# that controls the amount of debugging information used and is controlled by
# the debuginfo argument. The default_debuginfo level is set to
# debuginfo_$debuginfo for convenience, but individual targets can override
# their debuginfo level by manually applying one of the configs below.

# Keep in sync with //build/config/BUILD.gn

config("debuginfo_none") {
  configs = [ "//build/config:debuginfo_none" ]
}

config("debuginfo_backtrace") {
  configs = [ "//build/config:debuginfo_backtrace" ]
}

config("debuginfo_debug") {
  configs = [ "//build/config:debuginfo_debug" ]
}

config("default_debuginfo") {
  configs = [ "//build/config:default_debuginfo" ]
}

config("werror") {
  cflags = [
    "-Werror",

    # Declarations marked as deprecated should not cause build failures.
    # Rather they should emit warnings to notify developers about the use
    # of deprecated interfaces.
    "-Wno-error=deprecated-declarations",

    # Do not add additional `-Wno-error=...` switches to this config!
  ]

  if (current_os == "win") {
    ldflags = [ "-Wl,/WX" ]
  }
}

# TODO(fxbug.dev/58162): clean up usages of this config
config("Wno-conversion") {
  cflags = [ "-Wno-conversion" ]
}

config("default_warnings") {
  cflags = [
    "-Wall",
    "-Wextra",
    "-Wno-unused-parameter",

    # TODO(fxbug.dev/37765): Temporarily disable this warning to unblock the GCC roll.
    "-Wno-address-of-packed-member",
  ]
  cflags_c = [
    "-Wstrict-prototypes",
    "-Wwrite-strings",
  ]
  cflags_cc = [
    "-Wconversion",
    "-Wno-sign-conversion",
    "-Wextra-semi",

    # TODO(fxbug.dev/38640): Temporarily disable this warning to unblock the GCC roll.
    "-Wno-deprecated-copy",
  ]
  if (is_gcc) {
    cflags += [
      "-Wno-nonnull-compare",
      "-Wno-format-truncation",
    ]
  } else {
    cflags += [
      "-Wnewline-eof",

      # TODO(fxbug.dev/35965): Temporarily disable C99 designator warnings introduced in
      # https://reviews.llvm.org/D59754. After the new Clang toolchain lands
      # and we do some cleanup, this will be re-enabled.
      "-Wno-unknown-warning-option",
      "-Wno-c99-designator",

      # TODO(fxbug.dev/37215): Temporarily disable this warning until we roll toolchain.
      # Then we can re-enable it and cleanup instances it appears.
      "-Wno-int-in-bool-context",

      # TODO(fxbug.dev/43681): Temporarily disable this warning until we roll toolchain,
      # then come back and fix the instances this appears after rolling.
      "-Wno-range-loop-analysis",
    ]
    cflags_cc += [
      # TODO(fxbug.dev/45689): Temporarily disable this warning until we roll toolchain,
      # then come back and fix the instances this appears after rolling.
      "-Wno-non-c-typedef-for-linkage",
    ]
  }
}

config("Wno-unused-function") {
  cflags = [ "-Wno-unused-function" ]
}

config("warn-implicit-fallthrough") {
  cflags = [ "-Wimplicit-fallthrough" ]
}

config("default_template_backtrace_limit") {
  cflags_cc = [ "-ftemplate-backtrace-limit=0" ]
}

config("icf") {
  # This changes C/C++ semantics and might be incompatible with third-party
  # code that relies on function pointers comparison.
  if (current_os == "win" && (linker == "lld" || !is_gcc)) {
    ldflags = [ "-Wl,/opt:icf=all" ]
  } else if (linker == "gold" || linker == "lld") {
    ldflags = [ "-Wl,--icf=all" ]
  }
}

config("exceptions") {
  configs = [ "//build/config:exceptions" ]
}

config("no_exceptions") {
  configs = [ "//build/config:no_exceptions" ]
}

config("rtti") {
  configs = [ "//build/config:rtti" ]
}

config("no_rtti") {
  configs = [ "//build/config:no_rtti" ]
}

config("no_threadsafe_statics") {
  cflags_cc = [ "-fno-threadsafe-statics" ]
  cflags_objcc = cflags_cc
}

config("default_include_dirs") {
  include_dirs = [ "//zircon/system/public" ]
}

config("default_frame_pointers") {
  if (zx_assert_level > 0) {
    configs = [ ":frame_pointers" ]
  } else {
    configs = [ ":no_frame_pointers" ]
  }
}

# NOTE: //build/config:frame_pointers exists but is different!
config("frame_pointers") {
  defines = [ "WITH_FRAME_POINTERS=1" ]
  cflags = [ "-fno-omit-frame-pointer" ]
}

# NOTE: //build/config:no_frame_pointers exists but is different!
config("no_frame_pointers") {
  defines = [ "WITH_FRAME_POINTERS=0" ]
  cflags = [ "-fomit-frame-pointer" ]
}

# NOTE: //build/config:thread_safety_annotations is slightly different
config("thread_safety_annotations") {
  if (!is_gcc) {
    cflags = [ "-Wthread-safety" ]
    defines = [ "_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1" ]
  }
}

config("no_stack_protector") {
  cflags = [ "-fno-stack-protector" ]
}

config("no_safestack") {
  if (!is_gcc) {
    cflags = [ "-fno-sanitize=safe-stack" ]
  }
  configs = [ ":no_stack_protector" ]
}

config("no-shadow-call-stack") {
  if (current_cpu == "arm64" && !is_gcc) {
    cflags = [ "-fno-sanitize=shadow-call-stack" ]
  }
}

config("no_sanitizers") {
  cflags = [ "-fno-sanitize=all" ]
  if (!is_gcc) {
    cflags += [ "-fsanitize-coverage=0" ]
  }
  configs = [ ":no_stack_protector" ]
}

config("no_fuzzer") {
  if (!is_gcc) {
    cflags = [ "-fno-sanitize=fuzzer" ]
  }
}

# TODO(fxbug.dev/27266) Remove this once the warning with fit::variant/fit::optional is addressed.
config("no_maybe_uninitialized") {
  if (is_gcc) {
    cflags = [ "-Wno-maybe-uninitialized" ]
  }
}

# Compile code appropriately to be linked into a shared library.
config("shared_library_config") {
  if (current_os != "mac") {
    # Assembly code can use `#ifdef __PIC__`.
    compiler_flags = [ "-fPIC" ]
    asmflags = compiler_flags
    cflags = compiler_flags
    ldflags = compiler_flags
  }
}

# Don't allow dangling undefined references in shared libraries.
# All references should be satisfied by link-time library dependencies.
config("no_undefined_symbols") {
  if (current_os == "mac") {
    ldflags = [ "-Wl,-undefined,error" ]
  } else {
    ldflags = [ "-Wl,-z,defs" ]
  }
}

config("visibility_hidden") {
  cflags = [ "-fvisibility=hidden" ]
  cflags_cc = [ "-fvisibility-inlines-hidden" ]

  # Disable libc++ visibility annotations to make sure that the compiler option
  # has effect on symbols defined in libc++ headers. Note that we don't want to
  # disable these annotations altogether to ensure that our toolchain is usable
  # outside of our build since not every user uses hidden visibility by default.
  defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ]
}

config("machine") {
  ldflags = []
  if (current_cpu == "arm64" && current_os != "win") {
    # The linker rewrites instructions to work around a CPU bug.
    ldflags += [ "-Wl,--fix-cortex-a53-843419" ]
  }
  if (is_fuchsia) {
    # TODO(fxbug.dev/32157): Really need to get this nailed down once and for all
    # and set by default in the compiler driver (Clang at least).
    ldflags += [ "-Wl,-z,max-page-size=4096" ]
  }
}

# TODO(fxbug.dev/54322): Use the config under //third_party/ulib/musl once the C
# library has been migrated to the GN build.
config("musl_headers") {
  _musl_dir = "//zircon/third_party/ulib/musl"
  visibility = [
    "${_musl_dir}/*",
    "//zircon/system/ulib/c:*",
  ]
  cflags = [
    "-idirafter",
    rebase_path("${_musl_dir}/include", root_build_dir),
  ]
  asmflags = cflags
}

config("user") {
  defines = [ "_ALL_SOURCE" ]
  configs = [
    ":nolibc",
    ":musl_headers",
  ]
}

config("user_executable") {
  # NOTE: Was only used in the 'user' Zircon build environment, which is
  # implemented by the Fuchsia build using the 'target' toolchain instead,
  # so this is not needed here.
}

config("integer-paranoia") {
  cflags = [
    "-fsanitize=integer-divide-by-zero,signed-integer-overflow",
    "-fsanitize-undefined-trap-on-error",
  ]
}

config("static-libc++") {
  if (current_os == "mac") {
    # The macOS driver doesn't support -static-libstdc++ properly, so pass
    # the libraries directly.  This has to locate the files explicitly in
    # the toolchain, because -lc++ would look for the shared library.
    ldflags = [
      "-nostdlib++",

      # NOTE: the path below was relative to toolchain.tool_dir in the Zircon build
      # but the Fuchsia one doesn't support GCC-based host builds at all, so this
      # is assuming Clang is always used instead.
      rebase_path("${clang_prefix}/../lib/libc++.a", root_build_dir),
    ]
  } else {
    ldflags = [ "-static-libstdc++" ]

    # TODO(fxbug.dev/26846): The implicitly linked static libc++.a depends on these.
    if (current_os == "linux") {
      libs = [
        "dl",
        "pthread",
      ]
    }
  }
}

config("pure") {
  if (!is_gcc) {
    # TODO(fxbug.dev/48501): This disables the SwitchToLookupTable optimization,
    # which is not PIC-friendly.
    cflags = [ "-fno-jump-tables" ]
  }
}

config("rodso") {
  configs = [ ":pure" ]
  if (is_gcc) {
    inputs = [ "rodso.ld" ]
    ldflags = [ "-Wl,-T," + rebase_path(inputs[0], root_build_dir) ]
  }
}

group("rodso_deps") {
}

config("auto_var_init") {
  if (!is_gcc) {
    # Automatically initialize variables with a pattern.
    cflags = [ "-ftrivial-auto-var-init=pattern" ]
  }
}

config("tiny") {
  cflags = [ "-mcmodel=tiny" ]
  asmflags = cflags
  ldflags = cflags
}

# TODO(fxbug.dev/42305): We will temporarily disable UBSan for a specified number of
# instances where UBSan triggers runtime errors. This config will go away once
# the asan-ubsan variant is in CI/CQ and we remove all instances of caught
# undefined behavior in fuchsia. THIS CONFIG SHOULD NOT BE USED.
config("temporarily_disable_ubsan_do_not_use") {
  # TODO(fxbug.dev/54322): Replace $zx_build with //zircon below after unification. This
  # is kept here to keep it identical to the definitions in
  # //zircon/public/gn/config:BUILD.zircon.gn
  visibility = [
    # TODO(fxbug.dev/41888): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/system/ulib/affine:*",
    "$zx_build/system/ulib/affine/test:*",

    # TODO(fxbug.dev/41892): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/ulib/trace-reader:*",

    # TODO(fxbug.dev/41876): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/dev/block/mbr:*",

    # TODO(fxbug.dev/41757): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/third_party/ulib/zstd:*",

    # TODO(fxbug.dev/42488): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/dev/display/display:*",

    # TODO(fxbug.dev/41887): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/uapp/nand-util:*",

    # TODO(fxbug.dev/42493): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/ulib/cobalt-client/test:*",

    # TODO(fxbug.dev/41890): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/ulib/gpt:*",

    # TODO(fxbug.dev/41893): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/ulib/zxio/test:*",

    # TODO(fxbug.dev/41894): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/system/ulib/zxtest:*",

    # TODO(fxbug.dev/42496): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/utest/fidl-simple:*",

    # TODO(fxbug.dev/41897): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/utest/fidl:*",

    # TODO(fxbug.dev/41900): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/utest/trace:*",

    # TODO(fxbug.dev/41663): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/third_party/lib/acpica:*",

    # TODO(fxbug.dev/41901): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/third_party/uapp/dash:*",

    # TODO(fxbug.dev/41766): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/third_party/ulib/lz4:*",

    # TODO(fxbug.dev/41901): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/third_party/ulib/musl/ldso:*",

    # TODO(fxbug.dev/42500): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/third_party/ulib/musl/src/stdio:*",

    # TODO(fxbug.dev/41903): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx/third_party/ulib/musl/third_party/math:*",

    # TODO(fxbug.dev/41904): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/third_party/ulib/boringssl:*",

    # TODO(fxbug.dev/43658): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/dev/block/sdmcc:*",

    # TODO(fxbug.dev/46944): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
    "$zx_build/system/ulib/perftest:*",

    # TODO(fxbug.dev/60442): UBSan has found an instance of undefined behavior in this target.
    # Disable UBSan for this target temporarily until is is migrated into CI/CQ.
    "$zx/tools/fidl:*",
  ]

  if (!is_gcc) {
    cflags = [ "-fno-sanitize=undefined" ]
  }
}

# TODO(fxbug.dev/54322): Move this to //zircon/kernel/BUILD.gn once the kernel has been
# migrated to the Fuchsia build.
# For any standalone static binary.
config("standalone") {
  ldflags = [
    "-nostdlib",
    "-static",
  ]

  cflags = [
    "-ffreestanding",
    "-include",
    rebase_path("//zircon/kernel/include/hidden.h", root_build_dir),

    # We want `.debug_frame` for the kernel (fxbug.dev/30023).  And we still want
    # asynchronous unwind tables.  Alas there's (currently) no way to
    # achieve this with our GCC.  At the moment we compile with
    # `-fno-omit-frame-pointer`, which is good because we link with
    # `--gc-sections`, which means `.eh_frame` gets discarded so GCC-built
    # kernels don't have any unwind info (except for assembly)!  Assembler
    # code has its own way of requesting `.debug_frame` vs `.eh_frame` with
    # the `.cfi_sections` directive.
    "-fno-unwind-tables",
  ]

  cflags_cc = [
    # Underlying kernel heap only has default alignment of 8 bytes, so pass
    # this to the compiler as the default new alignment.
    "-faligned-new=8",
  ]

  if (current_cpu == "x64") {
    # This only matters in an environment where interrupt handlers might
    # push trap frames in the same privilege level, like the kernel.
    # e.g. Multiboot probably doesn't actually need it, but it doesn't hurt.
    cflags += [ "-mno-red-zone" ]
  } else if (current_cpu == "arm64") {
    # This matters if vector registers are not available, e.g. in the kernel
    # since the they hold unsaved user state, or in the physmem environment
    # because they might not be enabled in hardware yet.
    cflags += [ "-mgeneral-regs-only" ]
  }

  if (is_gcc && current_os == "fuchsia") {
    cflags += [ "-fpie" ]
  }

  if (!is_gcc && current_os == "fuchsia") {
    # In the Fuchsia-target toolchains there's no way to prevent the
    # compiler driver from passing -pie, so negate it.  BFD ld doesn't
    # have --no-pie, but arm64-elf-gcc doesn't pass -pie either.
    ldflags += [ "-Wl,--no-pie" ]
  }

  if (!is_gcc) {
    # Disable the implicit addition of toolchain-provided libraries to
    # the link by the compiler driver.  No toolchain-provided library is
    # compatible with the kernel's internal ABI.
    #
    # TODO(fxbug.dev/27356): Clang doesn't have a single straightforward switch to
    # disable all such libraries, though it certainly should.  It
    # provides separate switches to disable the profiling/coverage
    # runtime and to disable all the flavors of runtime implied by
    # -fsanitize=... switches (including any such defaults).  It will
    # still provide other incompatible libraries to the link, but they
    # won't have any effect since they don't define any symbols the link
    # needs.  However, this is a fragile situation that could easily
    # break.
    ldflags += [
      "-noprofilelib",
      "-fno-sanitize-link-runtime",
    ]
  }

  configs = [ "//build/config/zircon:no_exceptions" ]
}
