summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_target/src
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /compiler/rustc_target/src
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_target/src')
-rw-r--r--compiler/rustc_target/src/abi/call/mod.rs11
-rw-r--r--compiler/rustc_target/src/abi/call/x86_64.rs12
-rw-r--r--compiler/rustc_target/src/lib.rs1
-rw-r--r--compiler/rustc_target/src/spec/aarch64_apple_tvos.rs4
-rw-r--r--compiler/rustc_target/src/spec/aarch64_be_unknown_netbsd.rs17
-rw-r--r--compiler/rustc_target/src/spec/apple/tests.rs5
-rw-r--r--compiler/rustc_target/src/spec/apple_base.rs18
-rw-r--r--compiler/rustc_target/src/spec/armv7_sony_vita_newlibeabihf.rs15
-rw-r--r--compiler/rustc_target/src/spec/avr_gnu_base.rs337
-rw-r--r--compiler/rustc_target/src/spec/loongarch64_unknown_none.rs22
-rw-r--r--compiler/rustc_target/src/spec/loongarch64_unknown_none_softfloat.rs23
-rw-r--r--compiler/rustc_target/src/spec/mips64_unknown_linux_gnuabi64.rs2
-rw-r--r--compiler/rustc_target/src/spec/mips64el_unknown_linux_gnuabi64.rs2
-rw-r--r--compiler/rustc_target/src/spec/mod.rs273
-rw-r--r--compiler/rustc_target/src/spec/riscv32imac_esp_espidf.rs31
-rw-r--r--compiler/rustc_target/src/spec/riscv64gc_unknown_netbsd.rs19
-rw-r--r--compiler/rustc_target/src/spec/x86_64_apple_ios.rs2
-rw-r--r--compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs2
-rw-r--r--compiler/rustc_target/src/spec/x86_64_apple_tvos.rs9
-rw-r--r--compiler/rustc_target/src/spec/x86_64_apple_watchos_sim.rs2
-rw-r--r--compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_linux_android.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_pc_nto_qnx710.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_pc_solaris.rs3
-rw-r--r--compiler/rustc_target/src/spec/x86_64_pc_windows_gnu.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_pc_windows_gnullvm.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_pc_windows_msvc.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_sun_solaris.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_fuchsia.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_illumos.rs3
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_l4re_uclibc.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs2
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs2
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_none.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_redox.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_unknown_uefi.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_uwp_windows_gnu.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_uwp_windows_msvc.rs1
-rw-r--r--compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs1
46 files changed, 774 insertions, 65 deletions
diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs
index 1ae11f567..c4abf6f4b 100644
--- a/compiler/rustc_target/src/abi/call/mod.rs
+++ b/compiler/rustc_target/src/abi/call/mod.rs
@@ -2,7 +2,6 @@ use crate::abi::{self, Abi, Align, FieldsShape, Size};
use crate::abi::{HasDataLayout, TyAbiInterface, TyAndLayout};
use crate::spec::{self, HasTargetSpec};
use rustc_span::Symbol;
-use std::fmt;
use std::str::FromStr;
mod aarch64;
@@ -633,16 +632,6 @@ pub enum AdjustForForeignAbiError {
Unsupported { arch: Symbol, abi: spec::abi::Abi },
}
-impl fmt::Display for AdjustForForeignAbiError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match self {
- Self::Unsupported { arch, abi } => {
- write!(f, "target architecture {arch:?} does not support `extern {abi}` ABI")
- }
- }
- }
-}
-
impl<'a, Ty> FnAbi<'a, Ty> {
pub fn adjust_for_foreign_abi<C>(
&mut self,
diff --git a/compiler/rustc_target/src/abi/call/x86_64.rs b/compiler/rustc_target/src/abi/call/x86_64.rs
index 9427f27d1..b1aefaf05 100644
--- a/compiler/rustc_target/src/abi/call/x86_64.rs
+++ b/compiler/rustc_target/src/abi/call/x86_64.rs
@@ -1,5 +1,5 @@
// The classification code for the x86_64 ABI is taken from the clay language
-// https://github.com/jckarter/clay/blob/master/compiler/src/externals.cpp
+// https://github.com/jckarter/clay/blob/db0bd2702ab0b6e48965cd85f8859bbd5f60e48e/compiler/externals.cpp
use crate::abi::call::{ArgAbi, CastTarget, FnAbi, Reg, RegKind};
use crate::abi::{self, Abi, HasDataLayout, Size, TyAbiInterface, TyAndLayout};
@@ -153,9 +153,9 @@ fn reg_component(cls: &[Option<Class>], i: &mut usize, size: Size) -> Option<Reg
}
}
-fn cast_target(cls: &[Option<Class>], size: Size) -> CastTarget {
+fn cast_target(cls: &[Option<Class>], size: Size) -> Option<CastTarget> {
let mut i = 0;
- let lo = reg_component(cls, &mut i, size).unwrap();
+ let lo = reg_component(cls, &mut i, size)?;
let offset = Size::from_bytes(8) * (i as u64);
let mut target = CastTarget::from(lo);
if size > offset {
@@ -164,7 +164,7 @@ fn cast_target(cls: &[Option<Class>], size: Size) -> CastTarget {
}
}
assert_eq!(reg_component(cls, &mut i, Size::ZERO), None);
- target
+ Some(target)
}
const MAX_INT_REGS: usize = 6; // RDI, RSI, RDX, RCX, R8, R9
@@ -227,7 +227,9 @@ where
// split into sized chunks passed individually
if arg.layout.is_aggregate() {
let size = arg.layout.size;
- arg.cast_to(cast_target(cls, size))
+ if let Some(cast_target) = cast_target(cls, size) {
+ arg.cast_to(cast_target);
+ }
} else {
arg.extend_integer_width_to(32);
}
diff --git a/compiler/rustc_target/src/lib.rs b/compiler/rustc_target/src/lib.rs
index dc2cc23ff..a7b54766b 100644
--- a/compiler/rustc_target/src/lib.rs
+++ b/compiler/rustc_target/src/lib.rs
@@ -11,6 +11,7 @@
#![feature(assert_matches)]
#![feature(associated_type_bounds)]
#![feature(exhaustive_patterns)]
+#![feature(iter_intersperse)]
#![feature(min_specialization)]
#![feature(never_type)]
#![feature(rustc_attrs)]
diff --git a/compiler/rustc_target/src/spec/aarch64_apple_tvos.rs b/compiler/rustc_target/src/spec/aarch64_apple_tvos.rs
index bb7c39ff2..f7cdfa71c 100644
--- a/compiler/rustc_target/src/spec/aarch64_apple_tvos.rs
+++ b/compiler/rustc_target/src/spec/aarch64_apple_tvos.rs
@@ -1,10 +1,10 @@
-use super::apple_base::{opts, Arch};
+use super::apple_base::{opts, tvos_llvm_target, Arch};
use crate::spec::{FramePointer, Target, TargetOptions};
pub fn target() -> Target {
let arch = Arch::Arm64;
Target {
- llvm_target: "arm64-apple-tvos".into(),
+ llvm_target: tvos_llvm_target(arch).into(),
pointer_width: 64,
data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".into(),
arch: arch.target_arch(),
diff --git a/compiler/rustc_target/src/spec/aarch64_be_unknown_netbsd.rs b/compiler/rustc_target/src/spec/aarch64_be_unknown_netbsd.rs
new file mode 100644
index 000000000..98ae05974
--- /dev/null
+++ b/compiler/rustc_target/src/spec/aarch64_be_unknown_netbsd.rs
@@ -0,0 +1,17 @@
+use crate::abi::Endian;
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "aarch64_be-unknown-netbsd".into(),
+ pointer_width: 64,
+ data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
+ arch: "aarch64".into(),
+ options: TargetOptions {
+ mcount: "__mcount".into(),
+ max_atomic_width: Some(128),
+ endian: Endian::Big,
+ ..super::netbsd_base::opts()
+ },
+ }
+}
diff --git a/compiler/rustc_target/src/spec/apple/tests.rs b/compiler/rustc_target/src/spec/apple/tests.rs
index 3c90a5e7e..3b23ddadc 100644
--- a/compiler/rustc_target/src/spec/apple/tests.rs
+++ b/compiler/rustc_target/src/spec/apple/tests.rs
@@ -30,6 +30,9 @@ fn macos_link_environment_unmodified() {
for target in all_macos_targets {
// macOS targets should only remove information for cross-compiling, but never
// for the host.
- assert_eq!(target.link_env_remove, crate::spec::cvs!["IPHONEOS_DEPLOYMENT_TARGET"]);
+ assert_eq!(
+ target.link_env_remove,
+ crate::spec::cvs!["IPHONEOS_DEPLOYMENT_TARGET", "TVOS_DEPLOYMENT_TARGET"],
+ );
}
}
diff --git a/compiler/rustc_target/src/spec/apple_base.rs b/compiler/rustc_target/src/spec/apple_base.rs
index ff2246318..8a8d1ab95 100644
--- a/compiler/rustc_target/src/spec/apple_base.rs
+++ b/compiler/rustc_target/src/spec/apple_base.rs
@@ -240,7 +240,12 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]>
// Remove the `SDKROOT` environment variable if it's clearly set for the wrong platform, which
// may occur when we're linking a custom build script while targeting iOS for example.
if let Ok(sdkroot) = env::var("SDKROOT") {
- if sdkroot.contains("iPhoneOS.platform") || sdkroot.contains("iPhoneSimulator.platform")
+ if sdkroot.contains("iPhoneOS.platform")
+ || sdkroot.contains("iPhoneSimulator.platform")
+ || sdkroot.contains("AppleTVOS.platform")
+ || sdkroot.contains("AppleTVSimulator.platform")
+ || sdkroot.contains("WatchOS.platform")
+ || sdkroot.contains("WatchSimulator.platform")
{
env_remove.push("SDKROOT".into())
}
@@ -249,6 +254,7 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]>
// "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld",
// although this is apparently ignored when using the linker at "/usr/bin/ld".
env_remove.push("IPHONEOS_DEPLOYMENT_TARGET".into());
+ env_remove.push("TVOS_DEPLOYMENT_TARGET".into());
env_remove.into()
} else {
// Otherwise if cross-compiling for a different OS/SDK, remove any part
@@ -299,6 +305,16 @@ fn tvos_lld_platform_version() -> String {
format!("{major}.{minor}")
}
+pub fn tvos_llvm_target(arch: Arch) -> String {
+ let (major, minor) = tvos_deployment_target();
+ format!("{}-apple-tvos{}.{}.0", arch.target_name(), major, minor)
+}
+
+pub fn tvos_sim_llvm_target(arch: Arch) -> String {
+ let (major, minor) = tvos_deployment_target();
+ format!("{}-apple-tvos{}.{}.0-simulator", arch.target_name(), major, minor)
+}
+
fn watchos_deployment_target() -> (u32, u32) {
// If you are looking for the default deployment target, prefer `rustc --print deployment-target`.
from_set_deployment_target("WATCHOS_DEPLOYMENT_TARGET").unwrap_or((5, 0))
diff --git a/compiler/rustc_target/src/spec/armv7_sony_vita_newlibeabihf.rs b/compiler/rustc_target/src/spec/armv7_sony_vita_newlibeabihf.rs
index e2c0808f1..62c936036 100644
--- a/compiler/rustc_target/src/spec/armv7_sony_vita_newlibeabihf.rs
+++ b/compiler/rustc_target/src/spec/armv7_sony_vita_newlibeabihf.rs
@@ -1,15 +1,18 @@
use crate::abi::Endian;
-use crate::spec::{cvs, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetOptions};
+use crate::spec::{cvs, Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions};
/// A base target for PlayStation Vita devices using the VITASDK toolchain (using newlib).
///
/// Requires the VITASDK toolchain on the host system.
pub fn target() -> Target {
- let pre_link_args = TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-Wl,-q"]);
+ let pre_link_args = TargetOptions::link_args(
+ LinkerFlavor::Gnu(Cc::Yes, Lld::No),
+ &["-Wl,-q", "-Wl,--pic-veneer"],
+ );
Target {
- llvm_target: "armv7a-vita-eabihf".into(),
+ llvm_target: "thumbv7a-vita-eabihf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: "arm".into(),
@@ -18,21 +21,19 @@ pub fn target() -> Target {
os: "vita".into(),
endian: Endian::Little,
c_int_width: "32".into(),
- dynamic_linking: false,
env: "newlib".into(),
vendor: "sony".into(),
abi: "eabihf".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
no_default_libraries: false,
cpu: "cortex-a9".into(),
- executables: true,
families: cvs!["unix"],
linker: Some("arm-vita-eabi-gcc".into()),
relocation_model: RelocModel::Static,
- features: "+v7,+neon".into(),
+ features: "+v7,+neon,+vfp3,+thumb2,+thumb-mode".into(),
pre_link_args,
exe_suffix: ".elf".into(),
- panic_strategy: PanicStrategy::Abort,
+ has_thumb_interworking: true,
max_atomic_width: Some(64),
..Default::default()
},
diff --git a/compiler/rustc_target/src/spec/avr_gnu_base.rs b/compiler/rustc_target/src/spec/avr_gnu_base.rs
index 9c3406b53..fbec44b71 100644
--- a/compiler/rustc_target/src/spec/avr_gnu_base.rs
+++ b/compiler/rustc_target/src/spec/avr_gnu_base.rs
@@ -1,4 +1,5 @@
use crate::spec::{Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions};
+use object::elf;
/// A base target for AVR devices using the GNU toolchain.
///
@@ -29,3 +30,339 @@ pub fn target(target_cpu: &'static str, mmcu: &'static str) -> Target {
},
}
}
+
+/// Resolve the value of the EF_AVR_ARCH field for AVR ELF files, given the
+/// name of the target CPU / MCU.
+///
+/// In ELF files using the AVR architecture, the lower 7 bits of the e_flags
+/// field is a code that identifies the "ISA revision" of the object code.
+///
+/// This flag is generally set by AVR compilers in their output ELF files,
+/// and linkers like avr-ld check this flag in all of their input files to
+/// make sure they are compiled with the same ISA revision.
+pub fn ef_avr_arch(target_cpu: &str) -> u32 {
+ // Adapted from llvm-project/llvm/lib/target/AVR/AVRDevices.td
+ match target_cpu {
+ // Generic MCUs
+ "avr1" => elf::EF_AVR_ARCH_AVR1,
+ "avr2" => elf::EF_AVR_ARCH_AVR2,
+ "avr25" => elf::EF_AVR_ARCH_AVR25,
+ "avr3" => elf::EF_AVR_ARCH_AVR3,
+ "avr31" => elf::EF_AVR_ARCH_AVR31,
+ "avr35" => elf::EF_AVR_ARCH_AVR35,
+ "avr4" => elf::EF_AVR_ARCH_AVR4,
+ "avr5" => elf::EF_AVR_ARCH_AVR5,
+ "avr51" => elf::EF_AVR_ARCH_AVR51,
+ "avr6" => elf::EF_AVR_ARCH_AVR6,
+ "avrxmega1" => elf::EF_AVR_ARCH_XMEGA1,
+ "avrxmega2" => elf::EF_AVR_ARCH_XMEGA2,
+ "avrxmega3" => elf::EF_AVR_ARCH_XMEGA3,
+ "avrxmega4" => elf::EF_AVR_ARCH_XMEGA4,
+ "avrxmega5" => elf::EF_AVR_ARCH_XMEGA5,
+ "avrxmega6" => elf::EF_AVR_ARCH_XMEGA6,
+ "avrxmega7" => elf::EF_AVR_ARCH_XMEGA7,
+ "avrtiny" => elf::EF_AVR_ARCH_AVRTINY,
+
+ // Specific MCUs
+ "at90s1200" => elf::EF_AVR_ARCH_AVR1,
+ "attiny11" => elf::EF_AVR_ARCH_AVR1,
+ "attiny12" => elf::EF_AVR_ARCH_AVR1,
+ "attiny15" => elf::EF_AVR_ARCH_AVR1,
+ "attiny28" => elf::EF_AVR_ARCH_AVR1,
+ "at90s2313" => elf::EF_AVR_ARCH_AVR2,
+ "at90s2323" => elf::EF_AVR_ARCH_AVR2,
+ "at90s2333" => elf::EF_AVR_ARCH_AVR2,
+ "at90s2343" => elf::EF_AVR_ARCH_AVR2,
+ "attiny22" => elf::EF_AVR_ARCH_AVR2,
+ "attiny26" => elf::EF_AVR_ARCH_AVR2,
+ "at86rf401" => elf::EF_AVR_ARCH_AVR25,
+ "at90s4414" => elf::EF_AVR_ARCH_AVR2,
+ "at90s4433" => elf::EF_AVR_ARCH_AVR2,
+ "at90s4434" => elf::EF_AVR_ARCH_AVR2,
+ "at90s8515" => elf::EF_AVR_ARCH_AVR2,
+ "at90c8534" => elf::EF_AVR_ARCH_AVR2,
+ "at90s8535" => elf::EF_AVR_ARCH_AVR2,
+ "ata5272" => elf::EF_AVR_ARCH_AVR25,
+ "ata6616c" => elf::EF_AVR_ARCH_AVR25,
+ "attiny13" => elf::EF_AVR_ARCH_AVR25,
+ "attiny13a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny2313" => elf::EF_AVR_ARCH_AVR25,
+ "attiny2313a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny24" => elf::EF_AVR_ARCH_AVR25,
+ "attiny24a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny4313" => elf::EF_AVR_ARCH_AVR25,
+ "attiny44" => elf::EF_AVR_ARCH_AVR25,
+ "attiny44a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny84" => elf::EF_AVR_ARCH_AVR25,
+ "attiny84a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny25" => elf::EF_AVR_ARCH_AVR25,
+ "attiny45" => elf::EF_AVR_ARCH_AVR25,
+ "attiny85" => elf::EF_AVR_ARCH_AVR25,
+ "attiny261" => elf::EF_AVR_ARCH_AVR25,
+ "attiny261a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny441" => elf::EF_AVR_ARCH_AVR25,
+ "attiny461" => elf::EF_AVR_ARCH_AVR25,
+ "attiny461a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny841" => elf::EF_AVR_ARCH_AVR25,
+ "attiny861" => elf::EF_AVR_ARCH_AVR25,
+ "attiny861a" => elf::EF_AVR_ARCH_AVR25,
+ "attiny87" => elf::EF_AVR_ARCH_AVR25,
+ "attiny43u" => elf::EF_AVR_ARCH_AVR25,
+ "attiny48" => elf::EF_AVR_ARCH_AVR25,
+ "attiny88" => elf::EF_AVR_ARCH_AVR25,
+ "attiny828" => elf::EF_AVR_ARCH_AVR25,
+ "at43usb355" => elf::EF_AVR_ARCH_AVR3,
+ "at76c711" => elf::EF_AVR_ARCH_AVR3,
+ "atmega103" => elf::EF_AVR_ARCH_AVR31,
+ "at43usb320" => elf::EF_AVR_ARCH_AVR31,
+ "attiny167" => elf::EF_AVR_ARCH_AVR35,
+ "at90usb82" => elf::EF_AVR_ARCH_AVR35,
+ "at90usb162" => elf::EF_AVR_ARCH_AVR35,
+ "ata5505" => elf::EF_AVR_ARCH_AVR35,
+ "ata6617c" => elf::EF_AVR_ARCH_AVR35,
+ "ata664251" => elf::EF_AVR_ARCH_AVR35,
+ "atmega8u2" => elf::EF_AVR_ARCH_AVR35,
+ "atmega16u2" => elf::EF_AVR_ARCH_AVR35,
+ "atmega32u2" => elf::EF_AVR_ARCH_AVR35,
+ "attiny1634" => elf::EF_AVR_ARCH_AVR35,
+ "atmega8" => elf::EF_AVR_ARCH_AVR4,
+ "ata6289" => elf::EF_AVR_ARCH_AVR4,
+ "atmega8a" => elf::EF_AVR_ARCH_AVR4,
+ "ata6285" => elf::EF_AVR_ARCH_AVR4,
+ "ata6286" => elf::EF_AVR_ARCH_AVR4,
+ "ata6612c" => elf::EF_AVR_ARCH_AVR4,
+ "atmega48" => elf::EF_AVR_ARCH_AVR4,
+ "atmega48a" => elf::EF_AVR_ARCH_AVR4,
+ "atmega48pa" => elf::EF_AVR_ARCH_AVR4,
+ "atmega48pb" => elf::EF_AVR_ARCH_AVR4,
+ "atmega48p" => elf::EF_AVR_ARCH_AVR4,
+ "atmega88" => elf::EF_AVR_ARCH_AVR4,
+ "atmega88a" => elf::EF_AVR_ARCH_AVR4,
+ "atmega88p" => elf::EF_AVR_ARCH_AVR4,
+ "atmega88pa" => elf::EF_AVR_ARCH_AVR4,
+ "atmega88pb" => elf::EF_AVR_ARCH_AVR4,
+ "atmega8515" => elf::EF_AVR_ARCH_AVR4,
+ "atmega8535" => elf::EF_AVR_ARCH_AVR4,
+ "atmega8hva" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm1" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm2" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm2b" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm3" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm3b" => elf::EF_AVR_ARCH_AVR4,
+ "at90pwm81" => elf::EF_AVR_ARCH_AVR4,
+ "ata5702m322" => elf::EF_AVR_ARCH_AVR5,
+ "ata5782" => elf::EF_AVR_ARCH_AVR5,
+ "ata5790" => elf::EF_AVR_ARCH_AVR5,
+ "ata5790n" => elf::EF_AVR_ARCH_AVR5,
+ "ata5791" => elf::EF_AVR_ARCH_AVR5,
+ "ata5795" => elf::EF_AVR_ARCH_AVR5,
+ "ata5831" => elf::EF_AVR_ARCH_AVR5,
+ "ata6613c" => elf::EF_AVR_ARCH_AVR5,
+ "ata6614q" => elf::EF_AVR_ARCH_AVR5,
+ "ata8210" => elf::EF_AVR_ARCH_AVR5,
+ "ata8510" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega161" => elf::EF_AVR_ARCH_AVR5,
+ "atmega162" => elf::EF_AVR_ARCH_AVR5,
+ "atmega163" => elf::EF_AVR_ARCH_AVR5,
+ "atmega164a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega164p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega164pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega165" => elf::EF_AVR_ARCH_AVR5,
+ "atmega165a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega165p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega165pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega168" => elf::EF_AVR_ARCH_AVR5,
+ "atmega168a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega168p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega168pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega168pb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega169" => elf::EF_AVR_ARCH_AVR5,
+ "atmega169a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega169p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega169pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega323" => elf::EF_AVR_ARCH_AVR5,
+ "atmega324a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega324p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega324pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega324pb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega325" => elf::EF_AVR_ARCH_AVR5,
+ "atmega325a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega325p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega325pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3250" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3250a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3250p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3250pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega328" => elf::EF_AVR_ARCH_AVR5,
+ "atmega328p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega328pb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega329" => elf::EF_AVR_ARCH_AVR5,
+ "atmega329a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega329p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega329pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3290" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3290a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3290p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega3290pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega406" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega640" => elf::EF_AVR_ARCH_AVR5,
+ "atmega644" => elf::EF_AVR_ARCH_AVR5,
+ "atmega644a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega644p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega644pa" => elf::EF_AVR_ARCH_AVR5,
+ "atmega645" => elf::EF_AVR_ARCH_AVR5,
+ "atmega645a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega645p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega649" => elf::EF_AVR_ARCH_AVR5,
+ "atmega649a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega649p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6450" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6450a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6450p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6490" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6490a" => elf::EF_AVR_ARCH_AVR5,
+ "atmega6490p" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64rfr2" => elf::EF_AVR_ARCH_AVR5,
+ "atmega644rfr2" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16hva" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16hva2" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16hvb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16hvbrevb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32hvb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32hvbrevb" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64hve" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64hve2" => elf::EF_AVR_ARCH_AVR5,
+ "at90can32" => elf::EF_AVR_ARCH_AVR5,
+ "at90can64" => elf::EF_AVR_ARCH_AVR5,
+ "at90pwm161" => elf::EF_AVR_ARCH_AVR5,
+ "at90pwm216" => elf::EF_AVR_ARCH_AVR5,
+ "at90pwm316" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32c1" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64c1" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16m1" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32m1" => elf::EF_AVR_ARCH_AVR5,
+ "atmega64m1" => elf::EF_AVR_ARCH_AVR5,
+ "atmega16u4" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32u4" => elf::EF_AVR_ARCH_AVR5,
+ "atmega32u6" => elf::EF_AVR_ARCH_AVR5,
+ "at90usb646" => elf::EF_AVR_ARCH_AVR5,
+ "at90usb647" => elf::EF_AVR_ARCH_AVR5,
+ "at90scr100" => elf::EF_AVR_ARCH_AVR5,
+ "at94k" => elf::EF_AVR_ARCH_AVR5,
+ "m3000" => elf::EF_AVR_ARCH_AVR5,
+ "atmega128" => elf::EF_AVR_ARCH_AVR51,
+ "atmega128a" => elf::EF_AVR_ARCH_AVR51,
+ "atmega1280" => elf::EF_AVR_ARCH_AVR51,
+ "atmega1281" => elf::EF_AVR_ARCH_AVR51,
+ "atmega1284" => elf::EF_AVR_ARCH_AVR51,
+ "atmega1284p" => elf::EF_AVR_ARCH_AVR51,
+ "atmega128rfa1" => elf::EF_AVR_ARCH_AVR51,
+ "atmega128rfr2" => elf::EF_AVR_ARCH_AVR51,
+ "atmega1284rfr2" => elf::EF_AVR_ARCH_AVR51,
+ "at90can128" => elf::EF_AVR_ARCH_AVR51,
+ "at90usb1286" => elf::EF_AVR_ARCH_AVR51,
+ "at90usb1287" => elf::EF_AVR_ARCH_AVR51,
+ "atmega2560" => elf::EF_AVR_ARCH_AVR6,
+ "atmega2561" => elf::EF_AVR_ARCH_AVR6,
+ "atmega256rfr2" => elf::EF_AVR_ARCH_AVR6,
+ "atmega2564rfr2" => elf::EF_AVR_ARCH_AVR6,
+ "atxmega16a4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega16a4u" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega16c4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega16d4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32a4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32a4u" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32c3" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32c4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32d3" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32d4" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega32e5" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega16e5" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega8e5" => elf::EF_AVR_ARCH_XMEGA2,
+ "atxmega64a3" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64a3u" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64a4u" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64b1" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64b3" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64c3" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64d3" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64d4" => elf::EF_AVR_ARCH_XMEGA4,
+ "atxmega64a1" => elf::EF_AVR_ARCH_XMEGA5,
+ "atxmega64a1u" => elf::EF_AVR_ARCH_XMEGA5,
+ "atxmega128a3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128a3u" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128b1" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128b3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128c3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128d3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128d4" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega192a3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega192a3u" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega192c3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega192d3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256a3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256a3u" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256a3b" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256a3bu" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256c3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega256d3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega384c3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega384d3" => elf::EF_AVR_ARCH_XMEGA6,
+ "atxmega128a1" => elf::EF_AVR_ARCH_XMEGA7,
+ "atxmega128a1u" => elf::EF_AVR_ARCH_XMEGA7,
+ "atxmega128a4u" => elf::EF_AVR_ARCH_XMEGA7,
+ "attiny4" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny5" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny9" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny10" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny20" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny40" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny102" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny104" => elf::EF_AVR_ARCH_AVRTINY,
+ "attiny202" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny402" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny204" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny404" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny804" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1604" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny406" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny806" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1606" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny807" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1607" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny212" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny412" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny214" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny414" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny814" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1614" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny416" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny816" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1616" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny3216" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny417" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny817" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1617" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny3217" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1624" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1626" => elf::EF_AVR_ARCH_XMEGA3,
+ "attiny1627" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega808" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega809" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega1608" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega1609" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega3208" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega3209" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega4808" => elf::EF_AVR_ARCH_XMEGA3,
+ "atmega4809" => elf::EF_AVR_ARCH_XMEGA3,
+
+ // Unknown target CPU => Unspecified/generic code
+ _ => 0,
+ }
+}
diff --git a/compiler/rustc_target/src/spec/loongarch64_unknown_none.rs b/compiler/rustc_target/src/spec/loongarch64_unknown_none.rs
new file mode 100644
index 000000000..209d481d6
--- /dev/null
+++ b/compiler/rustc_target/src/spec/loongarch64_unknown_none.rs
@@ -0,0 +1,22 @@
+use super::{Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel};
+use super::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "loongarch64-unknown-none".into(),
+ pointer_width: 64,
+ data_layout: "e-m:e-p:64:64-i64:64-i128:128-n64-S128".into(),
+ arch: "loongarch64".into(),
+ options: TargetOptions {
+ cpu: "generic".into(),
+ features: "+f,+d".into(),
+ linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::No),
+ llvm_abiname: "lp64d".into(),
+ max_atomic_width: Some(64),
+ relocation_model: RelocModel::Static,
+ panic_strategy: PanicStrategy::Abort,
+ code_model: Some(CodeModel::Small),
+ ..Default::default()
+ },
+ }
+}
diff --git a/compiler/rustc_target/src/spec/loongarch64_unknown_none_softfloat.rs b/compiler/rustc_target/src/spec/loongarch64_unknown_none_softfloat.rs
new file mode 100644
index 000000000..f444a7f24
--- /dev/null
+++ b/compiler/rustc_target/src/spec/loongarch64_unknown_none_softfloat.rs
@@ -0,0 +1,23 @@
+use super::{Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel};
+use super::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "loongarch64-unknown-none".into(),
+ pointer_width: 64,
+ data_layout: "e-m:e-p:64:64-i64:64-i128:128-n64-S128".into(),
+ arch: "loongarch64".into(),
+ options: TargetOptions {
+ cpu: "generic".into(),
+ features: "-f,-d".into(),
+ abi: "softfloat".into(),
+ linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::No),
+ llvm_abiname: "lp64s".into(),
+ max_atomic_width: Some(64),
+ relocation_model: RelocModel::Static,
+ panic_strategy: PanicStrategy::Abort,
+ code_model: Some(CodeModel::Small),
+ ..Default::default()
+ },
+ }
+}
diff --git a/compiler/rustc_target/src/spec/mips64_unknown_linux_gnuabi64.rs b/compiler/rustc_target/src/spec/mips64_unknown_linux_gnuabi64.rs
index fc5dbd114..b9df0046b 100644
--- a/compiler/rustc_target/src/spec/mips64_unknown_linux_gnuabi64.rs
+++ b/compiler/rustc_target/src/spec/mips64_unknown_linux_gnuabi64.rs
@@ -12,7 +12,7 @@ pub fn target() -> Target {
endian: Endian::Big,
// NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(),
- features: "+mips64r2".into(),
+ features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
diff --git a/compiler/rustc_target/src/spec/mips64el_unknown_linux_gnuabi64.rs b/compiler/rustc_target/src/spec/mips64el_unknown_linux_gnuabi64.rs
index e0d5f6f57..57ad8c473 100644
--- a/compiler/rustc_target/src/spec/mips64el_unknown_linux_gnuabi64.rs
+++ b/compiler/rustc_target/src/spec/mips64el_unknown_linux_gnuabi64.rs
@@ -10,7 +10,7 @@ pub fn target() -> Target {
abi: "abi64".into(),
// NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(),
- features: "+mips64r2".into(),
+ features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
index ba4b89c9e..2365dfaf1 100644
--- a/compiler/rustc_target/src/spec/mod.rs
+++ b/compiler/rustc_target/src/spec/mod.rs
@@ -62,6 +62,7 @@ mod android_base;
mod apple_base;
pub use apple_base::deployment_target as current_apple_deployment_target;
mod avr_gnu_base;
+pub use avr_gnu_base::ef_avr_arch;
mod bpf_base;
mod dragonfly_base;
mod freebsd_base;
@@ -160,15 +161,49 @@ pub enum LinkerFlavor {
/// linker flavors (`LinkerFlavor`).
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum LinkerFlavorCli {
+ // New (unstable) flavors, with direct counterparts in `LinkerFlavor`.
+ Gnu(Cc, Lld),
+ Darwin(Cc, Lld),
+ WasmLld(Cc),
+ Unix(Cc),
+ // Note: `Msvc(Lld::No)` is also a stable value.
+ Msvc(Lld),
+ EmCc,
+ Bpf,
+ Ptx,
+
+ // Below: the legacy stable values.
Gcc,
Ld,
Lld(LldFlavor),
- Msvc,
Em,
BpfLinker,
PtxLinker,
}
+impl LinkerFlavorCli {
+ /// Returns whether this `-C linker-flavor` option is one of the unstable values.
+ pub fn is_unstable(&self) -> bool {
+ match self {
+ LinkerFlavorCli::Gnu(..)
+ | LinkerFlavorCli::Darwin(..)
+ | LinkerFlavorCli::WasmLld(..)
+ | LinkerFlavorCli::Unix(..)
+ | LinkerFlavorCli::Msvc(Lld::Yes)
+ | LinkerFlavorCli::EmCc
+ | LinkerFlavorCli::Bpf
+ | LinkerFlavorCli::Ptx
+ | LinkerFlavorCli::BpfLinker
+ | LinkerFlavorCli::PtxLinker => true,
+ LinkerFlavorCli::Gcc
+ | LinkerFlavorCli::Ld
+ | LinkerFlavorCli::Lld(..)
+ | LinkerFlavorCli::Msvc(Lld::No)
+ | LinkerFlavorCli::Em => false,
+ }
+ }
+}
+
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum LldFlavor {
Wasm,
@@ -205,16 +240,22 @@ impl ToJson for LldFlavor {
}
impl LinkerFlavor {
- pub fn from_cli(cli: LinkerFlavorCli, target: &TargetOptions) -> LinkerFlavor {
- Self::from_cli_impl(cli, target.linker_flavor.lld_flavor(), target.linker_flavor.is_gnu())
- }
-
- /// The passed CLI flavor is preferred over other args coming from the default target spec,
- /// so this function can produce a flavor that is incompatible with the current target.
- /// FIXME: Produce errors when `-Clinker-flavor` is set to something incompatible
- /// with the current target.
- fn from_cli_impl(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
+ /// At this point the target's reference linker flavor doesn't yet exist and we need to infer
+ /// it. The inference always succeds and gives some result, and we don't report any flavor
+ /// incompatibility errors for json target specs. The CLI flavor is used as the main source
+ /// of truth, other flags are used in case of ambiguities.
+ fn from_cli_json(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
match cli {
+ LinkerFlavorCli::Gnu(cc, lld) => LinkerFlavor::Gnu(cc, lld),
+ LinkerFlavorCli::Darwin(cc, lld) => LinkerFlavor::Darwin(cc, lld),
+ LinkerFlavorCli::WasmLld(cc) => LinkerFlavor::WasmLld(cc),
+ LinkerFlavorCli::Unix(cc) => LinkerFlavor::Unix(cc),
+ LinkerFlavorCli::Msvc(lld) => LinkerFlavor::Msvc(lld),
+ LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
+ LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
+ LinkerFlavorCli::Ptx => LinkerFlavor::Ptx,
+
+ // Below: legacy stable values
LinkerFlavorCli::Gcc => match lld_flavor {
LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::Yes, Lld::No),
LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::Yes, Lld::No),
@@ -230,7 +271,6 @@ impl LinkerFlavor {
LinkerFlavorCli::Lld(LldFlavor::Ld64) => LinkerFlavor::Darwin(Cc::No, Lld::Yes),
LinkerFlavorCli::Lld(LldFlavor::Wasm) => LinkerFlavor::WasmLld(Cc::No),
LinkerFlavorCli::Lld(LldFlavor::Link) => LinkerFlavor::Msvc(Lld::Yes),
- LinkerFlavorCli::Msvc => LinkerFlavor::Msvc(Lld::No),
LinkerFlavorCli::Em => LinkerFlavor::EmCc,
LinkerFlavorCli::BpfLinker => LinkerFlavor::Bpf,
LinkerFlavorCli::PtxLinker => LinkerFlavor::Ptx,
@@ -250,13 +290,119 @@ impl LinkerFlavor {
LinkerFlavorCli::Ld
}
LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Link),
- LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc,
+ LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc(Lld::No),
LinkerFlavor::EmCc => LinkerFlavorCli::Em,
LinkerFlavor::Bpf => LinkerFlavorCli::BpfLinker,
LinkerFlavor::Ptx => LinkerFlavorCli::PtxLinker,
}
}
+ fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
+ match cli {
+ LinkerFlavorCli::Gnu(cc, lld) | LinkerFlavorCli::Darwin(cc, lld) => {
+ (Some(cc), Some(lld))
+ }
+ LinkerFlavorCli::WasmLld(cc) => (Some(cc), Some(Lld::Yes)),
+ LinkerFlavorCli::Unix(cc) => (Some(cc), None),
+ LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
+ LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
+ LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx => (None, None),
+
+ // Below: legacy stable values
+ LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
+ LinkerFlavorCli::Ld => (Some(Cc::No), Some(Lld::No)),
+ LinkerFlavorCli::Lld(_) => (Some(Cc::No), Some(Lld::Yes)),
+ LinkerFlavorCli::Em => (Some(Cc::Yes), Some(Lld::Yes)),
+ LinkerFlavorCli::BpfLinker | LinkerFlavorCli::PtxLinker => (None, None),
+ }
+ }
+
+ fn infer_linker_hints(linker_stem: &str) -> (Option<Cc>, Option<Lld>) {
+ // Remove any version postfix.
+ let stem = linker_stem
+ .rsplit_once('-')
+ .and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
+ .unwrap_or(linker_stem);
+
+ // GCC/Clang can have an optional target prefix.
+ if stem == "emcc"
+ || stem == "gcc"
+ || stem.ends_with("-gcc")
+ || stem == "g++"
+ || stem.ends_with("-g++")
+ || stem == "clang"
+ || stem.ends_with("-clang")
+ || stem == "clang++"
+ || stem.ends_with("-clang++")
+ {
+ (Some(Cc::Yes), None)
+ } else if stem == "wasm-ld"
+ || stem.ends_with("-wasm-ld")
+ || stem == "ld.lld"
+ || stem == "lld"
+ || stem == "rust-lld"
+ || stem == "lld-link"
+ {
+ (Some(Cc::No), Some(Lld::Yes))
+ } else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
+ (Some(Cc::No), Some(Lld::No))
+ } else {
+ (None, None)
+ }
+ }
+
+ fn with_hints(self, (cc_hint, lld_hint): (Option<Cc>, Option<Lld>)) -> LinkerFlavor {
+ match self {
+ LinkerFlavor::Gnu(cc, lld) => {
+ LinkerFlavor::Gnu(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
+ }
+ LinkerFlavor::Darwin(cc, lld) => {
+ LinkerFlavor::Darwin(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
+ }
+ LinkerFlavor::WasmLld(cc) => LinkerFlavor::WasmLld(cc_hint.unwrap_or(cc)),
+ LinkerFlavor::Unix(cc) => LinkerFlavor::Unix(cc_hint.unwrap_or(cc)),
+ LinkerFlavor::Msvc(lld) => LinkerFlavor::Msvc(lld_hint.unwrap_or(lld)),
+ LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Ptx => self,
+ }
+ }
+
+ pub fn with_cli_hints(self, cli: LinkerFlavorCli) -> LinkerFlavor {
+ self.with_hints(LinkerFlavor::infer_cli_hints(cli))
+ }
+
+ pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
+ self.with_hints(LinkerFlavor::infer_linker_hints(linker_stem))
+ }
+
+ pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
+ let compatible = |cli| {
+ // The CLI flavor should be compatible with the target if:
+ // 1. they are counterparts: they have the same principal flavor.
+ match (self, cli) {
+ (LinkerFlavor::Gnu(..), LinkerFlavorCli::Gnu(..))
+ | (LinkerFlavor::Darwin(..), LinkerFlavorCli::Darwin(..))
+ | (LinkerFlavor::WasmLld(..), LinkerFlavorCli::WasmLld(..))
+ | (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
+ | (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
+ | (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
+ | (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
+ | (LinkerFlavor::Ptx, LinkerFlavorCli::Ptx) => return true,
+ _ => {}
+ }
+
+ // 2. or, the flavor is legacy and survives this roundtrip.
+ cli == self.with_cli_hints(cli).to_cli()
+ };
+ (!compatible(cli)).then(|| {
+ LinkerFlavorCli::all()
+ .iter()
+ .filter(|cli| compatible(**cli))
+ .map(|cli| cli.desc())
+ .intersperse(", ")
+ .collect()
+ })
+ }
+
pub fn lld_flavor(self) -> LldFlavor {
match self {
LinkerFlavor::Gnu(..)
@@ -273,11 +419,52 @@ impl LinkerFlavor {
pub fn is_gnu(self) -> bool {
matches!(self, LinkerFlavor::Gnu(..))
}
+
+ /// Returns whether the flavor uses the `lld` linker.
+ pub fn uses_lld(self) -> bool {
+ // Exhaustive match in case new flavors are added in the future.
+ match self {
+ LinkerFlavor::Gnu(_, Lld::Yes)
+ | LinkerFlavor::Darwin(_, Lld::Yes)
+ | LinkerFlavor::WasmLld(..)
+ | LinkerFlavor::EmCc
+ | LinkerFlavor::Msvc(Lld::Yes) => true,
+ LinkerFlavor::Gnu(..)
+ | LinkerFlavor::Darwin(..)
+ | LinkerFlavor::Msvc(_)
+ | LinkerFlavor::Unix(_)
+ | LinkerFlavor::Bpf
+ | LinkerFlavor::Ptx => false,
+ }
+ }
+
+ /// Returns whether the flavor calls the linker via a C/C++ compiler.
+ pub fn uses_cc(self) -> bool {
+ // Exhaustive match in case new flavors are added in the future.
+ match self {
+ LinkerFlavor::Gnu(Cc::Yes, _)
+ | LinkerFlavor::Darwin(Cc::Yes, _)
+ | LinkerFlavor::WasmLld(Cc::Yes)
+ | LinkerFlavor::Unix(Cc::Yes)
+ | LinkerFlavor::EmCc => true,
+ LinkerFlavor::Gnu(..)
+ | LinkerFlavor::Darwin(..)
+ | LinkerFlavor::WasmLld(_)
+ | LinkerFlavor::Msvc(_)
+ | LinkerFlavor::Unix(_)
+ | LinkerFlavor::Bpf
+ | LinkerFlavor::Ptx => false,
+ }
+ }
}
macro_rules! linker_flavor_cli_impls {
($(($($flavor:tt)*) $string:literal)*) => (
impl LinkerFlavorCli {
+ const fn all() -> &'static [LinkerFlavorCli] {
+ &[$($($flavor)*,)*]
+ }
+
pub const fn one_of() -> &'static str {
concat!("one of: ", $($string, " ",)*)
}
@@ -289,8 +476,8 @@ macro_rules! linker_flavor_cli_impls {
})
}
- pub fn desc(&self) -> &str {
- match *self {
+ pub fn desc(self) -> &'static str {
+ match self {
$($($flavor)* => $string,)*
}
}
@@ -299,13 +486,31 @@ macro_rules! linker_flavor_cli_impls {
}
linker_flavor_cli_impls! {
+ (LinkerFlavorCli::Gnu(Cc::No, Lld::No)) "gnu"
+ (LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
+ (LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
+ (LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
+ (LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
+ (LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
+ (LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
+ (LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
+ (LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
+ (LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
+ (LinkerFlavorCli::Unix(Cc::No)) "unix"
+ (LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
+ (LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
+ (LinkerFlavorCli::Msvc(Lld::No)) "msvc"
+ (LinkerFlavorCli::EmCc) "em-cc"
+ (LinkerFlavorCli::Bpf) "bpf"
+ (LinkerFlavorCli::Ptx) "ptx"
+
+ // Below: legacy stable values
(LinkerFlavorCli::Gcc) "gcc"
(LinkerFlavorCli::Ld) "ld"
(LinkerFlavorCli::Lld(LldFlavor::Ld)) "ld.lld"
(LinkerFlavorCli::Lld(LldFlavor::Ld64)) "ld64.lld"
(LinkerFlavorCli::Lld(LldFlavor::Link)) "lld-link"
(LinkerFlavorCli::Lld(LldFlavor::Wasm)) "wasm-ld"
- (LinkerFlavorCli::Msvc) "msvc"
(LinkerFlavorCli::Em) "em"
(LinkerFlavorCli::BpfLinker) "bpf-linker"
(LinkerFlavorCli::PtxLinker) "ptx-linker"
@@ -596,6 +801,17 @@ impl LinkOutputKind {
_ => return None,
})
}
+
+ pub fn can_link_dylib(self) -> bool {
+ match self {
+ LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false,
+ LinkOutputKind::DynamicNoPicExe
+ | LinkOutputKind::DynamicPicExe
+ | LinkOutputKind::DynamicDylib
+ | LinkOutputKind::StaticDylib
+ | LinkOutputKind::WasiReactorExe => true,
+ }
+ }
}
impl fmt::Display for LinkOutputKind {
@@ -815,6 +1031,7 @@ bitflags::bitflags! {
const SHADOWCALLSTACK = 1 << 7;
const KCFI = 1 << 8;
const KERNELADDRESS = 1 << 9;
+ const SAFESTACK = 1 << 10;
}
}
@@ -831,6 +1048,7 @@ impl SanitizerSet {
SanitizerSet::LEAK => "leak",
SanitizerSet::MEMORY => "memory",
SanitizerSet::MEMTAG => "memtag",
+ SanitizerSet::SAFESTACK => "safestack",
SanitizerSet::SHADOWCALLSTACK => "shadow-call-stack",
SanitizerSet::THREAD => "thread",
SanitizerSet::HWADDRESS => "hwaddress",
@@ -871,6 +1089,7 @@ impl IntoIterator for SanitizerSet {
SanitizerSet::THREAD,
SanitizerSet::HWADDRESS,
SanitizerSet::KERNELADDRESS,
+ SanitizerSet::SAFESTACK,
]
.iter()
.copied()
@@ -1101,10 +1320,12 @@ supported_targets! {
("x86_64-unknown-openbsd", x86_64_unknown_openbsd),
("aarch64-unknown-netbsd", aarch64_unknown_netbsd),
+ ("aarch64_be-unknown-netbsd", aarch64_be_unknown_netbsd),
("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf),
("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
("i686-unknown-netbsd", i686_unknown_netbsd),
("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
+ ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
("sparc64-unknown-netbsd", sparc64_unknown_netbsd),
("x86_64-unknown-netbsd", x86_64_unknown_netbsd),
@@ -1202,6 +1423,7 @@ supported_targets! {
("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
+ ("riscv32imac-esp-espidf", riscv32imac_esp_espidf),
("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf),
("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
@@ -1211,6 +1433,9 @@ supported_targets! {
("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
+ ("loongarch64-unknown-none", loongarch64_unknown_none),
+ ("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
+
("aarch64-unknown-none", aarch64_unknown_none),
("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat),
@@ -1573,7 +1798,7 @@ pub struct TargetOptions {
pub static_position_independent_executables: bool,
/// Determines if the target always requires using the PLT for indirect
/// library calls or not. This controls the default value of the `-Z plt` flag.
- pub needs_plt: bool,
+ pub plt_by_default: bool,
/// Either partial, full, or off. Full RELRO makes the dynamic linker
/// resolve all symbols at startup and marks the GOT read-only before
/// starting the program, preventing overwriting the GOT.
@@ -1798,7 +2023,7 @@ impl TargetOptions {
}
fn update_from_cli(&mut self) {
- self.linker_flavor = LinkerFlavor::from_cli_impl(
+ self.linker_flavor = LinkerFlavor::from_cli_json(
self.linker_flavor_json,
self.lld_flavor_json,
self.linker_is_gnu_json,
@@ -1812,12 +2037,7 @@ impl TargetOptions {
] {
args.clear();
for (flavor, args_json) in args_json {
- // Cannot use `from_cli` due to borrow checker.
- let linker_flavor = LinkerFlavor::from_cli_impl(
- *flavor,
- self.lld_flavor_json,
- self.linker_is_gnu_json,
- );
+ let linker_flavor = self.linker_flavor.with_cli_hints(*flavor);
// Normalize to no lld to avoid asserts.
let linker_flavor = match linker_flavor {
LinkerFlavor::Gnu(cc, _) => LinkerFlavor::Gnu(cc, Lld::No),
@@ -1900,7 +2120,7 @@ impl Default for TargetOptions {
no_default_libraries: true,
position_independent_executables: false,
static_position_independent_executables: false,
- needs_plt: false,
+ plt_by_default: true,
relro_level: RelroLevel::None,
pre_link_objects: Default::default(),
post_link_objects: Default::default(),
@@ -2364,6 +2584,7 @@ impl Target {
Some("leak") => SanitizerSet::LEAK,
Some("memory") => SanitizerSet::MEMORY,
Some("memtag") => SanitizerSet::MEMTAG,
+ Some("safestack") => SanitizerSet::SAFESTACK,
Some("shadow-call-stack") => SanitizerSet::SHADOWCALLSTACK,
Some("thread") => SanitizerSet::THREAD,
Some("hwaddress") => SanitizerSet::HWADDRESS,
@@ -2572,7 +2793,7 @@ impl Target {
key!(no_default_libraries, bool);
key!(position_independent_executables, bool);
key!(static_position_independent_executables, bool);
- key!(needs_plt, bool);
+ key!(plt_by_default, bool);
key!(relro_level, RelroLevel)?;
key!(archive_format);
key!(allow_asm, bool);
@@ -2828,7 +3049,7 @@ impl ToJson for Target {
target_option_val!(no_default_libraries);
target_option_val!(position_independent_executables);
target_option_val!(static_position_independent_executables);
- target_option_val!(needs_plt);
+ target_option_val!(plt_by_default);
target_option_val!(relro_level);
target_option_val!(archive_format);
target_option_val!(allow_asm);
diff --git a/compiler/rustc_target/src/spec/riscv32imac_esp_espidf.rs b/compiler/rustc_target/src/spec/riscv32imac_esp_espidf.rs
new file mode 100644
index 000000000..079506540
--- /dev/null
+++ b/compiler/rustc_target/src/spec/riscv32imac_esp_espidf.rs
@@ -0,0 +1,31 @@
+use crate::spec::{cvs, PanicStrategy, RelocModel, Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
+ llvm_target: "riscv32".into(),
+ pointer_width: 32,
+ arch: "riscv32".into(),
+
+ options: TargetOptions {
+ families: cvs!["unix"],
+ os: "espidf".into(),
+ env: "newlib".into(),
+ vendor: "espressif".into(),
+ linker: Some("riscv32-esp-elf-gcc".into()),
+ cpu: "generic-rv32".into(),
+
+ // As RiscV32IMAC architecture does natively support atomics,
+ // automatically enable the support for the Rust STD library.
+ max_atomic_width: Some(64),
+ atomic_cas: true,
+
+ features: "+m,+a,+c".into(),
+ panic_strategy: PanicStrategy::Abort,
+ relocation_model: RelocModel::Static,
+ emit_debug_gdb_scripts: false,
+ eh_frame_header: false,
+ ..Default::default()
+ },
+ }
+}
diff --git a/compiler/rustc_target/src/spec/riscv64gc_unknown_netbsd.rs b/compiler/rustc_target/src/spec/riscv64gc_unknown_netbsd.rs
new file mode 100644
index 000000000..a89bd363a
--- /dev/null
+++ b/compiler/rustc_target/src/spec/riscv64gc_unknown_netbsd.rs
@@ -0,0 +1,19 @@
+use crate::spec::{CodeModel, Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "riscv64-unknown-netbsd".into(),
+ pointer_width: 64,
+ data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
+ arch: "riscv64".into(),
+ options: TargetOptions {
+ code_model: Some(CodeModel::Medium),
+ cpu: "generic-rv64".into(),
+ features: "+m,+a,+f,+d,+c".into(),
+ llvm_abiname: "lp64d".into(),
+ max_atomic_width: Some(64),
+ mcount: "__mcount".into(),
+ ..super::netbsd_base::opts()
+ },
+ }
+}
diff --git a/compiler/rustc_target/src/spec/x86_64_apple_ios.rs b/compiler/rustc_target/src/spec/x86_64_apple_ios.rs
index 1dcb47056..061b6a96f 100644
--- a/compiler/rustc_target/src/spec/x86_64_apple_ios.rs
+++ b/compiler/rustc_target/src/spec/x86_64_apple_ios.rs
@@ -13,7 +13,7 @@ pub fn target() -> Target {
.into(),
arch: arch.target_arch(),
options: TargetOptions {
- max_atomic_width: Some(64),
+ max_atomic_width: Some(128),
stack_probes: StackProbeType::X86,
..base
},
diff --git a/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs b/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs
index 9f3b0fab6..50f359c35 100644
--- a/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs
+++ b/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs
@@ -15,7 +15,7 @@ pub fn target() -> Target {
.into(),
arch: arch.target_arch(),
options: TargetOptions {
- max_atomic_width: Some(64),
+ max_atomic_width: Some(128),
stack_probes: StackProbeType::X86,
..base
},
diff --git a/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs b/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs
index 550ce0b9c..2ec4d9569 100644
--- a/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs
+++ b/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs
@@ -1,15 +1,16 @@
-use super::apple_base::{opts, Arch};
+use super::apple_base::{opts, tvos_sim_llvm_target, Arch};
use crate::spec::{StackProbeType, Target, TargetOptions};
pub fn target() -> Target {
let arch = Arch::X86_64_sim;
Target {
- llvm_target: "x86_64-apple-tvos".into(),
+ llvm_target: tvos_sim_llvm_target(arch).into(),
pointer_width: 64,
- data_layout: "e-m:o-i64:64-f80:128-n8:16:32:64-S128".into(),
+ data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+ .into(),
arch: arch.target_arch(),
options: TargetOptions {
- max_atomic_width: Some(64),
+ max_atomic_width: Some(128),
stack_probes: StackProbeType::X86,
..opts("tvos", arch)
},
diff --git a/compiler/rustc_target/src/spec/x86_64_apple_watchos_sim.rs b/compiler/rustc_target/src/spec/x86_64_apple_watchos_sim.rs
index 75ce02cba..5fcc00a86 100644
--- a/compiler/rustc_target/src/spec/x86_64_apple_watchos_sim.rs
+++ b/compiler/rustc_target/src/spec/x86_64_apple_watchos_sim.rs
@@ -10,7 +10,7 @@ pub fn target() -> Target {
.into(),
arch: arch.target_arch(),
options: TargetOptions {
- max_atomic_width: Some(64),
+ max_atomic_width: Some(128),
stack_probes: StackProbeType::X86,
forces_embed_bitcode: true,
// Taken from a clang build on Xcode 11.4.1.
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 cba6fda19..a7ed74f47 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
@@ -63,6 +63,7 @@ pub fn target() -> Target {
linker: Some("rust-lld".into()),
max_atomic_width: Some(64),
cpu: "x86-64".into(),
+ plt_by_default: false,
features: "+rdrnd,+rdseed,+lvi-cfi,+lvi-load-hardening".into(),
llvm_args: cvs!["--x86-experimental-lvi-inline-asm-hardening"],
position_independent_executables: true,
diff --git a/compiler/rustc_target/src/spec/x86_64_linux_android.rs b/compiler/rustc_target/src/spec/x86_64_linux_android.rs
index a3bdb5f54..c110674fd 100644
--- a/compiler/rustc_target/src/spec/x86_64_linux_android.rs
+++ b/compiler/rustc_target/src/spec/x86_64_linux_android.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target, T
pub fn target() -> Target {
let mut base = super::android_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
// https://developer.android.com/ndk/guides/abis.html#86-64
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".into();
base.max_atomic_width = Some(64);
diff --git a/compiler/rustc_target/src/spec/x86_64_pc_nto_qnx710.rs b/compiler/rustc_target/src/spec/x86_64_pc_nto_qnx710.rs
index 6fb2dfd80..8424757df 100644
--- a/compiler/rustc_target/src/spec/x86_64_pc_nto_qnx710.rs
+++ b/compiler/rustc_target/src/spec/x86_64_pc_nto_qnx710.rs
@@ -10,6 +10,7 @@ pub fn target() -> Target {
arch: "x86_64".into(),
options: TargetOptions {
cpu: "x86-64".into(),
+ plt_by_default: false,
max_atomic_width: Some(64),
pre_link_args: TargetOptions::link_args(
LinkerFlavor::Gnu(Cc::Yes, Lld::No),
diff --git a/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs b/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs
index cb62a8173..e2c59d293 100644
--- a/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs
+++ b/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs
@@ -4,10 +4,11 @@ pub fn target() -> Target {
let mut base = super::solaris_base::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.vendor = "pc".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::X86;
- base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI;
+ base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::THREAD;
Target {
llvm_target: "x86_64-pc-solaris".into(),
diff --git a/compiler/rustc_target/src/spec/x86_64_pc_windows_gnu.rs b/compiler/rustc_target/src/spec/x86_64_pc_windows_gnu.rs
index 37feaa9db..1b8885c34 100644
--- a/compiler/rustc_target/src/spec/x86_64_pc_windows_gnu.rs
+++ b/compiler/rustc_target/src/spec/x86_64_pc_windows_gnu.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, Target};
pub fn target() -> Target {
let mut base = super::windows_gnu_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
// Use high-entropy 64 bit address space for ASLR
base.add_pre_link_args(
LinkerFlavor::Gnu(Cc::No, Lld::No),
diff --git a/compiler/rustc_target/src/spec/x86_64_pc_windows_gnullvm.rs b/compiler/rustc_target/src/spec/x86_64_pc_windows_gnullvm.rs
index 039bc2bd2..8f5e398a0 100644
--- a/compiler/rustc_target/src/spec/x86_64_pc_windows_gnullvm.rs
+++ b/compiler/rustc_target/src/spec/x86_64_pc_windows_gnullvm.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, Target};
pub fn target() -> Target {
let mut base = super::windows_gnullvm_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.max_atomic_width = Some(64);
base.linker = Some("x86_64-w64-mingw32-clang".into());
diff --git a/compiler/rustc_target/src/spec/x86_64_pc_windows_msvc.rs b/compiler/rustc_target/src/spec/x86_64_pc_windows_msvc.rs
index 081806aa6..6b897ca70 100644
--- a/compiler/rustc_target/src/spec/x86_64_pc_windows_msvc.rs
+++ b/compiler/rustc_target/src/spec/x86_64_pc_windows_msvc.rs
@@ -3,6 +3,7 @@ use crate::spec::Target;
pub fn target() -> Target {
let mut base = super::windows_msvc_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
Target {
diff --git a/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs b/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs
index 0f31ea86b..650065f63 100644
--- a/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs
+++ b/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs
@@ -4,6 +4,7 @@ pub fn target() -> Target {
let mut base = super::solaris_base::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.vendor = "sun".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs b/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs
index 67ce3768d..3b8e75977 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::dragonfly_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs
index b41e5842a..b2d91d099 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::freebsd_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_fuchsia.rs b/compiler/rustc_target/src/spec/x86_64_unknown_fuchsia.rs
index a3231d19f..bee935419 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_fuchsia.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_fuchsia.rs
@@ -3,6 +3,7 @@ use crate::spec::{SanitizerSet, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::fuchsia_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::X86;
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs b/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs
index 9a7a3b501..16ed3150e 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::haiku_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs b/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs
index fb1af33f8..74ef2527c 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs
@@ -3,6 +3,7 @@ use crate::spec::{StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::hermit_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.features = "+rdrnd,+rdseed".into();
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_illumos.rs b/compiler/rustc_target/src/spec/x86_64_unknown_illumos.rs
index 04a12a7bf..9259cfe5f 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_illumos.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_illumos.rs
@@ -4,8 +4,9 @@ pub fn target() -> Target {
let mut base = super::illumos_base::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64", "-std=c99"]);
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
- base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI;
+ base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::THREAD;
Target {
// LLVM does not currently have a separate illumos target,
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_l4re_uclibc.rs b/compiler/rustc_target/src/spec/x86_64_unknown_l4re_uclibc.rs
index 26da7e800..912d289c4 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_l4re_uclibc.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_l4re_uclibc.rs
@@ -3,6 +3,7 @@ use crate::spec::{PanicStrategy, Target};
pub fn target() -> Target {
let mut base = super::l4re_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.panic_strategy = PanicStrategy::Abort;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs
index 9af1049b8..2f970f87c 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::linux_gnu_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
@@ -11,6 +12,7 @@ pub fn target() -> Target {
| SanitizerSet::CFI
| SanitizerSet::LEAK
| SanitizerSet::MEMORY
+ | SanitizerSet::SAFESTACK
| SanitizerSet::THREAD;
base.supports_xray = true;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs
index 626d5b480..5469d02c5 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs
@@ -10,7 +10,7 @@ pub fn target() -> Target {
base.has_thread_local = false;
// BUG(GabrielMajeri): disabling the PLT on x86_64 Linux with x32 ABI
// breaks code gen. See LLVM bug 36743
- base.needs_plt = true;
+ base.plt_by_default = true;
Target {
llvm_target: "x86_64-unknown-linux-gnux32".into(),
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs
index bf4cf7d7b..7154f5fa3 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::linux_musl_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs
index 74c434935..2e7bf34f7 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target, T
pub fn target() -> Target {
let mut base = super::netbsd_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_none.rs b/compiler/rustc_target/src/spec/x86_64_unknown_none.rs
index 43c5ce78c..fe3b24f2d 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_none.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_none.rs
@@ -10,6 +10,7 @@ use super::{RelroLevel, SanitizerSet, StackProbeType, Target, TargetOptions};
pub fn target() -> Target {
let opts = TargetOptions {
cpu: "x86-64".into(),
+ plt_by_default: false,
max_atomic_width: Some(64),
stack_probes: StackProbeType::X86,
position_independent_executables: true,
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs
index 8e4d42a0a..86fa9bf7e 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::openbsd_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs b/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs
index b47f15cf5..decc97367 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::redox_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_uefi.rs b/compiler/rustc_target/src/spec/x86_64_unknown_uefi.rs
index a7ae17839..67664a747 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_uefi.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_uefi.rs
@@ -10,6 +10,7 @@ use crate::spec::Target;
pub fn target() -> Target {
let mut base = super::uefi_msvc_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
// We disable MMX and SSE for now, even though UEFI allows using them. Problem is, you have to
diff --git a/compiler/rustc_target/src/spec/x86_64_uwp_windows_gnu.rs b/compiler/rustc_target/src/spec/x86_64_uwp_windows_gnu.rs
index c3eaa6939..1a9d2a571 100644
--- a/compiler/rustc_target/src/spec/x86_64_uwp_windows_gnu.rs
+++ b/compiler/rustc_target/src/spec/x86_64_uwp_windows_gnu.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, Target};
pub fn target() -> Target {
let mut base = super::windows_uwp_gnu_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
// Use high-entropy 64 bit address space for ASLR
base.add_pre_link_args(
LinkerFlavor::Gnu(Cc::No, Lld::No),
diff --git a/compiler/rustc_target/src/spec/x86_64_uwp_windows_msvc.rs b/compiler/rustc_target/src/spec/x86_64_uwp_windows_msvc.rs
index b2769350b..1ae403fa8 100644
--- a/compiler/rustc_target/src/spec/x86_64_uwp_windows_msvc.rs
+++ b/compiler/rustc_target/src/spec/x86_64_uwp_windows_msvc.rs
@@ -3,6 +3,7 @@ use crate::spec::Target;
pub fn target() -> Target {
let mut base = super::windows_uwp_msvc_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
Target {
diff --git a/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs b/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs
index 365ade6bc..a7c4aaecf 100644
--- a/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs
+++ b/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs
@@ -3,6 +3,7 @@ use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target};
pub fn target() -> Target {
let mut base = super::vxworks_base::opts();
base.cpu = "x86-64".into();
+ base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;