diff options
31 files changed, 117 insertions, 53 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 8b31d24b071..07edb70634e 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -674,10 +674,10 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( linker::disable_localization(&mut cmd); - for &(ref k, ref v) in &sess.target.link_env { + for &(ref k, ref v) in sess.target.link_env.iter() { cmd.env(k.as_ref(), v.as_ref()); } - for k in &sess.target.link_env_remove { + for k in sess.target.link_env_remove.iter() { cmd.env_remove(k.as_ref()); } diff --git a/compiler/rustc_serialize/src/json.rs b/compiler/rustc_serialize/src/json.rs index 9847fde3c49..c915dd5bbf6 100644 --- a/compiler/rustc_serialize/src/json.rs +++ b/compiler/rustc_serialize/src/json.rs @@ -2247,6 +2247,15 @@ impl<A: ToJson> ToJson for Vec<A> { } } +impl<'a, A: ToJson> ToJson for Cow<'a, [A]> +where + [A]: ToOwned, +{ + fn to_json(&self) -> Json { + Json::Array(self.iter().map(|elt| elt.to_json()).collect()) + } +} + impl<T: ToString, A: ToJson> ToJson for BTreeMap<T, A> { fn to_json(&self) -> Json { let mut d = BTreeMap::new(); diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index 856436e44db..408fd4ed2e6 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -956,7 +956,7 @@ fn default_configuration(sess: &Session) -> CrateConfig { 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 { + for fam in sess.target.families.iter() { ret.insert((sym::target_family, Some(Symbol::intern(fam)))); if fam == "windows" { ret.insert((sym::windows, None)); diff --git a/compiler/rustc_target/src/spec/aarch64_apple_darwin.rs b/compiler/rustc_target/src/spec/aarch64_apple_darwin.rs index ef9e6bbea4d..86f76fdb6a7 100644 --- a/compiler/rustc_target/src/spec/aarch64_apple_darwin.rs +++ b/compiler/rustc_target/src/spec/aarch64_apple_darwin.rs @@ -9,7 +9,7 @@ pub fn target() -> Target { base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::THREAD; base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-arch".into(), "arm64".into()]); - base.link_env_remove.extend(super::apple_base::macos_link_env_remove()); + base.link_env_remove.to_mut().extend(super::apple_base::macos_link_env_remove()); // Clang automatically chooses a more specific target based on // MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work diff --git a/compiler/rustc_target/src/spec/apple_base.rs b/compiler/rustc_target/src/spec/apple_base.rs index 748989b2a6f..f2cef7996ff 100644 --- a/compiler/rustc_target/src/spec/apple_base.rs +++ b/compiler/rustc_target/src/spec/apple_base.rs @@ -2,6 +2,8 @@ use std::{borrow::Cow, env}; use crate::spec::{FramePointer, LldFlavor, SplitDebuginfo, TargetOptions}; +use super::cvs; + pub fn opts(os: &'static str) -> TargetOptions { // ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6 // either the linker will complain if it is used or the binary will end up @@ -26,7 +28,7 @@ pub fn opts(os: &'static str) -> TargetOptions { dynamic_linking: true, linker_is_gnu: false, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], is_like_osx: true, dwarf_version: Some(2), frame_pointer: FramePointer::Always, @@ -51,7 +53,7 @@ pub fn opts(os: &'static str) -> TargetOptions { // this environment variable too in recent versions. // // For some more info see the commentary on #47086 - link_env: vec![("ZERO_AR_DATE".into(), "1".into())], + link_env: Cow::Borrowed(&[(Cow::Borrowed("ZERO_AR_DATE"), Cow::Borrowed("1"))]), ..Default::default() } diff --git a/compiler/rustc_target/src/spec/apple_sdk_base.rs b/compiler/rustc_target/src/spec/apple_sdk_base.rs index 3ab9dbe07a3..e2d08955c08 100644 --- a/compiler/rustc_target/src/spec/apple_sdk_base.rs +++ b/compiler/rustc_target/src/spec/apple_sdk_base.rs @@ -1,4 +1,4 @@ -use crate::spec::TargetOptions; +use crate::{spec::cvs, spec::TargetOptions}; use std::borrow::Cow; use Arch::*; @@ -36,12 +36,12 @@ fn target_cpu(arch: Arch) -> &'static str { } } -fn link_env_remove(arch: Arch) -> Vec<Cow<'static, str>> { +fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> { match arch { Armv7 | Armv7s | Arm64 | I386 | X86_64 | Arm64_sim => { - vec!["MACOSX_DEPLOYMENT_TARGET".into()] + cvs!["MACOSX_DEPLOYMENT_TARGET"] } - X86_64_macabi | Arm64_macabi => vec!["IPHONEOS_DEPLOYMENT_TARGET".into()], + X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"], } } diff --git a/compiler/rustc_target/src/spec/armv6k_nintendo_3ds.rs b/compiler/rustc_target/src/spec/armv6k_nintendo_3ds.rs index 93897dd4938..2e050b44156 100644 --- a/compiler/rustc_target/src/spec/armv6k_nintendo_3ds.rs +++ b/compiler/rustc_target/src/spec/armv6k_nintendo_3ds.rs @@ -1,5 +1,7 @@ use crate::spec::{LinkArgs, LinkerFlavor, RelocModel, Target, TargetOptions}; +use super::cvs; + /// A base target for Nintendo 3DS devices using the devkitARM toolchain. /// /// Requires the devkitARM toolchain for 3DS targets on the host system. @@ -30,7 +32,7 @@ pub fn target() -> Target { linker_flavor: LinkerFlavor::Gcc, cpu: "mpcore".into(), executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], linker: Some("arm-none-eabi-gcc".into()), relocation_model: RelocModel::Static, features: "+vfp2".into(), diff --git a/compiler/rustc_target/src/spec/dragonfly_base.rs b/compiler/rustc_target/src/spec/dragonfly_base.rs index 03e4b953184..43072d63894 100644 --- a/compiler/rustc_target/src/spec/dragonfly_base.rs +++ b/compiler/rustc_target/src/spec/dragonfly_base.rs @@ -1,11 +1,13 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "dragonfly".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, position_independent_executables: true, relro_level: RelroLevel::Full, diff --git a/compiler/rustc_target/src/spec/freebsd_base.rs b/compiler/rustc_target/src/spec/freebsd_base.rs index 0153b4dd80f..05d60574f32 100644 --- a/compiler/rustc_target/src/spec/freebsd_base.rs +++ b/compiler/rustc_target/src/spec/freebsd_base.rs @@ -1,11 +1,13 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "freebsd".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, position_independent_executables: true, relro_level: RelroLevel::Full, diff --git a/compiler/rustc_target/src/spec/fuchsia_base.rs b/compiler/rustc_target/src/spec/fuchsia_base.rs index e802cdcf489..2ee7047d7e0 100644 --- a/compiler/rustc_target/src/spec/fuchsia_base.rs +++ b/compiler/rustc_target/src/spec/fuchsia_base.rs @@ -1,5 +1,7 @@ use crate::spec::{crt_objects, LinkArgs, LinkOutputKind, LinkerFlavor, LldFlavor, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { let mut pre_link_args = LinkArgs::new(); pre_link_args.insert( @@ -25,7 +27,7 @@ pub fn opts() -> TargetOptions { linker: Some("rust-lld".into()), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], is_like_fuchsia: true, pre_link_args, pre_link_objects: crt_objects::new(&[ diff --git a/compiler/rustc_target/src/spec/haiku_base.rs b/compiler/rustc_target/src/spec/haiku_base.rs index 3585604a640..25549491f4b 100644 --- a/compiler/rustc_target/src/spec/haiku_base.rs +++ b/compiler/rustc_target/src/spec/haiku_base.rs @@ -1,11 +1,13 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "haiku".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], relro_level: RelroLevel::Full, ..Default::default() } diff --git a/compiler/rustc_target/src/spec/i686_apple_darwin.rs b/compiler/rustc_target/src/spec/i686_apple_darwin.rs index a083a83e377..ad716a6cd5a 100644 --- a/compiler/rustc_target/src/spec/i686_apple_darwin.rs +++ b/compiler/rustc_target/src/spec/i686_apple_darwin.rs @@ -5,7 +5,7 @@ pub fn target() -> Target { base.cpu = "yonah".into(); base.max_atomic_width = Some(64); base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".into()]); - base.link_env_remove.extend(super::apple_base::macos_link_env_remove()); + base.link_env_remove.to_mut().extend(super::apple_base::macos_link_env_remove()); // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved base.stack_probes = StackProbeType::Call; base.frame_pointer = FramePointer::Always; diff --git a/compiler/rustc_target/src/spec/illumos_base.rs b/compiler/rustc_target/src/spec/illumos_base.rs index 68917171105..1f6202dd7f5 100644 --- a/compiler/rustc_target/src/spec/illumos_base.rs +++ b/compiler/rustc_target/src/spec/illumos_base.rs @@ -1,6 +1,8 @@ use crate::spec::{FramePointer, LinkArgs, LinkerFlavor, TargetOptions}; use std::default::Default; +use super::cvs; + pub fn opts() -> TargetOptions { let mut late_link_args = LinkArgs::new(); late_link_args.insert( @@ -31,7 +33,7 @@ pub fn opts() -> TargetOptions { dynamic_linking: true, executables: true, has_rpath: true, - families: vec!["unix".into()], + families: cvs!["unix"], is_like_solaris: true, linker_is_gnu: false, limit_rdylib_exports: false, // Linker doesn't support this diff --git a/compiler/rustc_target/src/spec/l4re_base.rs b/compiler/rustc_target/src/spec/l4re_base.rs index dbc851cc1e1..e185de78bca 100644 --- a/compiler/rustc_target/src/spec/l4re_base.rs +++ b/compiler/rustc_target/src/spec/l4re_base.rs @@ -1,6 +1,8 @@ use crate::spec::{LinkerFlavor, PanicStrategy, TargetOptions}; use std::default::Default; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "l4re".into(), @@ -10,7 +12,7 @@ pub fn opts() -> TargetOptions { panic_strategy: PanicStrategy::Abort, linker: Some("l4-bender".into()), linker_is_gnu: false, - families: vec!["unix".into()], + families: cvs!["unix"], ..Default::default() } } diff --git a/compiler/rustc_target/src/spec/linux_base.rs b/compiler/rustc_target/src/spec/linux_base.rs index 135ca547d1d..84d8e19159a 100644 --- a/compiler/rustc_target/src/spec/linux_base.rs +++ b/compiler/rustc_target/src/spec/linux_base.rs @@ -1,11 +1,13 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "linux".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, position_independent_executables: true, relro_level: RelroLevel::Full, diff --git a/compiler/rustc_target/src/spec/mipsel_sony_psp.rs b/compiler/rustc_target/src/spec/mipsel_sony_psp.rs index 6857f7fd17d..dc8169b7118 100644 --- a/compiler/rustc_target/src/spec/mipsel_sony_psp.rs +++ b/compiler/rustc_target/src/spec/mipsel_sony_psp.rs @@ -1,6 +1,8 @@ use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor, RelocModel}; use crate::spec::{Target, TargetOptions}; +use super::cvs; + // The PSP has custom linker requirements. const LINKER_SCRIPT: &str = include_str!("./mipsel_sony_psp_linker_script.ld"); @@ -27,7 +29,7 @@ pub fn target() -> Target { features: "+single-float".into(), // PSP does not support trap-on-condition instructions. - llvm_args: vec!["-mno-check-zero-division".into()], + llvm_args: cvs!["-mno-check-zero-division"], pre_link_args, link_script: Some(LINKER_SCRIPT.into()), ..Default::default() diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 0c5bddad72a..6d23ddc0985 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -1027,6 +1027,25 @@ supported_targets! { ("mips64-openwrt-linux-musl", mips64_openwrt_linux_musl), } +/// Cow-Vec-Str: Cow<'static, [Cow<'static, str>]> +// FIXME(Urgau): Figure out why the obvious form `["".into()].into()` doesn't work. +macro_rules! cvs { + () => { + ::std::borrow::Cow::Borrowed(&[]) + }; + ($($x:expr),+ $(,)?) => { + { + ::std::borrow::Cow::Borrowed(&[ + $( + ::std::borrow::Cow::Borrowed($x), + )* + ]) + } + }; +} + +pub(crate) use cvs; + /// Warnings encountered when parsing the target `json`. /// /// Includes fields that weren't recognized and fields that don't have the expected type. @@ -1160,12 +1179,12 @@ pub struct TargetOptions { pub link_script: Option<Cow<'static, str>>, /// Environment variables to be set for the linker invocation. - pub link_env: Vec<(Cow<'static, str>, Cow<'static, str>)>, + pub link_env: Cow<'static, [(Cow<'static, str>, Cow<'static, str>)]>, /// Environment variables to be removed for the linker invocation. - pub link_env_remove: Vec<Cow<'static, str>>, + pub link_env_remove: Cow<'static, [Cow<'static, str>]>, /// Extra arguments to pass to the external assembler (when used) - pub asm_args: Vec<Cow<'static, str>>, + pub asm_args: Cow<'static, [Cow<'static, str>]>, /// Default CPU to pass to LLVM. Corresponds to `llc -mcpu=$cpu`. Defaults /// to "generic". @@ -1211,7 +1230,7 @@ pub struct TargetOptions { /// Common options are: "unix", "windows". Defaults to no families. /// /// See <https://doc.rust-lang.org/reference/conditional-compilation.html#target_family>. - pub families: Vec<Cow<'static, str>>, + pub families: Cow<'static, [Cow<'static, str>]>, /// Whether the target toolchain's ABI supports returning small structs as an integer. pub abi_return_struct_as_int: bool, /// Whether the target toolchain is like macOS's. Only useful for compiling against iOS/macOS, @@ -1371,7 +1390,7 @@ pub struct TargetOptions { /// If set, have the linker export exactly these symbols, instead of using /// the usual logic to figure this out from the crate itself. - pub override_export_symbols: Option<Vec<Cow<'static, str>>>, + pub override_export_symbols: Option<Cow<'static, [Cow<'static, str>]>>, /// Determines how or whether the MergeFunctions LLVM pass should run for /// this target. Either "disabled", "trampolines", or "aliases". @@ -1391,7 +1410,7 @@ pub struct TargetOptions { pub relax_elf_relocations: bool, /// Additional arguments to pass to LLVM, similar to the `-C llvm-args` codegen option. - pub llvm_args: Vec<Cow<'static, str>>, + pub llvm_args: Cow<'static, [Cow<'static, str>]>, /// Whether to use legacy .ctors initialization hooks rather than .init_array. Defaults /// to false (uses .init_array). @@ -1449,7 +1468,7 @@ impl Default for TargetOptions { pre_link_args: LinkArgs::new(), post_link_args: LinkArgs::new(), link_script: None, - asm_args: Vec::new(), + asm_args: Cow::Borrowed(&[]), cpu: "generic".into(), features: Cow::from(""), dynamic_linking: false, @@ -1466,7 +1485,7 @@ impl Default for TargetOptions { exe_suffix: Cow::from(""), staticlib_prefix: "lib".into(), staticlib_suffix: ".a".into(), - families: Vec::new(), + families: cvs![], abi_return_struct_as_int: false, is_like_osx: false, is_like_solaris: false, @@ -1492,8 +1511,8 @@ impl Default for TargetOptions { late_link_args: LinkArgs::new(), late_link_args_dynamic: LinkArgs::new(), late_link_args_static: LinkArgs::new(), - link_env: Vec::new(), - link_env_remove: Vec::new(), + link_env: Cow::Borrowed(&[]), + link_env_remove: Cow::Borrowed(&[]), archive_format: "gnu".into(), main_needs_argc_argv: true, allow_asm: true, @@ -1526,7 +1545,7 @@ impl Default for TargetOptions { mcount: "mcount".into(), llvm_abiname: "".into(), relax_elf_relocations: false, - llvm_args: vec![], + llvm_args: cvs![], use_ctors_section: false, eh_frame_header: true, has_thumb_interworking: false, @@ -1978,7 +1997,7 @@ impl Target { if p.len() == 2 { let k = p[0].to_string(); let v = p[1].to_string(); - base.$key_name.push((k.into(), v.into())); + base.$key_name.to_mut().push((k.into(), v.into())); } } } @@ -2004,7 +2023,7 @@ impl Target { .map(|a| a.as_string().unwrap().to_string().into()) .collect(); } else if let Some(v) = Json::as_string(&value) { - base.$key_name = vec![v.to_string().into()]; + base.$key_name = vec![v.to_string().into()].into(); } } } ); diff --git a/compiler/rustc_target/src/spec/msp430_none_elf.rs b/compiler/rustc_target/src/spec/msp430_none_elf.rs index 2dd23b7d3c3..f22c8672639 100644 --- a/compiler/rustc_target/src/spec/msp430_none_elf.rs +++ b/compiler/rustc_target/src/spec/msp430_none_elf.rs @@ -1,3 +1,4 @@ +use super::cvs; use crate::spec::{PanicStrategy, RelocModel, Target, TargetOptions}; pub fn target() -> Target { @@ -15,7 +16,7 @@ pub fn target() -> Target { // workaround this LLVM generates assembly files which then we feed // to gcc to get object files. For this reason we have a hard // dependency on this specific gcc. - asm_args: vec!["-mcpu=msp430".into()], + asm_args: cvs!["-mcpu=msp430"], linker: Some("msp430-elf-gcc".into()), linker_is_gnu: false, diff --git a/compiler/rustc_target/src/spec/netbsd_base.rs b/compiler/rustc_target/src/spec/netbsd_base.rs index c20eb163dda..a5fb58f5e7b 100644 --- a/compiler/rustc_target/src/spec/netbsd_base.rs +++ b/compiler/rustc_target/src/spec/netbsd_base.rs @@ -1,11 +1,13 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "netbsd".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], no_default_libraries: false, has_rpath: true, position_independent_executables: true, diff --git a/compiler/rustc_target/src/spec/openbsd_base.rs b/compiler/rustc_target/src/spec/openbsd_base.rs index a913be93861..7745d10e13e 100644 --- a/compiler/rustc_target/src/spec/openbsd_base.rs +++ b/compiler/rustc_target/src/spec/openbsd_base.rs @@ -1,11 +1,13 @@ use crate::spec::{FramePointer, RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "openbsd".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, abi_return_struct_as_int: true, position_independent_executables: true, diff --git a/compiler/rustc_target/src/spec/redox_base.rs b/compiler/rustc_target/src/spec/redox_base.rs index 51774059c10..667aa8e9c94 100644 --- a/compiler/rustc_target/src/spec/redox_base.rs +++ b/compiler/rustc_target/src/spec/redox_base.rs @@ -1,12 +1,14 @@ use crate::spec::{RelroLevel, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "redox".into(), env: "relibc".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, position_independent_executables: true, relro_level: RelroLevel::Full, diff --git a/compiler/rustc_target/src/spec/riscv32imc_esp_espidf.rs b/compiler/rustc_target/src/spec/riscv32imc_esp_espidf.rs index d9f40d51069..4c7401380fd 100644 --- a/compiler/rustc_target/src/spec/riscv32imc_esp_espidf.rs +++ b/compiler/rustc_target/src/spec/riscv32imc_esp_espidf.rs @@ -1,6 +1,8 @@ use crate::spec::{LinkerFlavor, PanicStrategy, RelocModel}; use crate::spec::{Target, TargetOptions}; +use super::cvs; + pub fn target() -> Target { Target { data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(), @@ -9,7 +11,7 @@ pub fn target() -> Target { arch: "riscv32".into(), options: TargetOptions { - families: vec!["unix".into()], + families: cvs!["unix"], os: "espidf".into(), env: "newlib".into(), vendor: "espressif".into(), diff --git a/compiler/rustc_target/src/spec/solaris_base.rs b/compiler/rustc_target/src/spec/solaris_base.rs index 2f47abd9c7a..8d8ad049b33 100644 --- a/compiler/rustc_target/src/spec/solaris_base.rs +++ b/compiler/rustc_target/src/spec/solaris_base.rs @@ -1,12 +1,14 @@ use crate::spec::TargetOptions; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "solaris".into(), dynamic_linking: true, executables: true, has_rpath: true, - families: vec!["unix".into()], + families: cvs!["unix"], is_like_solaris: true, linker_is_gnu: false, limit_rdylib_exports: false, // Linker doesn't support this diff --git a/compiler/rustc_target/src/spec/thumbv4t_none_eabi.rs b/compiler/rustc_target/src/spec/thumbv4t_none_eabi.rs index d05cb6582ba..457b78850ac 100644 --- a/compiler/rustc_target/src/spec/thumbv4t_none_eabi.rs +++ b/compiler/rustc_target/src/spec/thumbv4t_none_eabi.rs @@ -8,6 +8,7 @@ //! //! **Important:** This target profile **does not** specify a linker script. You just get the default link script when you build a binary for this target. The default link script is very likely wrong, so you should use `-Clink-arg=-Tmy_script.ld` to override that with a correct linker script. +use super::cvs; use crate::spec::{LinkerFlavor, Target, TargetOptions}; pub fn target() -> Target { @@ -34,11 +35,7 @@ pub fn target() -> Target { // * activate t32/a32 interworking // * use arch ARMv4T // * use little-endian - asm_args: vec![ - "-mthumb-interwork".into(), - "-march=armv4t".into(), - "-mlittle-endian".into(), - ], + asm_args: cvs!["-mthumb-interwork", "-march=armv4t", "-mlittle-endian",], // minimum extra features, these cannot be disabled via -C features: "+soft-float,+strict-align".into(), diff --git a/compiler/rustc_target/src/spec/vxworks_base.rs b/compiler/rustc_target/src/spec/vxworks_base.rs index 9808d60d891..f43cea131b7 100644 --- a/compiler/rustc_target/src/spec/vxworks_base.rs +++ b/compiler/rustc_target/src/spec/vxworks_base.rs @@ -1,5 +1,7 @@ use crate::spec::TargetOptions; +use super::cvs; + pub fn opts() -> TargetOptions { TargetOptions { os: "vxworks".into(), @@ -9,7 +11,7 @@ pub fn opts() -> TargetOptions { exe_suffix: ".vxe".into(), dynamic_linking: true, executables: true, - families: vec!["unix".into()], + families: cvs!["unix"], has_rpath: true, has_thread_local: true, crt_static_default: true, diff --git a/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs b/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs index 89f4e6d3588..b34cac41d78 100644 --- a/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs +++ b/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs @@ -1,4 +1,4 @@ -use super::wasm_base; +use super::{cvs, wasm_base}; use super::{LinkArgs, LinkerFlavor, PanicStrategy, Target, TargetOptions}; pub fn target() -> Target { @@ -37,7 +37,7 @@ pub fn target() -> Target { is_like_emscripten: true, panic_strategy: PanicStrategy::Unwind, post_link_args, - families: vec!["unix".into(), "wasm".into()], + families: cvs!["unix", "wasm"], ..options }; Target { diff --git a/compiler/rustc_target/src/spec/wasm_base.rs b/compiler/rustc_target/src/spec/wasm_base.rs index e02fb1f946f..d884dcf68bf 100644 --- a/compiler/rustc_target/src/spec/wasm_base.rs +++ b/compiler/rustc_target/src/spec/wasm_base.rs @@ -1,5 +1,5 @@ use super::crt_objects::CrtObjectsFallback; -use super::{LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, TargetOptions, TlsModel}; +use super::{cvs, LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, TargetOptions, TlsModel}; use std::collections::BTreeMap; pub fn options() -> TargetOptions { @@ -61,7 +61,7 @@ pub fn options() -> TargetOptions { TargetOptions { is_like_wasm: true, - families: vec!["wasm".into()], + families: cvs!["wasm"], // we allow dynamic linking, but only cdylibs. Basically we allow a // final library artifact that exports some symbols (a wasm module) but diff --git a/compiler/rustc_target/src/spec/windows_gnu_base.rs b/compiler/rustc_target/src/spec/windows_gnu_base.rs index d21d86caa73..1e5ced684bd 100644 --- a/compiler/rustc_target/src/spec/windows_gnu_base.rs +++ b/compiler/rustc_target/src/spec/windows_gnu_base.rs @@ -1,6 +1,8 @@ use crate::spec::crt_objects::{self, CrtObjectsFallback}; use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor, TargetOptions}; +use super::cvs; + pub fn opts() -> TargetOptions { let mut pre_link_args = LinkArgs::new(); pre_link_args.insert( @@ -71,7 +73,7 @@ pub fn opts() -> TargetOptions { dll_prefix: "".into(), dll_suffix: ".dll".into(), exe_suffix: ".exe".into(), - families: vec!["windows".into()], + families: cvs!["windows"], is_like_windows: true, allows_weak_linkage: false, pre_link_args, diff --git a/compiler/rustc_target/src/spec/windows_msvc_base.rs b/compiler/rustc_target/src/spec/windows_msvc_base.rs index a3bcaeeeb7a..bfe8edecac4 100644 --- a/compiler/rustc_target/src/spec/windows_msvc_base.rs +++ b/compiler/rustc_target/src/spec/windows_msvc_base.rs @@ -1,5 +1,7 @@ use crate::spec::TargetOptions; +use super::cvs; + pub fn opts() -> TargetOptions { let base = super::msvc_base::opts(); @@ -13,7 +15,7 @@ pub fn opts() -> TargetOptions { exe_suffix: ".exe".into(), staticlib_prefix: "".into(), staticlib_suffix: ".lib".into(), - families: vec!["windows".into()], + families: cvs!["windows"], crt_static_allows_dylibs: true, crt_static_respected: true, requires_uwtable: true, diff --git a/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs b/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs index b7b976e8d5d..51d14f0403a 100644 --- a/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs +++ b/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs @@ -8,7 +8,7 @@ pub fn target() -> Target { base.frame_pointer = FramePointer::Always; base.pre_link_args .insert(LinkerFlavor::Gcc, vec!["-m64".into(), "-arch".into(), "x86_64".into()]); - base.link_env_remove.extend(super::apple_base::macos_link_env_remove()); + base.link_env_remove.to_mut().extend(super::apple_base::macos_link_env_remove()); // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved base.stack_probes = StackProbeType::Call; base.supported_sanitizers = diff --git a/compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs b/compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs index d78d057dea0..33b5917b401 100644 --- a/compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs +++ b/compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs @@ -1,5 +1,7 @@ use std::{borrow::Cow, iter}; +use crate::spec::cvs; + use super::{LinkerFlavor, LldFlavor, Target, TargetOptions}; pub fn target() -> Target { @@ -62,7 +64,7 @@ pub fn target() -> Target { max_atomic_width: Some(64), cpu: "x86-64".into(), features: "+rdrnd,+rdseed,+lvi-cfi,+lvi-load-hardening".into(), - llvm_args: vec!["--x86-experimental-lvi-inline-asm-hardening".into()], + llvm_args: cvs!["--x86-experimental-lvi-inline-asm-hardening"], position_independent_executables: true, pre_link_args: iter::once(( LinkerFlavor::Lld(LldFlavor::Ld), |
