Auto merge of #86922 - joshtriplett:target-abi, r=oli-obk
target abi Implement cfg(target_abi) (RFC 2992) Add an `abi` field to `TargetOptions`, defaulting to "". Support using `cfg(target_abi = "...")` for conditional compilation on that field. Gated by `feature(cfg_target_abi)`. Add a test for `target_abi`, and a test for the feature gate. Add `target_abi` to tidy as a platform-specific cfg. Update targets to use `target_abi` All eabi targets have `target_abi = "eabi".` All eabihf targets have `target_abi = "eabihf"`. `armv6_unknown_freebsd` and `armv7_unknown_freebsd` have `target_abi = "eabihf"`. All abi64 targets have `target_abi = "abi64"`. All ilp32 targets have `target_abi = "ilp32"`. All softfloat targets have `target_abi = "softfloat"`. All *-uwp-windows-* targets have `target_abi = "uwp"`. All spe targets have `target_abi = "spe"`. All macabi targets have `target_abi = "macabi"`. aarch64-apple-ios-sim has `target_abi = "sim"`. `x86_64-fortanix-unknown-sgx` has `target_abi = "fortanix"`. `x86_64-unknown-linux-gnux32` has `target_abi = "x32"`. Add FIXME entries for targets for which existing values need to change once `cfg_target_abi` becomes stable. (All of them are tier 3 targets.) Add a test for `target_abi` in `--print cfg`.
This commit is contained in:
commit
ca99e3eb3a
@ -684,6 +684,9 @@ declare_features! (
|
||||
/// Allows qualified paths in struct expressions, struct patterns and tuple struct patterns.
|
||||
(active, more_qualified_paths, "1.54.0", Some(86935), None),
|
||||
|
||||
/// Allows `cfg(target_abi = "...")`.
|
||||
(active, cfg_target_abi, "1.55.0", Some(80970), None),
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// feature-group-end: actual feature gates
|
||||
// -------------------------------------------------------------------------
|
||||
|
@ -23,6 +23,7 @@ pub type GatedCfg = (Symbol, Symbol, GateFn);
|
||||
/// `cfg(...)`'s that are feature gated.
|
||||
const GATED_CFGS: &[GatedCfg] = &[
|
||||
// (name in cfg, feature, function to check if the feature is enabled)
|
||||
(sym::target_abi, sym::cfg_target_abi, cfg_fn!(cfg_target_abi)),
|
||||
(sym::target_thread_local, sym::cfg_target_thread_local, cfg_fn!(cfg_target_thread_local)),
|
||||
(sym::target_has_atomic, sym::cfg_target_has_atomic, cfg_fn!(cfg_target_has_atomic)),
|
||||
(sym::target_has_atomic_load_store, sym::cfg_target_has_atomic, cfg_fn!(cfg_target_has_atomic)),
|
||||
|
@ -805,6 +805,7 @@ fn default_configuration(sess: &Session) -> CrateConfig {
|
||||
let wordsz = sess.target.pointer_width.to_string();
|
||||
let os = &sess.target.os;
|
||||
let env = &sess.target.env;
|
||||
let abi = &sess.target.abi;
|
||||
let vendor = &sess.target.vendor;
|
||||
let min_atomic_width = sess.target.min_atomic_width();
|
||||
let max_atomic_width = sess.target.max_atomic_width();
|
||||
@ -814,7 +815,7 @@ fn default_configuration(sess: &Session) -> CrateConfig {
|
||||
});
|
||||
|
||||
let mut ret = FxHashSet::default();
|
||||
ret.reserve(6); // the minimum number of insertions
|
||||
ret.reserve(7); // the minimum number of insertions
|
||||
// Target bindings.
|
||||
ret.insert((sym::target_os, Some(Symbol::intern(os))));
|
||||
for fam in &sess.target.families {
|
||||
@ -829,6 +830,7 @@ fn default_configuration(sess: &Session) -> CrateConfig {
|
||||
ret.insert((sym::target_endian, Some(Symbol::intern(end.as_str()))));
|
||||
ret.insert((sym::target_pointer_width, Some(Symbol::intern(&wordsz))));
|
||||
ret.insert((sym::target_env, Some(Symbol::intern(env))));
|
||||
ret.insert((sym::target_abi, Some(Symbol::intern(abi))));
|
||||
ret.insert((sym::target_vendor, Some(Symbol::intern(vendor))));
|
||||
if sess.target.has_elf_tls {
|
||||
ret.insert((sym::target_thread_local, None));
|
||||
|
@ -354,6 +354,7 @@ symbols! {
|
||||
cfg_eval,
|
||||
cfg_panic,
|
||||
cfg_sanitize,
|
||||
cfg_target_abi,
|
||||
cfg_target_feature,
|
||||
cfg_target_has_atomic,
|
||||
cfg_target_thread_local,
|
||||
@ -1203,6 +1204,7 @@ symbols! {
|
||||
sync,
|
||||
sync_trait,
|
||||
t32,
|
||||
target_abi,
|
||||
target_arch,
|
||||
target_endian,
|
||||
target_env,
|
||||
|
@ -10,6 +10,11 @@ pub fn target() -> Target {
|
||||
pointer_width: 32,
|
||||
data_layout: "E-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
|
||||
arch: "aarch64".to_string(),
|
||||
options: TargetOptions { mcount: "\u{1}_mcount".to_string(), endian: Endian::Big, ..base },
|
||||
options: TargetOptions {
|
||||
abi: "ilp32".to_string(),
|
||||
mcount: "\u{1}_mcount".to_string(),
|
||||
endian: Endian::Big,
|
||||
..base
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
|
||||
arch: "aarch64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "ilp32".to_string(),
|
||||
max_atomic_width: Some(128),
|
||||
mcount: "\u{1}_mcount".to_string(),
|
||||
..super::linux_gnu_base::opts()
|
||||
|
@ -10,6 +10,7 @@ use super::{LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, Target, TargetOp
|
||||
|
||||
pub fn target() -> Target {
|
||||
let opts = TargetOptions {
|
||||
abi: "softfloat".to_string(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
features: "+strict-align,-neon,-fp-armv8".to_string(),
|
||||
|
@ -14,6 +14,15 @@ pub enum Arch {
|
||||
Arm64_sim,
|
||||
}
|
||||
|
||||
fn target_abi(arch: Arch) -> String {
|
||||
match arch {
|
||||
Armv7 | Armv7s | Arm64 | I386 | X86_64 => "",
|
||||
X86_64_macabi | Arm64_macabi => "macabi",
|
||||
Arm64_sim => "sim",
|
||||
}
|
||||
.to_string()
|
||||
}
|
||||
|
||||
fn target_cpu(arch: Arch) -> String {
|
||||
match arch {
|
||||
Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
|
||||
@ -39,6 +48,7 @@ fn link_env_remove(arch: Arch) -> Vec<String> {
|
||||
|
||||
pub fn opts(os: &str, arch: Arch) -> TargetOptions {
|
||||
TargetOptions {
|
||||
abi: target_abi(arch),
|
||||
cpu: target_cpu(arch),
|
||||
dynamic_linking: false,
|
||||
executables: true,
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
// https://developer.android.com/ndk/guides/abis.html#armeabi
|
||||
features: "+strict-align,+v5te".to_string(),
|
||||
max_atomic_width: Some(32),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+strict-align,+v6".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}__gnu_mcount_nc".to_string(),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
features: "+strict-align,+v6,+vfp2,-d32".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}__gnu_mcount_nc".to_string(),
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
// Most of these settings are copied from the arm_unknown_linux_gnueabi
|
||||
// target.
|
||||
features: "+strict-align,+v6".to_string(),
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// Most of these settings are copied from the arm_unknown_linux_gnueabihf
|
||||
// target.
|
||||
features: "+strict-align,+v6,+vfp2,-d32".to_string(),
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
endian: Endian::Big,
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
executables: true,
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
endian: Endian::Big,
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
executables: true,
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+soft-float,+strict-align".to_string(),
|
||||
// Atomic operations provided by compiler-builtins
|
||||
max_atomic_width: Some(32),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+soft-float,+strict-align".to_string(),
|
||||
// Atomic operations provided by compiler-builtins
|
||||
max_atomic_width: Some(32),
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+soft-float,+strict-align".to_string(),
|
||||
// Atomic operations provided by compiler-builtins
|
||||
max_atomic_width: Some(32),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+soft-float,+strict-align".to_string(),
|
||||
// Atomic operations provided by compiler-builtins
|
||||
max_atomic_width: Some(32),
|
||||
|
@ -7,6 +7,8 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// FIXME: change env to "gnu" when cfg_target_abi becomes stable
|
||||
env: "gnueabihf".to_string(),
|
||||
features: "+v6,+vfp2,-d32".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -7,6 +7,8 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// FIXME: remove env when cfg_target_abi becomes stable
|
||||
env: "eabihf".to_string(),
|
||||
features: "+v6,+vfp2,-d32".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -17,6 +17,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+v7,+thumb-mode,+thumb2,+vfp3,-d32,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
..base
|
||||
|
@ -7,6 +7,8 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// FIXME: change env to "gnu" when cfg_target_abi becomes stable
|
||||
env: "gnueabihf".to_string(),
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+v7,+thumb2,+soft-float,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}__gnu_mcount_nc".to_string(),
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// Info about features at https://wiki.debian.org/ArmHardFloatPort
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -16,6 +16,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+v7,+thumb2,+soft-float,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}mcount".to_string(),
|
||||
|
@ -15,6 +15,7 @@ pub fn target() -> Target {
|
||||
// Most of these settings are copied from the armv7_unknown_linux_gnueabihf
|
||||
// target.
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}mcount".to_string(),
|
||||
|
@ -7,6 +7,8 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// FIXME: remove env when cfg_target_abi becomes stable
|
||||
env: "eabihf".to_string(),
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// Info about features at https://wiki.debian.org/ArmHardFloatPort
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -18,6 +18,7 @@ use super::{LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, Target, TargetOp
|
||||
|
||||
pub fn target() -> Target {
|
||||
let opts = TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
features: "+v7,+thumb2,+soft-float,-neon,+strict-align".to_string(),
|
||||
|
@ -9,6 +9,7 @@ use super::{LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, Target, TargetOp
|
||||
|
||||
pub fn target() -> Target {
|
||||
let opts = TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
features: "+v7,+vfp3,-d32,+thumb2,-neon,+strict-align".to_string(),
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
executables: true,
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
executables: true,
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
|
@ -8,6 +8,7 @@ pub fn target() -> Target {
|
||||
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "abi64".to_string(),
|
||||
endian: Endian::Big,
|
||||
// NOTE(mips64r2) matches C toolchain
|
||||
cpu: "mips64r2".to_string(),
|
||||
|
@ -12,6 +12,11 @@ pub fn target() -> Target {
|
||||
pointer_width: 64,
|
||||
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
||||
options: TargetOptions {
|
||||
abi: "abi64".to_string(),
|
||||
endian: Endian::Big,
|
||||
mcount: "_mcount".to_string(),
|
||||
..base
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "abi64".to_string(),
|
||||
// NOTE(mips64r2) matches C toolchain
|
||||
cpu: "mips64r2".to_string(),
|
||||
features: "+mips64r2".to_string(),
|
||||
|
@ -11,6 +11,6 @@ pub fn target() -> Target {
|
||||
pointer_width: 64,
|
||||
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions { mcount: "_mcount".to_string(), ..base },
|
||||
options: TargetOptions { abi: "abi64".to_string(), mcount: "_mcount".to_string(), ..base },
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ pub fn target() -> Target {
|
||||
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "abi64".to_string(),
|
||||
endian: Endian::Big,
|
||||
// NOTE(mips64r6) matches C toolchain
|
||||
cpu: "mips64r6".to_string(),
|
||||
|
@ -7,6 +7,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "abi64".to_string(),
|
||||
// NOTE(mips64r6) matches C toolchain
|
||||
cpu: "mips64r6".to_string(),
|
||||
features: "+mips64r6".to_string(),
|
||||
|
@ -1025,6 +1025,9 @@ pub struct TargetOptions {
|
||||
pub os: String,
|
||||
/// Environment name to use for conditional compilation (`target_env`). Defaults to "".
|
||||
pub env: String,
|
||||
/// ABI name to distinguish multiple ABIs on the same OS and architecture. For instance, `"eabi"`
|
||||
/// or `"eabihf"`. Defaults to "".
|
||||
pub abi: String,
|
||||
/// Vendor name to use for conditional compilation (`target_vendor`). Defaults to "unknown".
|
||||
pub vendor: String,
|
||||
/// Default linker flavor used if `-C linker-flavor` or `-C linker` are not passed
|
||||
@ -1342,6 +1345,7 @@ impl Default for TargetOptions {
|
||||
c_int_width: "32".to_string(),
|
||||
os: "none".to_string(),
|
||||
env: String::new(),
|
||||
abi: String::new(),
|
||||
vendor: "unknown".to_string(),
|
||||
linker_flavor: LinkerFlavor::Gcc,
|
||||
linker: option_env!("CFG_DEFAULT_LINKER").map(|s| s.to_string()),
|
||||
@ -1919,6 +1923,7 @@ impl Target {
|
||||
key!(c_int_width = "target-c-int-width");
|
||||
key!(os);
|
||||
key!(env);
|
||||
key!(abi);
|
||||
key!(vendor);
|
||||
key!(linker_flavor, LinkerFlavor)?;
|
||||
key!(linker, optional);
|
||||
@ -2152,6 +2157,7 @@ impl ToJson for Target {
|
||||
target_option_val!(c_int_width, "target-c-int-width");
|
||||
target_option_val!(os);
|
||||
target_option_val!(env);
|
||||
target_option_val!(abi);
|
||||
target_option_val!(vendor);
|
||||
target_option_val!(linker_flavor);
|
||||
target_option_val!(linker);
|
||||
|
@ -11,6 +11,11 @@ pub fn target() -> Target {
|
||||
pointer_width: 32,
|
||||
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
|
||||
arch: "powerpc".to_string(),
|
||||
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
||||
options: TargetOptions {
|
||||
abi: "spe".to_string(),
|
||||
endian: Endian::Big,
|
||||
mcount: "_mcount".to_string(),
|
||||
..base
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ pub fn target() -> Target {
|
||||
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
|
||||
arch: "powerpc".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "spe".to_string(),
|
||||
endian: Endian::Big,
|
||||
// feature msync would disable instruction 'fsync' which is not supported by fsl_p1p2
|
||||
features: "+secure-plt,+msync".to_string(),
|
||||
|
@ -26,6 +26,7 @@ pub fn target() -> Target {
|
||||
*/
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
linker_flavor: LinkerFlavor::Ld,
|
||||
linker: Some("arm-none-eabi-ld".to_string()),
|
||||
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
// The ARMv6-M architecture doesn't support unaligned loads/stores so we disable them
|
||||
// with +strict-align.
|
||||
features: "+strict-align".to_string(),
|
||||
|
@ -18,6 +18,10 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions { max_atomic_width: Some(32), ..super::thumb_base::opts() },
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
max_atomic_width: Some(32),
|
||||
..super::thumb_base::opts()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// `+vfp4` is the lowest common denominator between the Cortex-M4 (vfp4-16) and the
|
||||
// Cortex-M7 (vfp5)
|
||||
// `-d32` both the Cortex-M4 and the Cortex-M7 only have 16 double-precision registers
|
||||
|
@ -9,6 +9,10 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions { max_atomic_width: Some(32), ..super::thumb_base::opts() },
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
max_atomic_width: Some(32),
|
||||
..super::thumb_base::opts()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
..base
|
||||
|
@ -13,6 +13,7 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// Info about features at https://wiki.debian.org/ArmHardFloatPort
|
||||
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
|
@ -19,6 +19,7 @@ pub fn target() -> Target {
|
||||
// Most of these settings are copied from the thumbv7neon_unknown_linux_gnueabihf
|
||||
// target.
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".to_string(),
|
||||
max_atomic_width: Some(64),
|
||||
mcount: "\u{1}mcount".to_string(),
|
||||
|
@ -10,6 +10,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
// ARMv8-M baseline doesn't support unaligned loads/stores so we disable them
|
||||
// with +strict-align.
|
||||
features: "+strict-align".to_string(),
|
||||
|
@ -10,6 +10,10 @@ pub fn target() -> Target {
|
||||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions { max_atomic_width: Some(32), ..super::thumb_base::opts() },
|
||||
options: TargetOptions {
|
||||
abi: "eabi".to_string(),
|
||||
max_atomic_width: Some(32),
|
||||
..super::thumb_base::opts()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
||||
arch: "arm".to_string(),
|
||||
|
||||
options: TargetOptions {
|
||||
abi: "eabihf".to_string(),
|
||||
// If the Floating Point extension is implemented in the Cortex-M33
|
||||
// processor, the Cortex-M33 Technical Reference Manual states that
|
||||
// the FPU uses the FPv5 architecture, single-precision instructions
|
||||
|
@ -25,6 +25,7 @@ pub fn opts() -> TargetOptions {
|
||||
late_link_args.insert(LinkerFlavor::Lld(LldFlavor::Ld), mingw_libs);
|
||||
|
||||
TargetOptions {
|
||||
abi: "uwp".to_string(),
|
||||
vendor: "uwp".to_string(),
|
||||
executables: false,
|
||||
limit_rdylib_exports: false,
|
||||
|
@ -3,6 +3,7 @@ use crate::spec::{LinkerFlavor, LldFlavor, TargetOptions};
|
||||
pub fn opts() -> TargetOptions {
|
||||
let mut opts = super::windows_msvc_base::opts();
|
||||
|
||||
opts.abi = "uwp".to_string();
|
||||
opts.vendor = "uwp".to_string();
|
||||
let pre_link_args_msvc = vec!["/APPCONTAINER".to_string(), "mincore.lib".to_string()];
|
||||
opts.pre_link_args.entry(LinkerFlavor::Msvc).or_default().extend(pre_link_args_msvc.clone());
|
||||
|
@ -55,6 +55,7 @@ pub fn target() -> Target {
|
||||
os: "unknown".into(),
|
||||
env: "sgx".into(),
|
||||
vendor: "fortanix".into(),
|
||||
abi: "fortanix".into(),
|
||||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
|
||||
executables: true,
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
|
@ -3,6 +3,7 @@ use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||
pub fn target() -> Target {
|
||||
let mut base = super::linux_gnu_base::opts();
|
||||
base.cpu = "x86-64".to_string();
|
||||
base.abi = "x32".to_string();
|
||||
base.max_atomic_width = Some(64);
|
||||
base.pre_link_args.entry(LinkerFlavor::Gcc).or_default().push("-mx32".to_string());
|
||||
// don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
|
||||
|
@ -6,6 +6,8 @@ all: default
|
||||
$(RUSTC) --target i686-pc-windows-msvc --print cfg | $(CGREP) msvc
|
||||
$(RUSTC) --target i686-apple-darwin --print cfg | $(CGREP) macos
|
||||
$(RUSTC) --target i686-unknown-linux-gnu --print cfg | $(CGREP) gnu
|
||||
$(RUSTC) --target arm-unknown-linux-gnueabihf --print cfg | $(CGREP) target_abi=
|
||||
$(RUSTC) --target arm-unknown-linux-gnueabihf --print cfg | $(CGREP) eabihf
|
||||
|
||||
ifdef IS_WINDOWS
|
||||
default:
|
||||
|
10
src/test/ui/cfg/cfg-target-abi.rs
Normal file
10
src/test/ui/cfg/cfg-target-abi.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// run-pass
|
||||
#![feature(cfg_target_abi)]
|
||||
|
||||
#[cfg(target_abi = "eabihf")]
|
||||
pub fn main() {
|
||||
}
|
||||
|
||||
#[cfg(not(target_abi = "eabihf"))]
|
||||
pub fn main() {
|
||||
}
|
11
src/test/ui/feature-gates/feature-gate-cfg-target-abi.rs
Normal file
11
src/test/ui/feature-gates/feature-gate-cfg-target-abi.rs
Normal file
@ -0,0 +1,11 @@
|
||||
#[cfg(target_abi = "x")] //~ ERROR `cfg(target_abi)` is experimental
|
||||
#[cfg_attr(target_abi = "x", x)] //~ ERROR `cfg(target_abi)` is experimental
|
||||
struct Foo(u64, u64);
|
||||
|
||||
#[cfg(not(any(all(target_abi = "x"))))] //~ ERROR `cfg(target_abi)` is experimental
|
||||
fn foo() {}
|
||||
|
||||
fn main() {
|
||||
cfg!(target_abi = "x");
|
||||
//~^ ERROR `cfg(target_abi)` is experimental and subject to change
|
||||
}
|
39
src/test/ui/feature-gates/feature-gate-cfg-target-abi.stderr
Normal file
39
src/test/ui/feature-gates/feature-gate-cfg-target-abi.stderr
Normal file
@ -0,0 +1,39 @@
|
||||
error[E0658]: `cfg(target_abi)` is experimental and subject to change
|
||||
--> $DIR/feature-gate-cfg-target-abi.rs:2:12
|
||||
|
|
||||
LL | #[cfg_attr(target_abi = "x", x)]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #80970 <https://github.com/rust-lang/rust/issues/80970> for more information
|
||||
= help: add `#![feature(cfg_target_abi)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: `cfg(target_abi)` is experimental and subject to change
|
||||
--> $DIR/feature-gate-cfg-target-abi.rs:1:7
|
||||
|
|
||||
LL | #[cfg(target_abi = "x")]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #80970 <https://github.com/rust-lang/rust/issues/80970> for more information
|
||||
= help: add `#![feature(cfg_target_abi)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: `cfg(target_abi)` is experimental and subject to change
|
||||
--> $DIR/feature-gate-cfg-target-abi.rs:5:19
|
||||
|
|
||||
LL | #[cfg(not(any(all(target_abi = "x"))))]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #80970 <https://github.com/rust-lang/rust/issues/80970> for more information
|
||||
= help: add `#![feature(cfg_target_abi)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: `cfg(target_abi)` is experimental and subject to change
|
||||
--> $DIR/feature-gate-cfg-target-abi.rs:9:10
|
||||
|
|
||||
LL | cfg!(target_abi = "x");
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #80970 <https://github.com/rust-lang/rust/issues/80970> for more information
|
||||
= help: add `#![feature(cfg_target_abi)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
@ -122,6 +122,7 @@ fn check_cfgs(
|
||||
|
||||
let contains_platform_specific_cfg = cfg.contains("target_os")
|
||||
|| cfg.contains("target_env")
|
||||
|| cfg.contains("target_abi")
|
||||
|| cfg.contains("target_vendor")
|
||||
|| cfg.contains("unix")
|
||||
|| cfg.contains("windows");
|
||||
|
Loading…
x
Reference in New Issue
Block a user