// Using SIMD types in a program with foreign-function interfaces used to result in an ICE
// (internal compiler error). Since this was fixed in #21233, it should be checked that
// compilation of SIMD and FFI together should be successful on all the most common
// architectures.
// Note that this test does not check linking or binary execution.
// See https://github.com/rust-lang/rust/pull/21233

use run_make_support::{llvm_components_contain, rustc};

fn main() {
    let mut targets = Vec::new();
    // arm-specific targets.
    if llvm_components_contain("arm") {
        targets.append(&mut vec![
            "arm-linux-androideabi".to_owned(),
            "arm-unknown-linux-gnueabihf".to_owned(),
            "arm-unknown-linux-gnueabi".to_owned(),
        ]);
    }
    let mut x86_archs = Vec::new();
    if llvm_components_contain("x86") {
        x86_archs.append(&mut vec!["i686", "x86_64"]);
    }
    // Linux has all x86 targets, plus aarch64 and mips.
    let mut extra_targets = x86_archs.clone();
    if llvm_components_contain("aarch64") {
        extra_targets.push("aarch64");
    }
    if llvm_components_contain("mips") {
        extra_targets.append(&mut vec!["mips", "mipsel"]);
    }

    for target in extra_targets {
        let linux = format!("{target}-unknown-linux-gnu");
        targets.push(linux);
    }

    // Windows and Darwin (OSX) only receive x86 targets.
    let extra_targets = x86_archs.clone();
    for target in extra_targets {
        let windows = format!("{target}-pc-windows-gnu");
        let darwin = format!("{target}-apple-darwin");
        targets.push(windows);
        targets.push(darwin);
    }

    for target in targets {
        // compile the rust file to the given target, but only to asm and IR
        // form, to avoid having to have an appropriate linker.
        //
        // we need some features because the integer SIMD instructions are not
        // enabled by-default for i686 and ARM; these features will be invalid
        // on some platforms, but LLVM just prints a warning so that's fine for
        // now.
        rustc()
            .target(&target)
            .emit("llvm-ir,asm")
            .input("simd.rs")
            .arg("-Ctarget-feature=+neon,+sse")
            .arg(&format!("-Cextra-filename=-{target}"))
            .run();
    }
}
