# 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/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/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 == "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_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
  ]
}
