Repository: rust-lang/cc-rs
Pull request #1252 (2024-11-01 05:23:34)

Use `rustc`'s knowledge of LLVM/Clang target triples
Part of https://github.com/rust-lang/cc-rs/issues/1249.

I _tried_ to keep it separate from cleaning up the Apple stuff, but things were quite intertwined, so I ended up having to do some of it. Still, this PR aims to have as few functional changes as possible (the only effect should be that we now use the correct Clang target).

Fixes https://github.com/rust-lang/cc-rs/issues/542 (was fixed before, but now we do it properly by passing `arm64-apple-macosx` instead of `arm64-apple-darwin`).
Fixes https://github.com/rust-lang/cc-rs/issues/1255.
Fixes https://github.com/rust-lang/cc-rs/issues/1205.
Might improve the situation in https://github.com/rust-lang/cc-rs/issues/1005.

This affects (checking local test script...) 128 targets, though I feel pretty confident that the change is correct, and if it's not, then it's likely an issue in `rustc` as well.


Patch:
diff --git a/.github/workflows/regenerate-target-info.yml b/.github/workflows/regenerate-target-info.yml
index c3b9254..d3b5afa 100644
--- a/.github/workflows/regenerate-target-info.yml
+++ b/.github/workflows/regenerate-target-info.yml
@@ -52,4 +52,4 @@ jobs:
         env:
           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         run: |
-          gh pr create --base main --title "Update src/target_info.rs" --body "Automatically regenerated in CI"
+          gh pr create --base main --title "Update src/target/generated.rs" --body "Automatically regenerated in CI"
diff --git a/dev-tools/gen-target-info/src/main.rs b/dev-tools/gen-target-info/src/main.rs
index bc6a3d5..27d8bd3 100644
--- a/dev-tools/gen-target-info/src/main.rs
+++ b/dev-tools/gen-target-info/src/main.rs
@@ -11,10 +11,10 @@ const PRELUDE: &str = r#"//! This file is generated code. Please edit the genera
 "#;
 
 fn generate_target_mapping(f: &mut File, target_specs: &RustcTargetSpecs) -> std::io::Result<()> {
-    writeln!(f, "use super::Target;")?;
+    writeln!(f, "use super::TargetInfo;")?;
     writeln!(f, "use std::borrow::Cow;")?;
     writeln!(f)?;
-    writeln!(f, "pub(crate) const LIST: &[(&str, Target)] = &[")?;
+    writeln!(f, "pub(crate) const LIST: &[(&str, TargetInfo)] = &[")?;
 
     for (triple, spec) in &target_specs.0 {
         let full_arch = triple.split_once('-').unwrap().0;
@@ -24,15 +24,34 @@ fn generate_target_mapping(f: &mut File, target_specs: &RustcTargetSpecs) -> std
         let env = spec.env.as_deref().unwrap_or("");
         let abi = spec.abi.as_deref().unwrap_or("");
 
+        // Remove deployment target information from LLVM target triples (we
+        // will add this in another part of CC).
+        //
+        // FIXME(madsmtm): Should become unnecessary after
+        // https://github.com/rust-lang/rust/pull/131037
+        let unversioned_llvm_target = if spec.llvm_target.contains("apple") {
+            let mut components = spec.llvm_target.split("-").collect::<Vec<_>>();
+
+            components[2] = components[2].trim_end_matches(|c: char| c.is_numeric() || c == '.');
+
+            components.join("-")
+        } else {
+            spec.llvm_target.clone()
+        };
+
         writeln!(f, "    (")?;
         writeln!(f, "        {triple:?},")?;
-        writeln!(f, "        Target {{")?;
+        writeln!(f, "        TargetInfo {{")?;
         writeln!(f, "            full_arch: Cow::Borrowed({full_arch:?}),")?;
         writeln!(f, "            arch: Cow::Borrowed({arch:?}),")?;
         writeln!(f, "            vendor: Cow::Borrowed({vendor:?}),")?;
         writeln!(f, "            os: Cow::Borrowed({os:?}),")?;
         writeln!(f, "            env: Cow::Borrowed({env:?}),")?;
         writeln!(f, "            abi: Cow::Borrowed({abi:?}),")?;
+        writeln!(
+            f,
+            "            unversioned_llvm_target: Cow::Borrowed({unversioned_llvm_target:?}),"
+        )?;
         writeln!(f, "        }},")?;
         writeln!(f, "    ),")?;
     }
diff --git a/src/lib.rs b/src/lib.rs
index 45faecd..b08540d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -219,7 +219,7 @@ use std::borrow::Cow;
 use std::collections::HashMap;
 use std::env;
 use std::ffi::{OsStr, OsString};
-use std::fmt::{self, Display, Formatter};
+use std::fmt::{self, Display};
 use std::fs;
 use std::io::{self, Write};
 use std::path::{Component, Path, PathBuf};
@@ -234,7 +234,7 @@ use shlex::Shlex;
 mod parallel;
 mod target;
 mod windows;
-use target::Target;
+use self::target::TargetInfo;
 // Regardless of whether this should be in this crate's public API,
 // it has been since 2015, so don't break it.
 pub use windows::find_tools as windows_registry;
@@ -634,7 +634,7 @@ impl Build {
         &self,
         flag: &OsStr,
         compiler_path: &Path,
-        target: &Target,
+        target: &TargetInfo,
     ) -> Result<bool, Error> {
         let compiler_flag = CompilerFlag {
             compiler: compiler_path.into(),
@@ -1932,7 +1932,7 @@ impl Build {
     fn add_default_flags(
         &self,
         cmd: &mut Tool,
-        target: &Target,
+        target: &TargetInfo,
         opt_level: &str,
     ) -> Result<(), Error> {
         let raw_target = self.get_raw_target()?;
@@ -1974,14 +1974,6 @@ impl Build {
                     cmd.push_opt_unless_duplicate(format!("-O{}", opt_level).into());
                 }
 
-                if cmd.is_like_clang() && target.os == "windows" {
-                    // Disambiguate mingw and msvc on Windows. Problem is that
-                    // depending on the origin clang can default to a mismatchig
-                    // run-time.
-                    // FIXME: Convert rustc target to Clang target.
-                    cmd.push_cc_arg(format!("--target={raw_target}").into());
-                }
-
                 if cmd.is_like_clang() && target.os == "android" {
                     // For compatibility with code that doesn't use pre-defined `__ANDROID__` macro.
                     // If compiler used via ndk-build or cmake (officially supported build methods)
@@ -2065,101 +2057,7 @@ impl Build {
                     || (target.os == "android"
                         && android_clang_compiler_uses_target_arg_internally(&cmd.path)))
                 {
-                    if target.os == "macos" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        cmd.args
-                            .push(format!("--target={}-apple-darwin", arch).into());
-                    } else if target.abi == "macabi" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        cmd.args
-                            .push(format!("--target={}-apple-ios-macabi", arch).into());
-                    } else if target.os == "ios" && target.abi == "sim" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::Ios, &AppleArchSpec::Simulator(""));
-                        let deployment_target =
-                            self.apple_deployment_version(AppleOs::Ios, None, &sdk_details.sdk);
-                        cmd.args.push(
-                            format!("--target={}-apple-ios{}-simulator", arch, deployment_target)
-                                .into(),
-                        );
-                    } else if target.os == "watchos" && target.abi == "sim" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::WatchOs, &AppleArchSpec::Simulator(""));
-                        let deployment_target =
-                            self.apple_deployment_version(AppleOs::WatchOs, None, &sdk_details.sdk);
-                        cmd.args.push(
-                            format!(
-                                "--target={}-apple-watchos{}-simulator",
-                                arch, deployment_target
-                            )
-                            .into(),
-                        );
-                    } else if target.os == "tvos" && target.abi == "sim" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::TvOs, &AppleArchSpec::Simulator(""));
-                        let deployment_target =
-                            self.apple_deployment_version(AppleOs::TvOs, None, &sdk_details.sdk);
-                        cmd.args.push(
-                            format!(
-                                "--target={}-apple-tvos{}-simulator",
-                                arch, deployment_target
-                            )
-                            .into(),
-                        );
-                    } else if target.os == "tvos" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::TvOs, &AppleArchSpec::Device(""));
-                        let deployment_target =
-                            self.apple_deployment_version(AppleOs::TvOs, None, &sdk_details.sdk);
-                        cmd.args.push(
-                            format!("--target={}-apple-tvos{}", arch, deployment_target).into(),
-                        );
-                    } else if target.os == "visionos" && target.abi == "sim" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::VisionOS, &AppleArchSpec::Simulator(""));
-                        let deployment_target = self.apple_deployment_version(
-                            AppleOs::VisionOS,
-                            None,
-                            &sdk_details.sdk,
-                        );
-                        cmd.args.push(
-                            format!(
-                                "--target={}-apple-xros{}-simulator",
-                                arch, deployment_target
-                            )
-                            .into(),
-                        );
-                    } else if target.os == "visionos" {
-                        let arch = map_darwin_target_from_rust_to_compiler_architecture(target);
-                        let sdk_details =
-                            apple_os_sdk_parts(AppleOs::VisionOS, &AppleArchSpec::Device(""));
-                        let deployment_target = self.apple_deployment_version(
-                            AppleOs::VisionOS,
-                            None,
-                            &sdk_details.sdk,
-                        );
-                        cmd.args.push(
-                            format!("--target={}-apple-xros{}", arch, deployment_target).into(),
-                        );
-                    } else if target.arch == "riscv32" || target.arch == "riscv64" {
-                        // FIXME: Convert rustc target to Clang target
-                        let (_, rest) = raw_target.split_once('-').unwrap();
-                        cmd.args
-                            .push(format!("--target={}-{}", &target.arch, rest).into());
-                    } else if target.os == "uefi" {
-                        if target.arch == "x86_64" {
-                            cmd.args.push("--target=x86_64-unknown-windows-gnu".into());
-                        } else if target.arch == "x86" {
-                            cmd.args.push("--target=i686-unknown-windows-gnu".into())
-                        } else if target.arch == "aarch64" {
-                            cmd.args.push("--target=aarch64-unknown-windows-gnu".into())
-                        }
-                    } else if target.os == "freebsd" {
+                    if target.os == "freebsd" {
                         // FreeBSD only supports C++11 and above when compiling against libc++
                         // (available from FreeBSD 10 onwards). Under FreeBSD, clang uses libc++ by
                         // default on FreeBSD 10 and newer unless `--target` is manually passed to
@@ -2181,18 +2079,19 @@ impl Build {
                         if self.cpp && self.cpp_set_stdlib.is_none() {
                             cmd.push_cc_arg("-stdlib=libc++".into());
                         }
+                    }
 
-                        // FIXME: Convert rustc target to Clang target.
-                        cmd.push_cc_arg(format!("--target={}", raw_target).into());
-                    } else if target.os == "windows" {
-                        cmd.args.push(
-                            format!("--target={}-pc-windows-{}", target.full_arch, target.env)
-                                .into(),
-                        )
+                    // Add version information to the target.
+                    let llvm_target = if target.vendor == "apple" {
+                        let deployment_target = self.apple_deployment_target(target);
+                        target.versioned_llvm_target(Some(&deployment_target))
                     } else {
-                        // FIXME: Convert rustc target to Clang target.
-                        cmd.push_cc_arg(format!("--target={}", raw_target).into());
-                    }
+                        target.versioned_llvm_target(None)
+                    };
+
+                    // Pass `--target` with the LLVM target to properly
+                    // configure Clang even when cross-compiling.
+                    cmd.args.push(format!("--target={llvm_target}").into());
                 }
             }
             ToolFamily::Msvc { clang_cl } => {
@@ -2208,8 +2107,8 @@ impl Build {
                         cmd.push_cc_arg("-m32".into());
                         cmd.push_cc_arg("-arch:IA32".into());
                     } else {
-                        // FIXME: Convert rustc target to Clang target.
-                        cmd.push_cc_arg(format!("--target={}", raw_target).into());
+                        let llvm_target = target.versioned_llvm_target(None);
+                        cmd.push_cc_arg(format!("--target={llvm_target}").into());
                     }
                 } else if target.full_arch == "i586" {
                     cmd.push_cc_arg("-arch:IA32".into());
@@ -2629,18 +2528,6 @@ impl Build {
 
     fn apple_flags(&self, cmd: &mut Tool) -> Result<(), Error> {
         let target = self.get_target()?;
-        let os = if target.os == "macos" {
-            AppleOs::MacOs
-        } else if target.os == "watchos" {
-            AppleOs::WatchOs
-        } else if target.os == "tvos" {
-            AppleOs::TvOs
-        } else if target.os == "visionos" {
-            AppleOs::VisionOS
-        } else {
-            AppleOs::Ios
-        };
-
         let arch_str = &*target.full_arch;
 
         let arch = if target.os == "macos" {
@@ -2689,14 +2576,14 @@ impl Build {
                 _ => {
                     return Err(Error::new(
                         ErrorKind::ArchitectureInvalid,
-                        format!("Unknown architecture for {:?} target.", os),
+                        format!("Unknown architecture for {:?} target.", target.os),
                     ));
                 }
             }
         };
 
-        let sdk_details = apple_os_sdk_parts(os, &arch);
-        let min_version = self.apple_deployment_version(os, Some(arch_str), &sdk_details.sdk);
+        let sdk_details = apple_os_sdk_parts(&target.os, &arch);
+        let min_version = self.apple_deployment_target(&target);
 
         match arch {
             AppleArchSpec::Device(_) if target.os == "macos" => {
@@ -2708,7 +2595,7 @@ impl Build {
                 cmd.args.push(arch.into());
                 // `-mxros-version-min` does not exist
                 // https://github.com/llvm/llvm-project/issues/88271
-                if os != AppleOs::VisionOS {
+                if target.os != "visionos" {
                     cmd.args.push(
                         format!("-m{}os-version-min={}", sdk_details.sdk_prefix, min_version)
                             .into(),
@@ -2723,7 +2610,7 @@ impl Build {
                     cmd.args.push("-arch".into());
                     cmd.args.push(arch.into());
                 }
-                if os != AppleOs::VisionOS {
+                if target.os != "visionos" {
                     cmd.args.push(
                         format!(
                             "-m{}simulator-version-min={}",
@@ -2740,7 +2627,7 @@ impl Build {
         if cmd.is_xctoolchain_clang() || target.os != "macos" {
             self.cargo_output.print_metadata(&format_args!(
                 "Detecting {:?} SDK path for {}",
-                os, sdk_details.sdk
+                target.os, sdk_details.sdk
             ));
             let sdk_path = self.apple_sdk_root(&sdk_details.sdk)?;
 
@@ -3579,10 +3466,10 @@ impl Build {
             .or_else(|| prefixes.first().copied())
     }
 
-    fn get_target(&self) -> Result<Target, Error> {
+    fn get_target(&self) -> Result<TargetInfo, Error> {
         match &self.target {
             Some(t) => t.parse(),
-            None => Target::from_cargo_environment_variables(),
+            None => TargetInfo::from_cargo_environment_variables(),
         }
     }
 
@@ -3839,7 +3726,8 @@ impl Build {
         Ok(sdk_path)
     }
 
-    fn apple_deployment_version(&self, os: AppleOs, arch_str: Option<&str>, sdk: &str) -> Arc<str> {
+    fn apple_deployment_target(&self, target: &TargetInfo) -> Arc<str> {
+        let sdk = target.apple_sdk_name();
         if let Some(ret) = self
             .apple_versions_cache
             .read()
@@ -3890,8 +3778,8 @@ impl Build {
                 .split('.')
                 .map(|v| v.parse::<u32>().expect("integer version"));
 
-            match os {
-                AppleOs::MacOs => {
+            match &*target.os {
+                "macos" => {
                     let major = deployment_target.next().unwrap_or(0);
                     let minor = deployment_target.next().unwrap_or(0);
 
@@ -3904,7 +3792,7 @@ impl Build {
                         return None;
                     }
                 }
-                AppleOs::Ios => {
+                "ios" => {
                     let major = deployment_target.next().unwrap_or(0);
 
                     // If below 10.7, we ignore it and let the SDK's target definitions handle it.
@@ -3935,12 +3823,12 @@ impl Build {
         //
         // The ordering of env -> XCode SDK -> old rustc defaults is intentional for performance when using
         // an explicit target.
-        let version: Arc<str> = match os {
-            AppleOs::MacOs => deployment_from_env("MACOSX_DEPLOYMENT_TARGET")
+        let version: Arc<str> = match &*target.os {
+            "macos" => deployment_from_env("MACOSX_DEPLOYMENT_TARGET")
                 .and_then(maybe_cpp_version_baseline)
                 .or_else(default_deployment_from_sdk)
                 .unwrap_or_else(|| {
-                    if arch_str == Some("aarch64") {
+                    if target.arch == "aarch64" {
                         "11.0".into()
                     } else {
                         let default: Arc<str> = Arc::from("10.7");
@@ -3948,22 +3836,24 @@ impl Build {
                     }
                 }),
 
-            AppleOs::Ios => deployment_from_env("IPHONEOS_DEPLOYMENT_TARGET")
+            "ios" => deployment_from_env("IPHONEOS_DEPLOYMENT_TARGET")
                 .and_then(maybe_cpp_version_baseline)
                 .or_else(default_deployment_from_sdk)
                 .unwrap_or_else(|| "7.0".into()),
 
-            AppleOs::WatchOs => deployment_from_env("WATCHOS_DEPLOYMENT_TARGET")
+            "watchos" => deployment_from_env("WATCHOS_DEPLOYMENT_TARGET")
                 .or_else(default_deployment_from_sdk)
                 .unwrap_or_else(|| "5.0".into()),
 
-            AppleOs::TvOs => deployment_from_env("TVOS_DEPLOYMENT_TARGET")
+            "tvos" => deployment_from_env("TVOS_DEPLOYMENT_TARGET")
                 .or_else(default_deployment_from_sdk)
                 .unwrap_or_else(|| "9.0".into()),
 
-            AppleOs::VisionOS => deployment_from_env("XROS_DEPLOYMENT_TARGET")
+            "visionos" => deployment_from_env("XROS_DEPLOYMENT_TARGET")
                 .or_else(default_deployment_from_sdk)
                 .unwrap_or_else(|| "1.0".into()),
+
+            os => unreachable!("unknown Apple OS: {}", os),
         };
 
         self.apple_versions_cache
@@ -4040,12 +3930,12 @@ impl Build {
         None
     }
 
-    fn windows_registry_find(&self, target: &Target, tool: &str) -> Option<Command> {
+    fn windows_registry_find(&self, target: &TargetInfo, tool: &str) -> Option<Command> {
         self.windows_registry_find_tool(target, tool)
             .map(|c| c.to_command())
     }
 
-    fn windows_registry_find_tool(&self, target: &Target, tool: &str) -> Option<Tool> {
+    fn windows_registry_find_tool(&self, target: &TargetInfo, tool: &str) -> Option<Tool> {
         struct BuildEnvGetter<'s>(&'s Build);
 
         impl windows_registry::EnvGetter for BuildEnvGetter<'_> {
@@ -4069,43 +3959,23 @@ fn fail(s: &str) -> ! {
     std::process::exit(1);
 }
 
-#[derive(Clone, Copy, PartialEq)]
-enum AppleOs {
-    MacOs,
-    Ios,
-    WatchOs,
-    TvOs,
-    VisionOS,
-}
-
-impl std::fmt::Debug for AppleOs {
-    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
-        match self {
-            AppleOs::MacOs => f.write_str("macOS"),
-            AppleOs::Ios => f.write_str("iOS"),
-            AppleOs::WatchOs => f.write_str("WatchOS"),
-            AppleOs::TvOs => f.write_str("AppleTVOS"),
-            AppleOs::VisionOS => f.write_str("visionOS"),
-        }
-    }
-}
-
 struct AppleSdkTargetParts {
     sdk_prefix: &'static str,
     sim_prefix: &'static str,
     sdk: Cow<'static, str>,
 }
 
-fn apple_os_sdk_parts(os: AppleOs, arch: &AppleArchSpec) -> AppleSdkTargetParts {
+fn apple_os_sdk_parts(os: &str, arch: &AppleArchSpec) -> AppleSdkTargetParts {
     let (sdk_prefix, sim_prefix) = match os {
-        AppleOs::MacOs => ("macosx", ""),
-        AppleOs::Ios => ("iphone", "ios-"),
-        AppleOs::WatchOs => ("watch", "watch"),
-        AppleOs::TvOs => ("appletv", "appletv"),
-        AppleOs::VisionOS => ("xr", "xr"),
+        "macos" => ("macosx", ""),
+        "ios" => ("iphone", "ios-"),
+        "watchos" => ("watch", "watch"),
+        "tvos" => ("appletv", "appletv"),
+        "visionos" => ("xr", "xr"),
+        os => unreachable!("unknown Apple OS {}", os),
     };
     let sdk = match arch {
-        AppleArchSpec::Device(_) if os == AppleOs::MacOs => Cow::Borrowed("macosx"),
+        AppleArchSpec::Device(_) if os == "macos" => Cow::Borrowed("macosx"),
         AppleArchSpec::Device(_) => format!("{}os", sdk_prefix).into(),
         AppleArchSpec::Simulator(_) => format!("{}simulator", sdk_prefix).into(),
         AppleArchSpec::Catalyst(_) => Cow::Borrowed("macosx"),
@@ -4204,7 +4074,7 @@ fn autodetect_android_compiler(raw_target: &str, gnu: &str, clang: &str) -> Stri
 }
 
 // Rust and clang/cc don't agree on how to name the target.
-fn map_darwin_target_from_rust_to_compiler_architecture(target: &Target) -> &str {
+fn map_darwin_target_from_rust_to_compiler_architecture(target: &TargetInfo) -> &str {
     match &*target.full_arch {
         "aarch64" => "arm64",
         "arm64_32" => "arm64_32",
diff --git a/src/target.rs b/src/target.rs
index 61ce91e..0f28e86 100644
--- a/src/target.rs
+++ b/src/target.rs
@@ -6,13 +6,15 @@ use std::{borrow::Cow, env, str::FromStr};
 
 use crate::{Error, ErrorKind};
 
+mod apple;
 mod generated;
+mod llvm;
 
-/// The parts of `rustc`'s target triple.
+/// Information specific to a `rustc` target.
 ///
 /// See <https://doc.rust-lang.org/cargo/appendix/glossary.html#target>.
 #[derive(Debug, PartialEq, Clone)]
-pub(crate) struct Target {
+pub(crate) struct TargetInfo {
     /// The full architecture, including the subarchitecture.
     ///
     /// This differs from `cfg!(target_arch)`, which only specifies the
@@ -38,9 +40,11 @@ pub(crate) struct Target {
     ///
     /// This is the same as the value of `cfg!(target_abi)`.
     pub abi: Cow<'static, str>,
+    /// The unversioned LLVM/Clang target triple.
+    unversioned_llvm_target: Cow<'static, str>,
 }
 
-impl Target {
+impl TargetInfo {
     pub fn from_cargo_environment_variables() -> Result<Self, Error> {
         // `TARGET` must be present.
         //
@@ -90,7 +94,7 @@ impl Target {
         // back back to data from the known set of target triples instead.
         //
         // See discussion in #1225 for further details.
-        let fallback_target = Target::from_str(&target_triple).ok();
+        let fallback_target = TargetInfo::from_str(&target_triple).ok();
         let ft = fallback_target.as_ref();
         let arch = cargo_env("CARGO_CFG_TARGET_ARCH", ft.map(|t| t.arch.clone()))?;
         let vendor = cargo_env("CARGO_CFG_TARGET_VENDOR", ft.map(|t| t.vendor.clone()))?;
@@ -102,6 +106,12 @@ impl Target {
         let abi = cargo_env("CARGO_CFG_TARGET_ABI", ft.map(|t| t.abi.clone()))
             .unwrap_or(Cow::Borrowed(""));
 
+        // Prefer `rustc`'s LLVM target triple information.
+        let unversioned_llvm_target = match fallback_target {
+            Some(ft) => ft.unversioned_llvm_target,
+            None => llvm::guess_llvm_target_triple(full_arch, &vendor, &os, &env, &abi).into(),
+        };
+
         Ok(Self {
             full_arch: full_arch.to_string().into(),
             arch,
@@ -109,11 +119,12 @@ impl Target {
             os,
             env,
             abi,
+            unversioned_llvm_target,
         })
     }
 }
 
-impl FromStr for Target {
+impl FromStr for TargetInfo {
     type Err = Error;
 
     /// This will fail when using a custom target triple unknown to `rustc`.
@@ -121,8 +132,8 @@ impl FromStr for Target {
         if let Ok(index) =
             generated::LIST.binary_search_by_key(&target_triple, |(target_triple, _)| target_triple)
         {
-            let (_, target) = &generated::LIST[index];
-            Ok(target.clone())
+            let (_, info) = &generated::LIST[index];
+            Ok(info.clone())
         } else {
             Err(Error::new(
                 ErrorKind::InvalidTarget,
@@ -136,7 +147,7 @@ impl FromStr for Target {
 mod tests {
     use std::str::FromStr;
 
-    use super::Target;
+    use super::TargetInfo;
 
     // Test tier 1 targets
     #[test]
@@ -155,7 +166,7 @@ mod tests {
 
         for target in targets {
             // Check that it parses
-            let _ = Target::from_str(target).unwrap();
+            let _ = TargetInfo::from_str(target).unwrap();
         }
     }
 
@@ -177,7 +188,7 @@ mod tests {
 
         for target in targets {
             // Check that it does not parse
-            let _ = Target::from_str(target).unwrap_err();
+            let _ = TargetInfo::from_str(target).unwrap_err();
         }
     }
 }
diff --git a/src/target/apple.rs b/src/target/apple.rs
new file mode 100644
index 0000000..f5ec1d8
--- /dev/null
+++ b/src/target/apple.rs
@@ -0,0 +1,19 @@
+use super::TargetInfo;
+
+impl TargetInfo {
+    pub(crate) fn apple_sdk_name(&self) -> &'static str {
+        match (&*self.os, &*self.abi) {
+            ("macos", "") => "macosx",
+            ("ios", "") => "iphoneos",
+            ("ios", "sim") => "iphonesimulator",
+            ("ios", "macabi") => "macosx",
+            ("tvos", "") => "appletvos",
+            ("tvos", "sim") => "appletvsimulator",
+            ("watchos", "") => "watchos",
+            ("watchos", "sim") => "watchsimulator",
+            ("visionos", "") => "xros",
+            ("visionos", "sim") => "xrsimulator",
+            (os, _) => panic!("invalid Apple target OS {}", os),
+        }
+    }
+}
diff --git a/src/target/generated.rs b/src/target/generated.rs
index d28b922..0fa3ff3 100644
--- a/src/target/generated.rs
+++ b/src/target/generated.rs
@@ -1,3066 +1,3344 @@
 //! This file is generated code. Please edit the generator
 //! in dev-tools/gen-target-info if you need to make changes.
 
-use super::Target;
+use super::TargetInfo;
 use std::borrow::Cow;
 
-pub(crate) const LIST: &[(&str, Target)] = &[
+pub(crate) const LIST: &[(&str, TargetInfo)] = &[
     (
         "aarch64-apple-darwin",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("macos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-macosx"),
         },
     ),
     (
         "aarch64-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-ios"),
         },
     ),
     (
         "aarch64-apple-ios-macabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("macabi"),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-ios-macabi"),
         },
     ),
     (
         "aarch64-apple-ios-sim",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-ios-simulator"),
         },
     ),
     (
         "aarch64-apple-tvos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("tvos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-tvos"),
         },
     ),
     (
         "aarch64-apple-tvos-sim",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("tvos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-tvos-simulator"),
         },
     ),
     (
         "aarch64-apple-visionos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("visionos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-xros"),
         },
     ),
     (
         "aarch64-apple-visionos-sim",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("visionos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-xros-simulator"),
         },
     ),
     (
         "aarch64-apple-watchos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("watchos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-watchos"),
         },
     ),
     (
         "aarch64-apple-watchos-sim",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("watchos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("arm64-apple-watchos-simulator"),
         },
     ),
     (
         "aarch64-fuchsia",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("fuchsia"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-fuchsia"),
         },
     ),
     (
         "aarch64-kmc-solid_asp3",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("kmc"),
             os: Cow::Borrowed("solid_asp3"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-none"),
         },
     ),
     (
         "aarch64-linux-android",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-linux-android"),
         },
     ),
     (
         "aarch64-nintendo-switch-freestanding",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("nintendo"),
             os: Cow::Borrowed("horizon"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-none"),
         },
     ),
     (
         "aarch64-pc-windows-gnullvm",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("llvm"),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-pc-windows-gnu"),
         },
     ),
     (
         "aarch64-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-pc-windows-msvc"),
         },
     ),
     (
         "aarch64-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-freebsd"),
         },
     ),
     (
         "aarch64-unknown-fuchsia",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("fuchsia"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-fuchsia"),
         },
     ),
     (
         "aarch64-unknown-hermit",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("hermit"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-hermit"),
         },
     ),
     (
         "aarch64-unknown-illumos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("illumos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-solaris2.11"),
         },
     ),
     (
         "aarch64-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-linux-gnu"),
         },
     ),
     (
         "aarch64-unknown-linux-gnu_ilp32",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("ilp32"),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-linux-gnu_ilp32"),
         },
     ),
     (
         "aarch64-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-linux-musl"),
         },
     ),
     (
         "aarch64-unknown-linux-ohos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("ohos"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-linux-ohos"),
         },
     ),
     (
         "aarch64-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-netbsd"),
         },
     ),
     (
         "aarch64-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-none"),
         },
     ),
     (
         "aarch64-unknown-none-softfloat",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("softfloat"),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-none"),
         },
     ),
     (
         "aarch64-unknown-nto-qnx700",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nto"),
             env: Cow::Borrowed("nto70"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-unknown"),
         },
     ),
     (
         "aarch64-unknown-nto-qnx710",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nto"),
             env: Cow::Borrowed("nto71"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-unknown"),
         },
     ),
     (
         "aarch64-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-openbsd"),
         },
     ),
     (
         "aarch64-unknown-redox",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("redox"),
             env: Cow::Borrowed("relibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-redox"),
         },
     ),
     (
         "aarch64-unknown-teeos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("teeos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-none"),
         },
     ),
     (
         "aarch64-unknown-trusty",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("trusty"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-unknown-musl"),
         },
     ),
     (
         "aarch64-unknown-uefi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("uefi"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-windows"),
         },
     ),
     (
         "aarch64-uwp-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-pc-windows-msvc"),
         },
     ),
     (
         "aarch64-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64-unknown-linux-gnu"),
         },
     ),
     (
         "aarch64_be-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64_be"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64_be-unknown-linux-gnu"),
         },
     ),
     (
         "aarch64_be-unknown-linux-gnu_ilp32",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64_be"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("ilp32"),
+            unversioned_llvm_target: Cow::Borrowed("aarch64_be-unknown-linux-gnu_ilp32"),
         },
     ),
     (
         "aarch64_be-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("aarch64_be"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("aarch64_be-unknown-netbsd"),
         },
     ),
     (
         "arm-linux-androideabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("arm-linux-androideabi"),
         },
     ),
     (
         "arm-unknown-linux-gnueabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("arm-unknown-linux-gnueabi"),
         },
     ),
     (
         "arm-unknown-linux-gnueabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("arm-unknown-linux-gnueabihf"),
         },
     ),
     (
         "arm-unknown-linux-musleabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("arm-unknown-linux-gnueabi"),
         },
     ),
     (
         "arm-unknown-linux-musleabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("arm-unknown-linux-gnueabihf"),
         },
     ),
     (
         "arm64_32-apple-watchos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm64_32"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("watchos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64_32-apple-watchos"),
         },
     ),
     (
         "arm64e-apple-darwin",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm64e"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("macos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64e-apple-macosx"),
         },
     ),
     (
         "arm64e-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm64e"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64e-apple-ios"),
         },
     ),
     (
         "arm64e-apple-tvos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm64e"),
             arch: Cow::Borrowed("aarch64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("tvos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64e-apple-tvos"),
         },
     ),
     (
         "arm64ec-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("arm64ec"),
             arch: Cow::Borrowed("arm64ec"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("arm64ec-pc-windows-msvc"),
         },
     ),
     (
         "armeb-unknown-linux-gnueabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armeb"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armeb-unknown-linux-gnueabi"),
         },
     ),
     (
         "armebv7r-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armebv7r"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armebv7r-none-eabi"),
         },
     ),
     (
         "armebv7r-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armebv7r"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armebv7r-none-eabihf"),
         },
     ),
     (
         "armv4t-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv4t"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv4t-none-eabi"),
         },
     ),
     (
         "armv4t-unknown-linux-gnueabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv4t"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv4t-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv5te-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv5te"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv5te-none-eabi"),
         },
     ),
     (
         "armv5te-unknown-linux-gnueabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv5te"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv5te-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv5te-unknown-linux-musleabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv5te"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv5te-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv5te-unknown-linux-uclibceabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv5te"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv5te-unknown-linux-uclibcgnueabi"),
         },
     ),
     (
         "armv6-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv6"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv6-unknown-freebsd-gnueabihf"),
         },
     ),
     (
         "armv6-unknown-netbsd-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv6"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv6-unknown-netbsdelf-eabihf"),
         },
     ),
     (
         "armv6k-nintendo-3ds",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv6k"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("nintendo"),
             os: Cow::Borrowed("horizon"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv6k-none-eabihf"),
         },
     ),
     (
         "armv7-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("armv7-apple-ios"),
         },
     ),
     (
         "armv7-linux-androideabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-none-linux-android"),
         },
     ),
     (
         "armv7-rtems-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("rtems"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-none-eabihf"),
         },
     ),
     (
         "armv7-sony-vita-newlibeabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("sony"),
             os: Cow::Borrowed("vita"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7a-vita-eabihf"),
         },
     ),
     (
         "armv7-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-freebsd-gnueabihf"),
         },
     ),
     (
         "armv7-unknown-linux-gnueabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv7-unknown-linux-gnueabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "armv7-unknown-linux-musleabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv7-unknown-linux-musleabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "armv7-unknown-linux-ohos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("ohos"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-ohos"),
         },
     ),
     (
         "armv7-unknown-linux-uclibceabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabi"),
         },
     ),
     (
         "armv7-unknown-linux-uclibceabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "armv7-unknown-netbsd-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-netbsdelf-eabihf"),
         },
     ),
     (
         "armv7-unknown-trusty",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("trusty"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-unknown-gnueabi"),
         },
     ),
     (
         "armv7-wrs-vxworks-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "armv7a-kmc-solid_asp3-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("kmc"),
             os: Cow::Borrowed("solid_asp3"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7a-none-eabi"),
         },
     ),
     (
         "armv7a-kmc-solid_asp3-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("kmc"),
             os: Cow::Borrowed("solid_asp3"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7a-none-eabihf"),
         },
     ),
     (
         "armv7a-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7a-none-eabi"),
         },
     ),
     (
         "armv7a-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7a-none-eabihf"),
         },
     ),
     (
         "armv7k-apple-watchos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7k"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("watchos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("armv7k-apple-watchos"),
         },
     ),
     (
         "armv7r-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7r"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7r-none-eabi"),
         },
     ),
     (
         "armv7r-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7r"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7r-none-eabihf"),
         },
     ),
     (
         "armv7s-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv7s"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("armv7s-apple-ios"),
         },
     ),
     (
         "armv8r-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("armv8r"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv8r-none-eabihf"),
         },
     ),
     (
         "asmjs-unknown-emscripten",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("asmjs"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("emscripten"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-unknown-emscripten"),
         },
     ),
     (
         "avr-unknown-gnu-atmega328",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("avr"),
             arch: Cow::Borrowed("avr"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("avr-unknown-unknown"),
         },
     ),
     (
         "bpfeb-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("bpfeb"),
             arch: Cow::Borrowed("bpf"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("bpfeb"),
         },
     ),
     (
         "bpfel-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("bpfel"),
             arch: Cow::Borrowed("bpf"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("bpfel"),
         },
     ),
     (
         "csky-unknown-linux-gnuabiv2",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("csky"),
             arch: Cow::Borrowed("csky"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abiv2"),
+            unversioned_llvm_target: Cow::Borrowed("csky-unknown-linux-gnuabiv2"),
         },
     ),
     (
         "csky-unknown-linux-gnuabiv2hf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("csky"),
             arch: Cow::Borrowed("csky"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abiv2hf"),
+            unversioned_llvm_target: Cow::Borrowed("csky-unknown-linux-gnuabiv2"),
         },
     ),
     (
         "hexagon-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("hexagon"),
             arch: Cow::Borrowed("hexagon"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("hexagon-unknown-linux-musl"),
         },
     ),
     (
         "hexagon-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("hexagon"),
             arch: Cow::Borrowed("hexagon"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("hexagon-unknown-none-elf"),
         },
     ),
     (
         "i386-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i386"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("i386-apple-ios-simulator"),
         },
     ),
     (
         "i586-pc-nto-qnx700",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i586"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("nto"),
             env: Cow::Borrowed("nto70"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i586-pc-unknown"),
         },
     ),
     (
         "i586-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i586"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i586-pc-windows-msvc"),
         },
     ),
     (
         "i586-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i586"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i586-unknown-linux-gnu"),
         },
     ),
     (
         "i586-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i586"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i586-unknown-linux-musl"),
         },
     ),
     (
         "i586-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i586"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i586-unknown-netbsdelf"),
         },
     ),
     (
         "i686-apple-darwin",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("macos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-apple-macosx"),
         },
     ),
     (
         "i686-linux-android",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-linux-android"),
         },
     ),
     (
         "i686-pc-windows-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-gnu"),
         },
     ),
     (
         "i686-pc-windows-gnullvm",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("llvm"),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-gnu"),
         },
     ),
     (
         "i686-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-msvc"),
         },
     ),
     (
         "i686-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-freebsd"),
         },
     ),
     (
         "i686-unknown-haiku",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("haiku"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-haiku"),
         },
     ),
     (
         "i686-unknown-hurd-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("hurd"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-hurd-gnu"),
         },
     ),
     (
         "i686-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-linux-gnu"),
         },
     ),
     (
         "i686-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-linux-musl"),
         },
     ),
     (
         "i686-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-netbsdelf"),
         },
     ),
     (
         "i686-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-openbsd"),
         },
     ),
     (
         "i686-unknown-redox",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("redox"),
             env: Cow::Borrowed("relibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-redox"),
         },
     ),
     (
         "i686-unknown-uefi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("uefi"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-windows-gnu"),
         },
     ),
     (
         "i686-uwp-windows-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-gnu"),
         },
     ),
     (
         "i686-uwp-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-msvc"),
         },
     ),
     (
         "i686-win7-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("win7"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-pc-windows-msvc"),
         },
     ),
     (
         "i686-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("i686"),
             arch: Cow::Borrowed("x86"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("i686-unknown-linux-gnu"),
         },
     ),
     (
         "loongarch64-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("loongarch64"),
             arch: Cow::Borrowed("loongarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("loongarch64-unknown-linux-gnu"),
         },
     ),
     (
         "loongarch64-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("loongarch64"),
             arch: Cow::Borrowed("loongarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("loongarch64-unknown-linux-musl"),
         },
     ),
     (
         "loongarch64-unknown-linux-ohos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("loongarch64"),
             arch: Cow::Borrowed("loongarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("ohos"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("loongarch64-unknown-linux-ohos"),
         },
     ),
     (
         "loongarch64-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("loongarch64"),
             arch: Cow::Borrowed("loongarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("loongarch64-unknown-none"),
         },
     ),
     (
         "loongarch64-unknown-none-softfloat",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("loongarch64"),
             arch: Cow::Borrowed("loongarch64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("softfloat"),
+            unversioned_llvm_target: Cow::Borrowed("loongarch64-unknown-none"),
         },
     ),
     (
         "m68k-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("m68k"),
             arch: Cow::Borrowed("m68k"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("m68k-unknown-linux-gnu"),
         },
     ),
     (
         "mips-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mips-unknown-linux-gnu"),
         },
     ),
     (
         "mips-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mips-unknown-linux-musl"),
         },
     ),
     (
         "mips-unknown-linux-uclibc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mips-unknown-linux-uclibc"),
         },
     ),
     (
         "mips64-openwrt-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips64"),
             arch: Cow::Borrowed("mips64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mips64-unknown-linux-musl"),
         },
     ),
     (
         "mips64-unknown-linux-gnuabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips64"),
             arch: Cow::Borrowed("mips64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mips64-unknown-linux-gnuabi64"),
         },
     ),
     (
         "mips64-unknown-linux-muslabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips64"),
             arch: Cow::Borrowed("mips64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mips64-unknown-linux-musl"),
         },
     ),
     (
         "mips64el-unknown-linux-gnuabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips64el"),
             arch: Cow::Borrowed("mips64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mips64el-unknown-linux-gnuabi64"),
         },
     ),
     (
         "mips64el-unknown-linux-muslabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mips64el"),
             arch: Cow::Borrowed("mips64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mips64el-unknown-linux-musl"),
         },
     ),
     (
         "mipsel-sony-psp",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("sony"),
             os: Cow::Borrowed("psp"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-sony-psp"),
         },
     ),
     (
         "mipsel-sony-psx",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("sony"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed("psx"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-sony-psx"),
         },
     ),
     (
         "mipsel-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-unknown-linux-gnu"),
         },
     ),
     (
         "mipsel-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-unknown-linux-musl"),
         },
     ),
     (
         "mipsel-unknown-linux-uclibc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-unknown-linux-uclibc"),
         },
     ),
     (
         "mipsel-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-unknown-netbsd"),
         },
     ),
     (
         "mipsel-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsel"),
             arch: Cow::Borrowed("mips"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsel-unknown-none"),
         },
     ),
     (
         "mipsisa32r6-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsisa32r6"),
             arch: Cow::Borrowed("mips32r6"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsisa32r6-unknown-linux-gnu"),
         },
     ),
     (
         "mipsisa32r6el-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsisa32r6el"),
             arch: Cow::Borrowed("mips32r6"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("mipsisa32r6el-unknown-linux-gnu"),
         },
     ),
     (
         "mipsisa64r6-unknown-linux-gnuabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsisa64r6"),
             arch: Cow::Borrowed("mips64r6"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mipsisa64r6-unknown-linux-gnuabi64"),
         },
     ),
     (
         "mipsisa64r6el-unknown-linux-gnuabi64",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("mipsisa64r6el"),
             arch: Cow::Borrowed("mips64r6"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("abi64"),
+            unversioned_llvm_target: Cow::Borrowed("mipsisa64r6el-unknown-linux-gnuabi64"),
         },
     ),
     (
         "msp430-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("msp430"),
             arch: Cow::Borrowed("msp430"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("msp430-none-elf"),
         },
     ),
     (
         "nvptx64-nvidia-cuda",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("nvptx64"),
             arch: Cow::Borrowed("nvptx64"),
             vendor: Cow::Borrowed("nvidia"),
             os: Cow::Borrowed("cuda"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("nvptx64-nvidia-cuda"),
         },
     ),
     (
         "powerpc-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-freebsd13.0"),
         },
     ),
     (
         "powerpc-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-gnu"),
         },
     ),
     (
         "powerpc-unknown-linux-gnuspe",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("spe"),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-gnuspe"),
         },
     ),
     (
         "powerpc-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-musl"),
         },
     ),
     (
         "powerpc-unknown-linux-muslspe",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("spe"),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-muslspe"),
         },
     ),
     (
         "powerpc-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-netbsd"),
         },
     ),
     (
         "powerpc-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-openbsd"),
         },
     ),
     (
         "powerpc-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-gnu"),
         },
     ),
     (
         "powerpc-wrs-vxworks-spe",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc"),
             arch: Cow::Borrowed("powerpc"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("spe"),
+            unversioned_llvm_target: Cow::Borrowed("powerpc-unknown-linux-gnuspe"),
         },
     ),
     (
         "powerpc64-ibm-aix",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("ibm"),
             os: Cow::Borrowed("aix"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("vec-extabi"),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-ibm-aix"),
         },
     ),
     (
         "powerpc64-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-unknown-freebsd"),
         },
     ),
     (
         "powerpc64-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-unknown-linux-gnu"),
         },
     ),
     (
         "powerpc64-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-unknown-linux-musl"),
         },
     ),
     (
         "powerpc64-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-unknown-openbsd"),
         },
     ),
     (
         "powerpc64-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64-unknown-linux-gnu"),
         },
     ),
     (
         "powerpc64le-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64le"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64le-unknown-freebsd"),
         },
     ),
     (
         "powerpc64le-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64le"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64le-unknown-linux-gnu"),
         },
     ),
     (
         "powerpc64le-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("powerpc64le"),
             arch: Cow::Borrowed("powerpc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("powerpc64le-unknown-linux-musl"),
         },
     ),
     (
         "riscv32-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32e-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32e"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32em-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32em"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32emc-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32emc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32gc-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32gc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32-unknown-linux-gnu"),
         },
     ),
     (
         "riscv32gc-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32gc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32-unknown-linux-musl"),
         },
     ),
     (
         "riscv32i-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32i"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32im-risc0-zkvm-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32im"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("risc0"),
             os: Cow::Borrowed("zkvm"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32im-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32im"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32ima-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32ima"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imac-esp-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imac"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imac-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imac"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imac-unknown-nuttx-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imac"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imac-unknown-xous-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imac"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("xous"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imafc-esp-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imafc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imafc-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imafc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imafc-unknown-nuttx-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imafc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imc-esp-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imc-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv32imc-unknown-nuttx-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv32imc"),
             arch: Cow::Borrowed("riscv32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv32"),
         },
     ),
     (
         "riscv64-linux-android",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-linux-android"),
         },
     ),
     (
         "riscv64-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64"),
         },
     ),
     (
         "riscv64gc-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-freebsd"),
         },
     ),
     (
         "riscv64gc-unknown-fuchsia",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("fuchsia"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-fuchsia"),
         },
     ),
     (
         "riscv64gc-unknown-hermit",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("hermit"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-hermit"),
         },
     ),
     (
         "riscv64gc-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-linux-gnu"),
         },
     ),
     (
         "riscv64gc-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-linux-musl"),
         },
     ),
     (
         "riscv64gc-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-netbsd"),
         },
     ),
     (
         "riscv64gc-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64"),
         },
     ),
     (
         "riscv64gc-unknown-nuttx-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64"),
         },
     ),
     (
         "riscv64gc-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64gc"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64-unknown-openbsd"),
         },
     ),
     (
         "riscv64imac-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64imac"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64"),
         },
     ),
     (
         "riscv64imac-unknown-nuttx-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("riscv64imac"),
             arch: Cow::Borrowed("riscv64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("riscv64"),
         },
     ),
     (
         "s390x-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("s390x"),
             arch: Cow::Borrowed("s390x"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("s390x-unknown-linux-gnu"),
         },
     ),
     (
         "s390x-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("s390x"),
             arch: Cow::Borrowed("s390x"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("s390x-unknown-linux-musl"),
         },
     ),
     (
         "sparc-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparc"),
             arch: Cow::Borrowed("sparc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparc-unknown-linux-gnu"),
         },
     ),
     (
         "sparc-unknown-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparc"),
             arch: Cow::Borrowed("sparc"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparc-unknown-none-elf"),
         },
     ),
     (
         "sparc64-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparc64"),
             arch: Cow::Borrowed("sparc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparc64-unknown-linux-gnu"),
         },
     ),
     (
         "sparc64-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparc64"),
             arch: Cow::Borrowed("sparc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparc64-unknown-netbsd"),
         },
     ),
     (
         "sparc64-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparc64"),
             arch: Cow::Borrowed("sparc64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparc64-unknown-openbsd"),
         },
     ),
     (
         "sparcv9-sun-solaris",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("sparcv9"),
             arch: Cow::Borrowed("sparc64"),
             vendor: Cow::Borrowed("sun"),
             os: Cow::Borrowed("solaris"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("sparcv9-sun-solaris"),
         },
     ),
     (
         "thumbv4t-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv4t"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv4t-none-eabi"),
         },
     ),
     (
         "thumbv5te-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv5te"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv5te-none-eabi"),
         },
     ),
     (
         "thumbv6m-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv6m"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv6m-none-eabi"),
         },
     ),
     (
         "thumbv6m-nuttx-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv6m"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv6m-none-eabi"),
         },
     ),
     (
         "thumbv7a-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7a-pc-windows-msvc"),
         },
     ),
     (
         "thumbv7a-uwp-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7a"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7a-pc-windows-msvc"),
         },
     ),
     (
         "thumbv7em-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7em"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7em-none-eabi"),
         },
     ),
     (
         "thumbv7em-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7em"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7em-none-eabihf"),
         },
     ),
     (
         "thumbv7em-nuttx-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7em"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7em-none-eabi"),
         },
     ),
     (
         "thumbv7em-nuttx-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7em"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7em-none-eabihf"),
         },
     ),
     (
         "thumbv7m-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7m"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7m-none-eabi"),
         },
     ),
     (
         "thumbv7m-nuttx-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7m"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv7m-none-eabi"),
         },
     ),
     (
         "thumbv7neon-linux-androideabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7neon"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-none-linux-android"),
         },
     ),
     (
         "thumbv7neon-unknown-linux-gnueabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7neon"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "thumbv7neon-unknown-linux-musleabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv7neon"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("armv7-unknown-linux-gnueabihf"),
         },
     ),
     (
         "thumbv8m.base-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.base"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.base-none-eabi"),
         },
     ),
     (
         "thumbv8m.base-nuttx-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.base"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.base-none-eabi"),
         },
     ),
     (
         "thumbv8m.main-none-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.main"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.main-none-eabi"),
         },
     ),
     (
         "thumbv8m.main-none-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.main"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.main-none-eabihf"),
         },
     ),
     (
         "thumbv8m.main-nuttx-eabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.main"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabi"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.main-none-eabi"),
         },
     ),
     (
         "thumbv8m.main-nuttx-eabihf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("thumbv8m.main"),
             arch: Cow::Borrowed("arm"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("nuttx"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("eabihf"),
+            unversioned_llvm_target: Cow::Borrowed("thumbv8m.main-none-eabihf"),
         },
     ),
     (
         "wasm32-unknown-emscripten",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("emscripten"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-unknown-emscripten"),
         },
     ),
     (
         "wasm32-unknown-unknown",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("unknown"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-unknown-unknown"),
         },
     ),
     (
         "wasm32-wasi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("wasi"),
             env: Cow::Borrowed("p1"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-wasi"),
         },
     ),
     (
         "wasm32-wasip1",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("wasi"),
             env: Cow::Borrowed("p1"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-wasi"),
         },
     ),
     (
         "wasm32-wasip1-threads",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("wasi"),
             env: Cow::Borrowed("p1"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-wasi"),
         },
     ),
     (
         "wasm32-wasip2",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("wasi"),
             env: Cow::Borrowed("p2"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-wasip2"),
         },
     ),
     (
         "wasm32v1-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm32v1"),
             arch: Cow::Borrowed("wasm32"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm32-unknown-unknown"),
         },
     ),
     (
         "wasm64-unknown-unknown",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("wasm64"),
             arch: Cow::Borrowed("wasm64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("unknown"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("wasm64-unknown-unknown"),
         },
     ),
     (
         "x86_64-apple-darwin",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("macos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-apple-macosx"),
         },
     ),
     (
         "x86_64-apple-ios",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-apple-ios-simulator"),
         },
     ),
     (
         "x86_64-apple-ios-macabi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("ios"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("macabi"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-apple-ios-macabi"),
         },
     ),
     (
         "x86_64-apple-tvos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("tvos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-apple-tvos-simulator"),
         },
     ),
     (
         "x86_64-apple-watchos-sim",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("watchos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed("sim"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-apple-watchos-simulator"),
         },
     ),
     (
         "x86_64-fortanix-unknown-sgx",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("fortanix"),
             os: Cow::Borrowed("unknown"),
             env: Cow::Borrowed("sgx"),
             abi: Cow::Borrowed("fortanix"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-elf"),
         },
     ),
     (
         "x86_64-fuchsia",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("fuchsia"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-fuchsia"),
         },
     ),
     (
         "x86_64-linux-android",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("android"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-linux-android"),
         },
     ),
     (
         "x86_64-pc-nto-qnx710",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("nto"),
             env: Cow::Borrowed("nto71"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-unknown"),
         },
     ),
     (
         "x86_64-pc-solaris",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("solaris"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-solaris"),
         },
     ),
     (
         "x86_64-pc-windows-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-windows-gnu"),
         },
     ),
     (
         "x86_64-pc-windows-gnullvm",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("llvm"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-windows-gnu"),
         },
     ),
     (
         "x86_64-pc-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("pc"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-windows-msvc"),
         },
     ),
     (
         "x86_64-sun-solaris",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("sun"),
             os: Cow::Borrowed("solaris"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-solaris"),
         },
     ),
     (
         "x86_64-unikraft-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unikraft"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-musl"),
         },
     ),
     (
         "x86_64-unknown-dragonfly",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("dragonfly"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-dragonfly"),
         },
     ),
     (
         "x86_64-unknown-freebsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("freebsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-freebsd"),
         },
     ),
     (
         "x86_64-unknown-fuchsia",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("fuchsia"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-fuchsia"),
         },
     ),
     (
         "x86_64-unknown-haiku",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("haiku"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-haiku"),
         },
     ),
     (
         "x86_64-unknown-hermit",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("hermit"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-hermit"),
         },
     ),
     (
         "x86_64-unknown-hurd-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("hurd"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-hurd-gnu"),
         },
     ),
     (
         "x86_64-unknown-illumos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("illumos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-solaris"),
         },
     ),
     (
         "x86_64-unknown-l4re-uclibc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("l4re"),
             env: Cow::Borrowed("uclibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-l4re-uclibc"),
         },
     ),
     (
         "x86_64-unknown-linux-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-gnu"),
         },
     ),
     (
         "x86_64-unknown-linux-gnux32",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("x32"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-gnux32"),
         },
     ),
     (
         "x86_64-unknown-linux-musl",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("musl"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-musl"),
         },
     ),
     (
         "x86_64-unknown-linux-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-none"),
         },
     ),
     (
         "x86_64-unknown-linux-ohos",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("linux"),
             env: Cow::Borrowed("ohos"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-ohos"),
         },
     ),
     (
         "x86_64-unknown-netbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("netbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-netbsd"),
         },
     ),
     (
         "x86_64-unknown-none",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-none-elf"),
         },
     ),
     (
         "x86_64-unknown-none-linuxkernel",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-none-elf"),
         },
     ),
     (
         "x86_64-unknown-openbsd",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("openbsd"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-openbsd"),
         },
     ),
     (
         "x86_64-unknown-redox",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("redox"),
             env: Cow::Borrowed("relibc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-redox"),
         },
     ),
     (
         "x86_64-unknown-trusty",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("trusty"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-unknown-musl"),
         },
     ),
     (
         "x86_64-unknown-uefi",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("unknown"),
             os: Cow::Borrowed("uefi"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-windows"),
         },
     ),
     (
         "x86_64-uwp-windows-gnu",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-windows-gnu"),
         },
     ),
     (
         "x86_64-uwp-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("uwp"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed("uwp"),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-pc-windows-msvc"),
         },
     ),
     (
         "x86_64-win7-windows-msvc",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("win7"),
             os: Cow::Borrowed("windows"),
             env: Cow::Borrowed("msvc"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-win7-windows-msvc"),
         },
     ),
     (
         "x86_64-wrs-vxworks",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("wrs"),
             os: Cow::Borrowed("vxworks"),
             env: Cow::Borrowed("gnu"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64-unknown-linux-gnu"),
         },
     ),
     (
         "x86_64h-apple-darwin",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("x86_64h"),
             arch: Cow::Borrowed("x86_64"),
             vendor: Cow::Borrowed("apple"),
             os: Cow::Borrowed("macos"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("x86_64h-apple-macosx"),
         },
     ),
     (
         "xtensa-esp32-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
     (
         "xtensa-esp32-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
     (
         "xtensa-esp32s2-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
     (
         "xtensa-esp32s2-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
     (
         "xtensa-esp32s3-espidf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("espidf"),
             env: Cow::Borrowed("newlib"),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
     (
         "xtensa-esp32s3-none-elf",
-        Target {
+        TargetInfo {
             full_arch: Cow::Borrowed("xtensa"),
             arch: Cow::Borrowed("xtensa"),
             vendor: Cow::Borrowed("espressif"),
             os: Cow::Borrowed("none"),
             env: Cow::Borrowed(""),
             abi: Cow::Borrowed(""),
+            unversioned_llvm_target: Cow::Borrowed("xtensa-none-elf"),
         },
     ),
 ];
diff --git a/src/target/llvm.rs b/src/target/llvm.rs
new file mode 100644
index 0000000..ab1d1ee
--- /dev/null
+++ b/src/target/llvm.rs
@@ -0,0 +1,89 @@
+use std::borrow::Cow;
+
+use super::TargetInfo;
+
+impl TargetInfo {
+    /// The versioned LLVM/Clang target triple.
+    pub(crate) fn versioned_llvm_target(&self, version: Option<&str>) -> Cow<'_, str> {
+        if let Some(version) = version {
+            // Only support versioned Apple targets for now.
+            assert_eq!(self.vendor, "apple");
+
+            let mut components = self.unversioned_llvm_target.split("-");
+            let arch = components.next().expect("llvm_target should have arch");
+            let vendor = components.next().expect("llvm_target should have vendor");
+            let os = components.next().expect("LLVM target should have os");
+            let environment = components.next();
+            assert_eq!(components.next(), None, "too many LLVM target components");
+
+            Cow::Owned(if let Some(env) = environment {
+                format!("{arch}-{vendor}-{os}{version}-{env}")
+            } else {
+                format!("{arch}-{vendor}-{os}{version}")
+            })
+        } else {
+            Cow::Borrowed(&self.unversioned_llvm_target)
+        }
+    }
+}
+
+/// Rust and Clang don't really agree on naming, so do a best-effort
+/// conversion to support out-of-tree / custom target-spec targets.
+pub(crate) fn guess_llvm_target_triple(
+    full_arch: &str,
+    vendor: &str,
+    os: &str,
+    env: &str,
+    abi: &str,
+) -> String {
+    let arch = match full_arch {
+        riscv32 if riscv32.starts_with("riscv32") => "riscv32",
+        riscv64 if riscv64.starts_with("riscv64") => "riscv64",
+        arch => arch,
+    };
+    let os = match os {
+        "darwin" => "macosx",
+        "visionos" => "xros",
+        "uefi" => "windows",
+        os => os,
+    };
+    let env = match env {
+        "newlib" | "nto70" | "nto71" | "ohos" | "p1" | "p2" | "relibc" | "sgx" | "uclibc" => "",
+        env => env,
+    };
+    let abi = match abi {
+        "sim" => "simulator",
+        "llvm" | "softfloat" | "uwp" | "vec-extabi" => "",
+        "ilp32" => "_ilp32",
+        abi => abi,
+    };
+    match (env, abi) {
+        ("", "") => format!("{arch}-{vendor}-{os}"),
+        (env, abi) => format!("{arch}-{vendor}-{os}-{env}{abi}"),
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_basic_llvm_triple_guessing() {
+        assert_eq!(
+            guess_llvm_target_triple("aarch64", "unknown", "linux", "", ""),
+            "aarch64-unknown-linux"
+        );
+        assert_eq!(
+            guess_llvm_target_triple("x86_64", "unknown", "linux", "gnu", ""),
+            "x86_64-unknown-linux-gnu"
+        );
+        assert_eq!(
+            guess_llvm_target_triple("x86_64", "unknown", "linux", "gnu", "eabi"),
+            "x86_64-unknown-linux-gnueabi"
+        );
+        assert_eq!(
+            guess_llvm_target_triple("x86_64", "apple", "darwin", "", ""),
+            "x86_64-apple-macosx"
+        );
+    }
+}
diff --git a/src/windows/find_tools.rs b/src/windows/find_tools.rs
index 48e78a7..389ba76 100644
--- a/src/windows/find_tools.rs
+++ b/src/windows/find_tools.rs
@@ -24,7 +24,7 @@ use std::{
 };
 
 use crate::ToolFamily;
-use crate::{target::Target, Tool};
+use crate::{target::TargetInfo, Tool};
 
 const MSVC_FAMILY: ToolFamily = ToolFamily::Msvc { clang_cl: false };
 
@@ -111,7 +111,7 @@ pub fn find_tool(target: &str, tool: &str) -> Option<Tool> {
 }
 
 pub(crate) fn find_tool_inner(
-    target: &Target,
+    target: &TargetInfo,
     tool: &str,
     env_getter: &dyn EnvGetter,
 ) -> Option<Tool> {


Test patch:
diff --git a/tests/test.rs b/tests/test.rs
index 02cda7c..939e56e 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -619,8 +619,7 @@ fn clang_apple_mac_catalyst() {
         .compile("foo");
     let execution = test.cmd(0);
 
-    // TODO: Add version to target here
-    execution.must_have("--target=arm64-apple-ios-macabi");
+    execution.must_have("--target=arm64-apple-ios15.0-macabi");
     execution.must_have_in_order("-isysroot", sdkroot);
     execution.must_have_in_order(
         "-isystem",