# This setups the tablegen build targets that the LLVM and Clang libs depend on.

import("//build_overrides/clspv.gni")

import("tablegen.gni")

# For llvm/lib/CodeGen
tablegen("GenVT") {
  args = [ "-gen-vt" ]
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/CodeGen/ValueTypes.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/CodeGen/GenVT.inc"
}

# from llvm/include/llvm/TargetParser
tablegen("RISCVTargetParserDef") {
  args = [ "-gen-riscv-target-def" ]
  td_file = "//$clspv_llvm_dir/llvm/lib/Target/RISCV/RISCV.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/TargetParser/RISCVTargetParserDef.inc"
}

tablegen("ARMTargetParserDef") {
  args = [ "-gen-arm-target-def" ]
  td_file = "//$clspv_llvm_dir/llvm/lib/Target/ARM/ARM.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/TargetParser/ARMTargetParserDef.inc"
}

tablegen("AArch64TargetParserDef") {
  args = [ "-gen-arm-target-def" ]
  td_file = "//$clspv_llvm_dir/llvm/lib/Target/AArch64/AArch64.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/TargetParser/AArch64TargetParserDef.inc"
}

# from llvm/include/llvm/Frontend/OpenMP
tablegen("OMPh") {
  #visibility = [ ":public_tablegen" ]
  args = [ "-gen-directive-decl" ]
  output_name = "$clspv_llvm_dir/llvm/Frontend/OpenMP/OMP.h.inc"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/Frontend/OpenMP/OMP.td"
}

tablegen("OMP") {
  #visibility = [ ":public_tablegen" ]
  args = [ "-gen-directive-impl" ]
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/Frontend/OpenMP/OMP.td"
  output_name = "$clspv_llvm_dir/llvm/Frontend/OpenMP/OMP.inc"
}

# from llvm/include/llvm/IR
tablegen("Attributes") {
  #visibility = [ ":public_tablegen" ]
  args = [ "-gen-attrs" ]
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/IR/Attributes.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/IR/Attributes.inc"
}

tablegen("IntrinsicImpl") {
  args = [ "-gen-intrinsic-impl" ]
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/IR/Intrinsics.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/IR/IntrinsicImpl.inc"
}

tablegen("IntrinsicEnums") {
  #visibility = [ ":public_tablegen" ]
  args = [ "-gen-intrinsic-enums" ]
  td_file = "//$clspv_llvm_dir/llvm/include/llvm/IR/Intrinsics.td"
  tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
  output_name = "$clspv_llvm_dir/llvm/IR/IntrinsicEnums.inc"
}

template("gen_arch_intrinsics") {
  tablegen(target_name) {
    #visibility = [ ":public_tablegen" ]
    args = [
      "-gen-intrinsic-enums",
      "-intrinsic-prefix=${invoker.intrinsic_prefix}",
    ]
    td_file = "//$clspv_llvm_dir/llvm/include/llvm/IR/Intrinsics.td"
    tblgen_target = "../tools:clspv-tool-llvm-min-tblgen"
    output_name = "$clspv_llvm_dir/llvm/IR/$target_name.h"
  }
}

gen_arch_intrinsics("IntrinsicsAArch64") {
  intrinsic_prefix = "aarch64"
}

gen_arch_intrinsics("IntrinsicsAMDGPU") {
  intrinsic_prefix = "amdgcn"
}

gen_arch_intrinsics("IntrinsicsARM") {
  intrinsic_prefix = "arm"
}

gen_arch_intrinsics("IntrinsicsBPF") {
  intrinsic_prefix = "bpf"
}

gen_arch_intrinsics("IntrinsicsDirectX") {
  intrinsic_prefix = "dx"
}

gen_arch_intrinsics("IntrinsicsHexagon") {
  intrinsic_prefix = "hexagon"
}

gen_arch_intrinsics("IntrinsicsLoongArch") {
  intrinsic_prefix = "loongarch"
}

gen_arch_intrinsics("IntrinsicsMips") {
  intrinsic_prefix = "mips"
}

gen_arch_intrinsics("IntrinsicsNVPTX") {
  intrinsic_prefix = "nvvm"
}

gen_arch_intrinsics("IntrinsicsPowerPC") {
  intrinsic_prefix = "ppc"
}

gen_arch_intrinsics("IntrinsicsR600") {
  intrinsic_prefix = "r600"
}

gen_arch_intrinsics("IntrinsicsRISCV") {
  intrinsic_prefix = "riscv"
}

gen_arch_intrinsics("IntrinsicsS390") {
  intrinsic_prefix = "s390"
}

gen_arch_intrinsics("IntrinsicsSPIRV") {
  intrinsic_prefix = "spv"
}

gen_arch_intrinsics("IntrinsicsVE") {
  intrinsic_prefix = "ve"
}

gen_arch_intrinsics("IntrinsicsWebAssembly") {
  intrinsic_prefix = "wasm"
}

gen_arch_intrinsics("IntrinsicsX86") {
  intrinsic_prefix = "x86"
}

gen_arch_intrinsics("IntrinsicsXCore") {
  intrinsic_prefix = "xcore"
}

# Groups all tablegen() calls that create .inc files that are included in
# IR's public headers.  //llvm/lib/IR has this as a public_dep, so targets
# depending on //llvm/lib/IR don't need to depend on this.  This exists
# solely for targets that use IR's public headers but don't link against IR.
group("public_tablegen") {
  public_deps = [
    # IR's public headers include Attributes.inc.
    ":Attributes",

    # IR's public headers include IntrinsicEnums.inc.
    ":IntrinsicEnums",
    ":IntrinsicImpl",

    # FIXME: These are only included from .cpp files at first glance.
    # Try removing them from the public_tablegen target.
    ":IntrinsicsAArch64",
    ":IntrinsicsAMDGPU",
    ":IntrinsicsARM",
    ":IntrinsicsBPF",
    ":IntrinsicsDirectX",
    ":IntrinsicsHexagon",
    ":IntrinsicsLoongArch",
    ":IntrinsicsMips",
    ":IntrinsicsNVPTX",
    ":IntrinsicsPowerPC",
    ":IntrinsicsR600",
    ":IntrinsicsRISCV",
    ":IntrinsicsS390",
    ":IntrinsicsSPIRV",
    ":IntrinsicsVE",
    ":IntrinsicsWebAssembly",
    ":IntrinsicsX86",
    ":IntrinsicsXCore",

    # Frontend/OpenMP
    ":OMP",
    ":OMPh",
  ]
}

# Clang Tablegen
import("clang_tablegen.gni")

# from clang/include/clang/AST
clang_tablegen("Attrs") {
  args = [ "-gen-clang-attr-classes" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/Attrs.inc"
}

clang_tablegen("AttrImpl") {
  args = [ "-gen-clang-attr-impl" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/AttrImpl.inc"
}

clang_tablegen("AttrTextNodeDump") {
  args = [ "-gen-clang-attr-text-node-dump" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/AttrTextNodeDump.inc"
}

clang_tablegen("AttrNodeTraverse") {
  args = [ "-gen-clang-attr-node-traverse" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/AttrNodeTraverse.inc"
}

clang_tablegen("AttrVisitor") {
  args = [ "-gen-clang-attr-ast-visitor" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/AttrVisitor.inc"
}

clang_tablegen("StmtNodes") {
  args = [ "-gen-clang-stmt-nodes" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/StmtNodes.td"
  output_name = "$clspv_llvm_dir/clang/AST/StmtNodes.inc"
}

clang_tablegen("DeclNodes") {
  args = [ "-gen-clang-decl-nodes" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/DeclNodes.td"
  output_name = "$clspv_llvm_dir/clang/AST/DeclNodes.inc"
}

clang_tablegen("TypeNodes") {
  args = [ "-gen-clang-type-nodes" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/../Basic/TypeNodes.td"
  output_name = "$clspv_llvm_dir/clang/AST/TypeNodes.inc"
}

clang_tablegen("AbstractBasicReader") {
  args = [ "-gen-clang-basic-reader" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/PropertiesBase.td"
  output_name = "$clspv_llvm_dir/clang/AST/AbstractBasicReader.inc"
}

clang_tablegen("AbstractBasicWriter") {
  args = [ "-gen-clang-basic-writer" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/PropertiesBase.td"
  output_name = "$clspv_llvm_dir/clang/AST/AbstractBasicWriter.inc"
}

clang_tablegen("AbstractTypeReader") {
  args = [ "-gen-clang-type-reader" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/TypeProperties.td"
  output_name = "$clspv_llvm_dir/clang/AST/AbstractTypeReader.inc"
}

clang_tablegen("AbstractTypeWriter") {
  args = [ "-gen-clang-type-writer" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/TypeProperties.td"
  output_name = "$clspv_llvm_dir/clang/AST/AbstractTypeWriter.inc"
}

clang_tablegen("CommentNodes") {
  args = [ "-gen-clang-comment-nodes" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/CommentNodes.td"
  output_name = "$clspv_llvm_dir/clang/AST/CommentNodes.inc"
}

clang_tablegen("CommentHTMLTags") {
  args = [ "-gen-clang-comment-html-tags" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/CommentHTMLTags.td"
  output_name = "$clspv_llvm_dir/clang/AST/CommentHTMLTags.inc"
}

clang_tablegen("CommentHTMLTagsProperties") {
  args = [ "-gen-clang-comment-html-tags-properties" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/CommentHTMLTags.td"
  output_name = "$clspv_llvm_dir/clang/AST/CommentHTMLTagsProperties.inc"
}

clang_tablegen("CommentHTMLNamedCharacterReferences") {
  args = [ "-gen-clang-comment-html-named-character-references" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/CommentHTMLNamedCharacterReferences.td"
  output_name =
      "$clspv_llvm_dir/clang/AST/CommentHTMLNamedCharacterReferences.inc"
}

clang_tablegen("CommentCommandInfo") {
  args = [ "-gen-clang-comment-command-info" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/CommentCommands.td"
  output_name = "$clspv_llvm_dir/clang/AST/CommentCommandInfo.inc"
}

clang_tablegen("CommentCommandList") {
  args = [ "-gen-clang-comment-command-list" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/CommentCommands.td"
  output_name = "$clspv_llvm_dir/clang/AST/CommentCommandList.inc"
}

clang_tablegen("StmtDataCollectors") {
  args = [ "-gen-clang-data-collectors" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/AST/StmtDataCollectors.td"
  output_name = "$clspv_llvm_dir/clang/AST/StmtDataCollectors.inc"
}

# from clang/lib/AST
clang_tablegen("Opcodes") {
  args = [ "-gen-clang-opcodes" ]
  td_file = "//$clspv_llvm_dir/clang/lib/AST/ByteCode/Opcodes.td"
  output_name = "$clspv_llvm_dir/clang/AST/Opcodes.inc"
}

clang_tablegen("AttrDocTable") {
  args = [ "-gen-clang-attr-doc-table" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_name = "$clspv_llvm_dir/clang/AST/AttrDocTable.inc"
}

# from include/clang/Basic
# Diagnostics.

diag_groups = [
  "Analysis",
  "AST",
  "Comment",
  "Common",
  "CrossTU",
  "Driver",
  "Frontend",
  "Lex",
  "Parse",
  "Refactoring",
  "Sema",
  "Serialization",
  "InstallAPI",
]
foreach(diag_group, diag_groups) {
  clang_tablegen("Diagnostic${diag_group}Kinds") {
    args = [
      "-gen-clang-diags-defs",
      "-clang-component=${diag_group}",
    ]
    td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
    output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
  }

  clang_tablegen("Diagnostic${diag_group}Enums") {
    args = [
      "-gen-clang-diags-enums",
      "-clang-component=${diag_group}",
    ]
    td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
    output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
  }

  clang_tablegen("Diagnostic${diag_group}CompatIDs") {
    args = [
      "-gen-clang-diags-compat-ids",
      "-clang-component=${diag_group}",
    ]
    td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
    output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
  }
}
group("diags_tablegen") {
  # DiagnosticGroups, DiagnosticIndexName, DiagnosticAllCompatIDs are
  # intentionally not part of this group.  Much of clang depends on the
  # DiagKinds.inc files transitively, but almost nothing needs
  # DiagnosticGroups.inc, DiagnosticIndexName.inc, or
  # DiagnosticAllCompatIDs.inc.
  public_deps = []
  foreach(diag_group, diag_groups) {
    public_deps += [
      ":Diagnostic${diag_group}CompatIDs",
      ":Diagnostic${diag_group}Enums",
      ":Diagnostic${diag_group}Kinds",
    ]
  }
}

clang_tablegen("DiagnosticGroups") {
  args = [ "-gen-clang-diag-groups" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("DiagnosticIndexName") {
  args = [ "-gen-clang-diags-index-name" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("DiagnosticAllCompatIDs") {
  args = [ "-gen-clang-diags-compat-ids" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Diagnostic.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

# Attributes

clang_tablegen("AttrList") {
  args = [ "-gen-clang-attr-list" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("AttrSubMatchRulesList") {
  args = [ "-gen-clang-attr-subject-match-rule-list" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("RegularKeywordAttrInfo") {
  args = [ "-gen-clang-regular-keyword-attr-info" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("AttrHasAttributeImpl") {
  args = [ "-gen-clang-attr-has-attribute-impl" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("Builtins") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Builtins.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsBPF") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsBPF.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsNVPTX") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsNVPTX.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsSPIRV") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsSPIRV.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsX86_64") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsX86_64.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsHexagon") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsHexagon.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsRISCV") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsRISCV.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("BuiltinsX86") {
  args = [ "-gen-clang-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinsX86.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

# ARM CDE, MVE, and NEON.

clang_tablegen("arm_neon") {
  args = [ "-gen-arm-neon-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_neon.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_fp16") {
  args = [ "-gen-arm-neon-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_fp16.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_immcheck_types") {
  args = [ "-gen-arm-immcheck-types" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_mve_builtins") {
  args = [ "-gen-arm-mve-builtin-def" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_mve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_mve_builtin_cg") {
  args = [ "-gen-arm-mve-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_mve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_mve_builtin_sema") {
  args = [ "-gen-arm-mve-builtin-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_mve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_mve_builtin_aliases") {
  args = [ "-gen-arm-mve-builtin-aliases" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_mve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sve_builtins") {
  args = [ "-gen-arm-sve-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sve_builtin_cg") {
  args = [ "-gen-arm-sve-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sve_typeflags") {
  args = [ "-gen-arm-sve-typeflags" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sve_sema_rangechecks") {
  args = [ "-gen-arm-sve-sema-rangechecks" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sve_streaming_attrs") {
  args = [ "-gen-arm-sve-streaming-attrs" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sve.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sme_builtins") {
  args = [ "-gen-arm-sme-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sme.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sme_builtin_cg") {
  args = [ "-gen-arm-sme-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sme.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sme_sema_rangechecks") {
  args = [ "-gen-arm-sme-sema-rangechecks" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sme.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sme_streaming_attrs") {
  args = [ "-gen-arm-sme-streaming-attrs" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sme.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_sme_builtins_za_state") {
  args = [ "-gen-arm-sme-builtin-za-state" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_sme.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_cde_builtins") {
  args = [ "-gen-arm-cde-builtin-def" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_cde.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_cde_builtin_cg") {
  args = [ "-gen-arm-cde-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_cde.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_cde_builtin_sema") {
  args = [ "-gen-arm-cde-builtin-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_cde.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("arm_cde_builtin_aliases") {
  args = [ "-gen-arm-cde-builtin-aliases" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/arm_cde.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

# RISC-V

clang_tablegen("riscv_vector_builtins") {
  args = [ "-gen-riscv-vector-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("riscv_vector_builtin_cg") {
  args = [ "-gen-riscv-vector-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("riscv_vector_builtin_sema") {
  args = [ "-gen-riscv-vector-builtin-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("riscv_sifive_vector_builtins") {
  args = [ "-gen-riscv-sifive-vector-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_sifive_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("riscv_sifive_vector_builtin_cg") {
  args = [ "-gen-riscv-sifive-vector-builtin-codegen" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_sifive_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("riscv_sifive_vector_builtin_sema") {
  args = [ "-gen-riscv-sifive-vector-builtin-sema" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/riscv_sifive_vector.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

# from clang/include/clang/Driver
tablegen("Options") {
  args = [ "-gen-opt-parser-defs" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Driver/Options.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Driver"
}

# from clang/include/clang/Sema
clang_tablegen("AttrTemplateInstantiate") {
  args = [ "-gen-clang-attr-template-instantiate" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Sema"
}

clang_tablegen("AttrParsedAttrList") {
  args = [ "-gen-clang-attr-parsed-attr-list" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}

clang_tablegen("AttrParsedAttrKinds") {
  args = [ "-gen-clang-attr-parsed-attr-kinds" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Sema"
}

clang_tablegen("AttrSpellingListIndex") {
  args = [ "-gen-clang-attr-spelling-index" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Sema"
}

clang_tablegen("AttrParsedAttrImpl") {
  args = [ "-gen-clang-attr-parsed-attr-impl" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Sema"
}

# from clang/include/clang/Parse
clang_tablegen("AttrParserStringSwitches") {
  args = [ "-gen-clang-attr-parser-string-switches" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Parse"
}

clang_tablegen("AttrSubMatchRulesParserStringSwitches") {
  args = [ "-gen-clang-attr-subject-match-rules-parser-string-switches" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Parse"
}

# from clang/lib/Sema
clang_tablegen("OpenCLBuiltins") {
  args = [ "-gen-clang-opencl-builtins" ]
  td_file = "//$clspv_llvm_dir/clang/lib/Sema/OpenCLBuiltins.td"
  output_path = "$clspv_llvm_dir/clang/lib/Sema"
}

# from clang/include/clang/Serialization
clang_tablegen("AttrPCHRead") {
  args = [ "-gen-clang-attr-pch-read" ]
  td_file =
      "//$clspv_llvm_dir/clang/include/clang/Serialization/../Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Serialization"
}

clang_tablegen("AttrPCHWrite") {
  args = [ "-gen-clang-attr-pch-write" ]
  td_file =
      "//$clspv_llvm_dir/clang/include/clang/Serialization/../Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Serialization"
}

# from clang/include/clang/StaticAnalyzer
clang_tablegen("Checkers") {
  args = [ "-gen-clang-sa-checkers" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/StaticAnalyzer/Checkers"
}

clang_tablegen("BuiltinTemplates") {
  args = [ "-gen-clang-builtin-templates" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/BuiltinTemplates.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}
clang_tablegen("CXX11AttributeInfo") {
  args = [ "-gen-cxx11-attribute-info" ]
  td_file = "//$clspv_llvm_dir/clang/include/clang/Basic/Attr.td"
  output_path = "$clspv_llvm_dir/clang/include/clang/Basic"
}
