# Copyright 2023 The SwiftShader Authors. 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.

%$%generated_file_comment

import("../../src/swiftshader.gni")

# Need a separate config to ensure the warnings are added to the end.
config("swiftshader_llvm_private_config") {
  cflags = [
    "-DBLAKE3_NO_AVX512",
    "-DBLAKE3_NO_AVX2",
    "-DBLAKE3_NO_SSE41",
    "-DBLAKE3_NO_SSE2",
    "-DBLAKE3_USE_NEON=0",
  ]

  if (is_win) {
    cflags += [
      "/wd4005",
      "/wd4018",
      "/wd4065",
      "/wd4141",
      "/wd4146",
      "/wd4244",
      "/wd4245",
      "/wd4267",
      "/wd4310",
      "/wd4319",
      "/wd4334",
      "/wd4389",
      "/wd4624",
      "/wd4701",
      "/wd4702",
      "/wd4703",
      "/wd4706",
      "/wd4800",
      "/wd4805",
      "/wd4828",
    ]

    if (!is_debug) {
      cflags += [ "/wd4324" ]
    }

    if (is_clang) {
      cflags += [
        "-Wno-format",
        "-Wno-sign-compare",
        "-Wno-macro-redefined",
      ]
    }
  }

  if (is_fuchsia) {
    # Ignore #warning for unimplemented features in Process.inc.
    cflags += [ "-Wno-cpp" ]
  }

  if (is_clang) {
    cflags += [
      "-Wno-attributes",
      "-Wno-bitwise-instead-of-logical",
      "-Wno-deprecated-anon-enum-enum-conversion",
      "-Wno-deprecated-declarations",
      "-Wno-deprecated-pragma",
      "-Wno-deprecated-enum-enum-conversion",
      "-Wno-enum-compare",
      "-Wno-header-hygiene",
      "-Wno-range-loop-bind-reference",
      "-Wno-unused-function",
      "-Wno-unused-local-typedef",
      "-Wno-unused-private-field",
      "-Wno-unused-result",
      "-Wno-unused-variable",
    ]
  }

  defines = [
    "__STDC_CONSTANT_MACROS",
    "__STDC_LIMIT_MACROS",
  ]
}

llvm_include_dirs = [
  "llvm/include/",
  "llvm/lib/Target/AArch64/",
  "llvm/lib/Target/ARM/",
  "llvm/lib/Target/LoongArch/",
  "llvm/lib/Target/Mips/",
  "llvm/lib/Target/PowerPC/",
  "llvm/lib/Target/RISCV/",
  "llvm/lib/Target/X86/",
  "configs/common/include/",
  "configs/common/lib/ExecutionEngine/JITLink/",
  "configs/common/lib/IR/",
  "configs/common/lib/Target/AArch64/",
  "configs/common/lib/Target/ARM/",
  "configs/common/lib/Target/LoongArch/",
  "configs/common/lib/Target/Mips/",
  "configs/common/lib/Target/PowerPC/",
  "configs/common/lib/Target/RISCV/",
  "configs/common/lib/Target/X86/",
  "configs/common/lib/Transforms/InstCombine/",
]

if (is_linux || is_chromeos) {
  llvm_include_dirs += [ "configs/linux/include/" ]
} else if (is_fuchsia) {
  llvm_include_dirs += [ "configs/fuchsia/include/" ]
} else if (is_win) {
  llvm_include_dirs += [ "configs/windows/include/" ]
} else if (is_android) {
  llvm_include_dirs += [ "configs/android/include/" ]
} else if (is_mac) {
  llvm_include_dirs += [ "configs/darwin/include/" ]
} else {
  assert(false, "llvm-10.0 not configured for target platform")
}

template("swiftshader_llvm_source_set") {
  swiftshader_source_set(target_name) {
    configs = [ ":swiftshader_llvm_private_config" ]
    include_dirs = llvm_include_dirs

    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}

swiftshader_llvm_source_set("swiftshader_llvm") {
  # This class is declared on all platforms but only used on ARM. UBSanVPtr
  # builds require that all declared classes have a definition even if they're
  # not used.
  if (is_ubsan_vptr) {
    sources = [
      "llvm/lib/MC/MCWasmObjectTargetWriter.cpp",
      "llvm/lib/MC/MCXCOFFObjectTargetWriter.cpp",
      "llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp",
      "llvm/lib/Target/TargetIntrinsicInfo.cpp",
    ]
  }

  deps = [
%$%llvm_deps
  ]

  if (is_debug) {
    deps += [ ":swiftshader_llvm_debug" ]
  }

  if (current_cpu == "arm64") {
    deps += [ ":swiftshader_llvm_aarch64" ]
  } else if (current_cpu == "arm") {
    deps += [ ":swiftshader_llvm_arm" ]
  } else if (current_cpu == "loong64") {
    deps += [ ":swiftshader_llvm_loongarch64" ]
  } else if (current_cpu == "mipsel" || current_cpu == "mips64el") {
    deps += [ ":swiftshader_llvm_mips" ]
  } else if (current_cpu == "ppc64") {
    deps += [ ":swiftshader_llvm_ppc" ]
  } else if (current_cpu == "riscv64") {
    deps += [ ":swiftshader_llvm_riscv64" ]
  } else if (current_cpu == "x86" || current_cpu == "x64") {
    deps += [ ":swiftshader_llvm_x86" ]
  } else {
    assert(false, "Unsupported current_cpu")
  }

  if ((current_cpu != current_cpu &&
       (current_cpu == "x86" || current_cpu == "x64")) ||
      # Windows ARM64 does cross compilation on Windows x64 host, and requires native
      # x86 target.
      (is_win && current_cpu == "arm64")) {
    deps += [ ":swiftshader_llvm_x86" ]
  }
}

# This source_set would contain all source files, except that GN doesn't allow for duplicate source
# file names, even if they are in different subdirectories. Because of this, some files are
# split out into their own source_set.
%$%llvm_source_sets

swiftshader_llvm_source_set("swiftshader_llvm_debug") {
  sources = [
%$%files_llvm_debug
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_aarch64") {
  sources = [
%$%files_AArch64
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_arm") {
  sources = [
%$%files_ARM
  ]

  # When is_ubsan_vptr is true, this file is added to swiftshader_llvm instead.
  if (!is_ubsan_vptr) {
    sources += [ "llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp" ]
  }
}

swiftshader_llvm_source_set("swiftshader_llvm_loongarch64") {
  sources = [
%$%files_LoongArch
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_mips") {
  sources = [
%$%files_Mips
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_ppc") {
  sources = [
%$%files_PowerPC
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_x86") {
  sources = [
%$%files_x86
  ]
}

swiftshader_llvm_source_set("swiftshader_llvm_riscv64") {
  sources = [
%$%files_RISCV
  ]
}
