import("//llvm/utils/gn/build/buildflags.gni")
import("//llvm/utils/gn/build/mac_sdk.gni")
import("//llvm/utils/gn/build/sysroot.gni")
import("//llvm/utils/gn/build/toolchain/compiler.gni")
import("//llvm/utils/gn/build/toolchain/target_flags.gni")

declare_args() {
  # Whether to build everything with coverage information.
  # After building with this, run tests and then run
  #    llvm/utils/prepare-code-coverage-artifact.py \
  #        --compilation-dir=out/gn \
  #        .../llvm-profdata .../llvm-cov out/gn/profiles/ report/ \
  #        out/gn/bin/llvm-undname ...
  # to generate a HTML report for the binaries passed in the last line.
  llvm_build_instrumented_coverage = false

  # If set, puts relative paths in debug info.
  # Makes the build output independent of the build directory, but makes
  # most debuggers harder to use. See "Getting to local determinism" and
  # "Getting debuggers to work well with locally deterministic builds" in
  # http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html
  # for more information.
  use_relative_paths_in_debug_info = false

  # The version of host gcc. Ignored if is_clang is true.
  gcc_version = 9
}

assert(!llvm_build_instrumented_coverage || is_clang,
       "llvm_build_instrumented_coverage requires clang as host compiler")

config("compiler_defaults") {
  defines = []

  if (!llvm_enable_assertions) {
    defines += [ "NDEBUG" ]
  }

  if (llvm_enable_expensive_checks) {
    defines += [ "EXPENSIVE_CHECKS" ]
  }

  asmflags = target_flags
  cflags = target_flags
  cflags_cc = []
  ldflags = target_flags + target_ldflags

  # Mostly for compiler-rt, see compiler-rt/cmake/config-ix.cmake
  if (current_os == "ios") {
    asmflags += [ "-miphoneos-version-min=8.0" ]
    cflags += [ "-miphoneos-version-min=8.0" ]
    ldflags += [ "-miphoneos-version-min=8.0" ]
  }
  if (current_os == "mac") {
    asmflags += [ "-mmacosx-version-min=10.10" ]
    cflags += [ "-mmacosx-version-min=10.10" ]
    ldflags += [ "-mmacosx-version-min=10.10" ]
  }

  assert(symbol_level == 0 || symbol_level == 1 || symbol_level == 2,
         "Unexpected symbol_level")
  if (host_os != "win") {
    if (symbol_level == 2) {
      cflags += [ "-g" ]

      # For full debug-info -g builds, --gdb-index makes links ~15% slower, and
      # gdb symbol reading time 1500% faster (lld links in 4.4 instead of 3.9s,
      # and gdb loads and runs it in 2s instead of in 30s).  It's likely that
      # people doing symbol_level=2 want to run a debugger (since
      # symbol_level=2 isn't the default). So this seems like the right
      # tradeoff.
      if (host_os != "mac" && use_lld) {
        cflags += [ "-ggnu-pubnames" ]  # PR34820
        ldflags += [ "-Wl,--gdb-index" ]
      }
    } else if (symbol_level == 1) {
      cflags += [ "-g1" ]
      # For linetable-only -g1 builds, --gdb-index makes links ~8% slower, but
      # links are 4x faster than -g builds so it's a fairly small absolute cost.
      # On the other hand, gdb startup is well below 1s with and without the
      # index, and people using -g1 likely don't use a debugger. So don't use
      # the flag here.
    }
    if (is_optimized) {
      cflags += [ "-O3" ]
    }
    cflags += [ "-fdiagnostics-color" ]
    if (use_lld) {
      ldflags += [ "-Wl,--color-diagnostics" ]
    }
    cflags_cc += [
      "-std=c++14",
      "-fvisibility-inlines-hidden",
    ]
  } else {
    if (symbol_level != 0) {
      cflags += [
        "/Zi",
        "/FS",
      ]
      if (symbol_level == 1 && is_clang) {
        cflags += [ "-gline-tables-only" ]
      }
      ldflags += [ "/DEBUG" ]

      # Speed up links with ghash on windows.
      if (use_lld && is_clang) {
        cflags += [ "-gcodeview-ghash" ]
        ldflags += [ "/DEBUG:GHASH" ]
      }
    }
    if (is_optimized) {
      cflags += [
        "/O2",
        "/Gw",
        "/Zc:inline",
      ]
      ldflags += [
        "/OPT:REF",
        "/OPT:ICF",
      ]
    }
    defines += [
      "_CRT_SECURE_NO_DEPRECATE",
      "_CRT_SECURE_NO_WARNINGS",
      "_CRT_NONSTDC_NO_DEPRECATE",
      "_CRT_NONSTDC_NO_WARNINGS",
      "_SCL_SECURE_NO_DEPRECATE",
      "_SCL_SECURE_NO_WARNINGS",

      "_HAS_EXCEPTIONS=0",
      "_UNICODE",
      "UNICODE",
    ]
    cflags += [ "/EHs-c-" ]

    # The MSVC default value (1 MB) is not enough for parsing recursive C++
    # templates in Clang.
    ldflags += [ "/STACK:10000000" ]
  }

  # Warning setup.
  if (host_os == "win" && !is_clang) {
    cflags += [
      # Suppress ''modifier' : used more than once' (__forceinline and inline).
      "-wd4141",

      # Suppress 'conversion from 'type1' to 'type2', possible loss of data'.
      "-wd4244",

      # Suppress 'conversion from 'size_t' to 'type', possible loss of data'.
      "-wd4267",

      # Suppress 'no matching operator delete found'.
      "-wd4291",

      # Suppress 'noexcept used with no exception handling mode specified'.
      "-wd4577",

      # Suppress 'destructor was implicitly defined as deleted'.
      "-wd4624",

      # Suppress 'unsafe mix of type <type> and type <type> in operation'.
      "-wd4805",
    ]
  } else {
    if (host_os == "win") {
      cflags += [ "/W4" ]
    } else {
      cflags += [
        "-Wall",
        "-Wextra",
      ]
    }
    cflags += [ "-Wno-unused-parameter" ]
    if (is_clang) {
      cflags += [
        "-Wdelete-non-virtual-dtor",
        "-Wstring-conversion",
      ]
    } else {
      cflags += [
        # GCC's -Wcomment complains about // comments ending with '\' if the
        # next line is also a // comment.
        "-Wno-comment",

        # Disable gcc's potentially uninitialized use analysis as it presents
        # lots of false positives.
        "-Wno-maybe-uninitialized",
      ]
      cflags_cc += [
        # The LLVM libraries have no stable C++ API, so -Wnoexcept-type is not
        # useful.
        "-Wno-noexcept-type",
      ]
      if (gcc_version >= 8) {
        cflags_cc += [
          # Disable -Wclass-memaccess, a C++-only warning from GCC 8 that fires
          # on LLVM's ADT classes.
          "-Wno-class-memaccess",
        ]
      }
      if (gcc_version >= 9) {
        cflags_cc += [
          # Disable -Wredundant-move on GCC>=9. GCC wants to remove std::move
          # in code like "A foo(ConvertibleToA a) { return std::move(a); }",
          # but this code does not compile (or uses the copy constructor
          # instead) on clang<=3.8. Clang also has a -Wredundant-move, but it
          # only fires when the types match exactly, so we can keep it here.
          "-Wno-redundant-move",
        ]
      }
    }
    if (is_clang && use_goma) {
      # goma converts all paths to lowercase on the server, breaking this
      # warning.
      cflags += [ "-Wno-nonportable-include-path" ]
    }
  }

  # On Windows, the linker is not invoked through the compiler driver.
  if (use_lld && host_os != "win") {
    ldflags += [ "-fuse-ld=lld" ]
  }

  if (llvm_build_instrumented_coverage) {
    cflags += [
      "-fcoverage-mapping",

      # For build determinism. Using this requires passing --compilation-dir to
      # llvm/utils/prepare-code-coverage-artifact.py.
      "-fcoverage-compilation-dir=.",

      # Using an absolute path here is lame, but it's used at test execution
      # time to generate the profiles, and lit doesn't specify a fixed folder
      # for test execution -- so this is the only way to get all profiles into
      # a single folder like llvm/utils/prepare-code-coverage-artifact.py
      # expects.
      "-fprofile-instr-generate=" +
          rebase_path("$root_build_dir/profiles/%4m.profraw"),
    ]
    if (host_os != "win") {
      ldflags += [ "-fprofile-instr-generate" ]
    }
  }

  # Deterministic build setup, see
  # http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html
  if (current_os == "win") {
    ldflags += [ "/pdbaltpath:%_PDB%" ]
  }
  if (is_clang) {
    cflags += [
      "-no-canonical-prefixes",
      "-Werror=date-time",
    ]
    if (current_os == "win") {
      cflags += [ "-fmsc-version=1916" ]
      if (use_lld) {
        cflags += [ "/Brepro" ]
        ldflags += [ "/Brepro" ]
      }
    }
    if (use_relative_paths_in_debug_info) {
      cflags += [ "-fdebug-compilation-dir=." ]
    }
  }
  if (sysroot != "") {
    if (current_os == "win") {
      assert(is_clang, "sysroot only works with clang-cl as host compiler")
      cflags += [ "/winsysroot" + rebase_path(sysroot, root_build_dir) ]
    } else if (current_os != "ios" && current_os != "mac" &&
               current_os != "android") {
      cflags += [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ]
    }
  }
  if ((current_os == "ios" || current_os == "mac") &&
      (clang_base_path != "" || sysroot != "")) {
    if (current_os == "ios" && current_cpu == "arm64") {
      sdk_path = ios_sdk_path
    } else if (current_os == "ios" && current_cpu == "x64") {
      sdk_path = iossim_sdk_path
    } else if (current_os == "mac") {
      sdk_path = mac_sdk_path
    }
    cflags += [
      "-isysroot",
      rebase_path(sdk_path, root_build_dir),
    ]
    ldflags += [
      "-isysroot",
      rebase_path(sdk_path, root_build_dir),
    ]
  }
  if (sysroot != "" && current_os != "win" && is_clang) {
    cflags += [ "-Wpoison-system-directories" ]
  }
  assert(
      !use_goma || sysroot != "",
      "goma needs a sysroot: run `llvm/utils/sysroot.py make-fake --out-dir=sysroot` and add `sysroot = \"//sysroot\"` to your args.gn")

  if (use_ubsan) {
    assert(is_clang && current_os == "linux",
           "ubsan only supported on Linux/Clang")
    cflags += [
      "-fsanitize=undefined",
      "-fno-sanitize-recover=all",
    ]
    ldflags += [ "-fsanitize=undefined" ]
  }

  if (use_asan) {
    assert(is_clang && (current_os == "ios" || current_os == "linux" ||
                            current_os == "mac"),
           "asan only supported on iOS/Clang, Linux/Clang, and macOS/Clang")
    cflags += [ "-fsanitize=address" ]
    ldflags += [ "-fsanitize=address" ]
  }

  if (use_tsan) {
    assert(is_clang && current_os == "linux",
           "tsan only supported on Linux/Clang")
    cflags += [ "-fsanitize=thread" ]
    ldflags += [ "-fsanitize=thread" ]
  }

  if (use_thinlto) {
    assert(is_clang, "ThinLTO only supported on Clang")

    lto_opt_level = 2

    cflags += [ "-flto=thin" ]

    if (host_os == "win") {
      ldflags += [
        "/opt:lldlto=" + lto_opt_level,
        "/opt:lldltojobs=" + max_jobs_per_lto_link,
      ]
    } else {
      ldflags += [
        "-flto=thin",
        "-Wl,--thinlto-jobs=" + max_jobs_per_lto_link,
        "-Wl,--lto-O" + lto_opt_level,
      ]
    }
  }

  cflags_objcc = cflags_cc
}

config("no_exceptions") {
  cflags_cc = []
  if (host_os != "win") {
    cflags_cc += [ "-fno-exceptions" ]
  }
  cflags_objcc = cflags_cc
}

config("no_rtti") {
  if (current_os == "win") {
    cflags_cc = [ "/GR-" ]
  } else {
    cflags_cc = [ "-fno-rtti" ]
  }
  cflags_objcc = cflags_cc
}

config("zdefs") {
  # -Wl,-z,defs doesn't work with sanitizers.
  # https://clang.llvm.org/docs/AddressSanitizer.html
  if (current_os != "ios" && current_os != "mac" && current_os != "win" &&
      !(use_asan || use_tsan || use_ubsan)) {
    ldflags = [ "-Wl,-z,defs" ]
  }
}

# To make an archive that can be distributed, you need to remove this config and
# set complete_static_lib.
config("thin_archive") {
  if (current_os != "ios" && current_os != "mac" && current_os != "win") {
    arflags = [ "-T" ]
  }
}

config("llvm_code") {
  include_dirs = [
    "//llvm/include",
    "$root_gen_dir/llvm/include",
  ]
  if (current_os != "win") {
    cflags = [ "-fPIC" ]
  }
}

config("lld_code") {
  include_dirs = [
    "//lld/include",
    "$root_gen_dir/lld/include",
  ]
}

config("clang_code") {
  if (host_os != "win") {
    cflags = [ "-fno-strict-aliasing" ]
  }
  include_dirs = [
    "//clang/include",
    "$root_gen_dir/clang/include",
  ]
}

config("crt_code") {
  include_dirs = [ "//compiler-rt/lib" ]
  cflags = [
    "-fPIC",
    "-funwind-tables",
    "-gline-tables-only",
    "-fvisibility=hidden",
  ]
  if (is_clang) {
    cflags += [
      "-Werror=thread-safety",
      "-Werror=thread-safety-reference",
      "-Werror=thread-safety-beta",
    ]
  }
}

config("lldb_code") {
  if (host_os != "win") {
    cflags = [ "-fno-strict-aliasing" ]
  }
  include_dirs = [
    "//lldb/include",
    "$root_gen_dir/lldb/include",
  ]
}

config("warn_covered_switch_default") {
  if (is_clang) {
    cflags = [ "-Wcovered-switch-default" ]
  }
}
