cc_defaults {
    name: "llvm-defaults",
    defaults: ["llvm-defaults-no-generated-headers"],
    header_libs: ["llvm-headers"],
    tidy_checks: [
        "-google-build-*",
        "-google-global-*",
    ],
    sanitize: {
        hwaddress: false, // code size b/112437884
    },
}

// This module defines all of the defaults used to compiled llvm, except for
// the generated headers.  It is necessary to avoid a circular dependency
// from the tblgen tool used to generate the headers to the generated headers.
llvm_defaults {
    name: "llvm-defaults-no-generated-headers",

    host_supported: true,

    cflags: [
        "-D_GNU_SOURCE",
        "-D__STDC_LIMIT_MACROS",
        "-D__STDC_CONSTANT_MACROS",
        "-D__STDC_FORMAT_MACROS",
        "-fomit-frame-pointer",
        "-Wall",
        "-W",
        "-Wno-cast-qual",
        "-Wno-sign-compare",
        "-Wno-unused-parameter",
        "-Wno-maybe-uninitialized",
        "-Wno-missing-field-initializers",
        "-Wno-implicit-fallthrough",
        "-Wwrite-strings",
        "-Werror",
        "-Dsprintf=sprintf",
    ],

    cppflags: [
        "-Wno-sign-promo",
        "-std=c++11",
    ],

    tidy_checks: [
        "-google-build-*",
        "-google-global-*",
    ],

    header_libs: ["llvm-headers-no-generated-headers"],

    target: {
        android: {
            cflags: [
                "-finline-functions",
            ],
        },
        linux: {
            cppflags: [
                "-Woverloaded-virtual",
            ],
        },
        host: {
            cppflags: [
                "-fno-rtti",
                "-fno-exceptions",
            ],
        },
        windows: {
            // Disable certain warnings for use with mingw.
            // We also must undefine WIN32_LEAN_AND_MEAN, since it is being passed globally
            // on the command line, and LLVM defines this internally itself.
            cflags: [
                "-Wno-array-bounds",
                "-Wno-comment",
                "-UWIN32_LEAN_AND_MEAN",
            ],

            host_ldlibs: ["-luuid"],
        },
        linux_glibc: {
            // Add on ncurses to have support for terminfo
            host_ldlibs: [
                "-lncurses",
                "-lgcc_s",
            ],
        },
        darwin: {
            cppflags: [
                "-Wno-deprecated-declarations",
                "-Woverloaded-virtual",
            ],

            // Add on ncurses to have support for terminfo
            host_ldlibs: [
                "-lncurses",
            ],
        },
    },
}

cc_library_headers {
    name: "llvm-headers-no-generated-headers",
    vendor_available: true,
    host_supported: true,
    export_include_dirs: ["include"],
    target: {
        android: {
            export_include_dirs: ["device/include"],
        },
        host: {
            export_include_dirs: ["host/include"],
        },
        linux_bionic: {
            enabled: true,
        },
        windows: {
            enabled: true,
        },
    },
}

cc_library_headers {
    name: "llvm-headers",
    vendor_available: true,
    host_supported: true,
    header_libs: ["llvm-headers-no-generated-headers"],
    export_header_lib_headers: ["llvm-headers-no-generated-headers"],
    generated_headers: [
        "llvm-gen-attributes",
        "llvm-gen-intrinsics",
    ],
    export_generated_headers: [
        "llvm-gen-attributes",
        "llvm-gen-intrinsics",
    ],
    target: {
        windows: {
            enabled: true,
        },
    },
}

llvm_tblgen {
    name: "llvm-gen-attributes",
    in: "include/llvm/IR/Attributes.td",
    outs: ["llvm/IR/Attributes.inc"],
}

llvm_tblgen {
    name: "llvm-gen-intrinsics",
    in: "include/llvm/IR/Intrinsics.td",
    outs: ["llvm/IR/Intrinsics.gen"],
}

force_build_llvm_components_defaults {
    name: "force_build_llvm_components",
    // Host build disabled by soong/llvm.go unless FORCE_BUILD_LLVM_COMPONENTS
    // environment variable is set
}

// LLVM shared library build

llvm_arm_static_libraries = [
    "libLLVMARMCodeGen",
    "libLLVMARMAsmParser",
    "libLLVMARMAsmPrinter",
    "libLLVMARMInfo",
    "libLLVMARMDesc",
    "libLLVMARMDisassembler",
]

llvm_x86_static_libraries = [
    "libLLVMX86CodeGen",
    "libLLVMX86Info",
    "libLLVMX86Desc",
    "libLLVMX86AsmParser",
    "libLLVMX86AsmPrinter",
    "libLLVMX86Utils",
    "libLLVMX86Disassembler",
]

llvm_mips_static_libraries = [
    "libLLVMMipsCodeGen",
    "libLLVMMipsInfo",
    "libLLVMMipsDesc",
    "libLLVMMipsAsmParser",
    "libLLVMMipsAsmPrinter",
    "libLLVMMipsDisassembler",
]

llvm_aarch64_static_libraries = [
    "libLLVMAArch64CodeGen",
    "libLLVMAArch64Info",
    "libLLVMAArch64Desc",
    "libLLVMAArch64AsmParser",
    "libLLVMAArch64AsmPrinter",
    "libLLVMAArch64Utils",
    "libLLVMAArch64Disassembler",
]

cc_library {
    host_supported: true,
    name: "libLLVM_android",
    vendor_available: true,
    defaults: [
        "llvm-defaults",
        "force_build_llvm_components",
    ],

    whole_static_libs: [
        // pre static libraries
        "libLLVMLinker",
        "libLLVMipo",
        "libLLVMDebugInfoDWARF",
        "libLLVMDebugInfoPDB",
        "libLLVMSymbolize",
        "libLLVMIRReader",
        "libLLVMBitWriter",
        "libLLVMBitReader",

        // post static libraries
        "libLLVMLTO",
        "libLLVMAsmPrinter",
        "libLLVMSelectionDAG",
        "libLLVMCodeGen",
        "libLLVMDebugInfoCodeView",
        "libLLVMObject",
        "libLLVMScalarOpts",
        "libLLVMInstCombine",
        "libLLVMInstrumentation",
        "libLLVMTransformObjCARC",
        "libLLVMTransformUtils",
        "libLLVMAnalysis",
        "libLLVMTarget",
        "libLLVMGlobalISel",
        "libLLVMMCDisassembler",
        "libLLVMMC",
        "libLLVMMCParser",
        "libLLVMCore",
        "libLLVMAsmParser",
        "libLLVMOption",
        "libLLVMSupport",
        "libLLVMVectorize",
        "libLLVMProfileData",
        "libLLVMProfileDataCoverage",
        "libLLVMLibDriver",
        "libLLVMExecutionEngine",
        "libLLVMRuntimeDyld",
        "libLLVMMCJIT",
        "libLLVMOrcJIT",
    ],

    export_include_dirs: ["include"],

    target: {
        host: {
            // Host build pulls in all ARM, Mips, X86 components.
           whole_static_libs: llvm_arm_static_libraries +
                llvm_aarch64_static_libraries +
                llvm_mips_static_libraries +
                llvm_x86_static_libraries,
            export_include_dirs: ["host/include"],
        },
        windows: {
            enabled: true,
            host_ldlibs: [
                "-limagehlp",
                "-lpsapi",
                "-lole32",
                "-lversion",
            ],
        },
        android: {
            export_include_dirs: ["device/include"],
        },
        android_arm: {
            whole_static_libs: llvm_arm_static_libraries,
        },
        android_x86: {
            whole_static_libs: llvm_x86_static_libraries +
                llvm_arm_static_libraries +
                llvm_aarch64_static_libraries,
        },
        android_x86_64: {
            whole_static_libs: llvm_x86_static_libraries +
                llvm_arm_static_libraries +
                llvm_aarch64_static_libraries,
        },
        android_mips: {
            whole_static_libs: llvm_mips_static_libraries,
        },
        android_mips64: {
            whole_static_libs: llvm_mips_static_libraries,
        },
        android_arm64: {
            whole_static_libs: llvm_aarch64_static_libraries +
                llvm_arm_static_libraries,
        },
    },
}

subdirs = [
    "soong",
    "lib",
    "tools/*",
    "utils/*",
]