about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_target/src/spec/aarch64_nintendo_switch.rs39
-rw-r--r--compiler/rustc_target/src/spec/mod.rs2
-rw-r--r--src/doc/rustc/src/platform-support.md1
3 files changed, 42 insertions, 0 deletions
diff --git a/compiler/rustc_target/src/spec/aarch64_nintendo_switch.rs b/compiler/rustc_target/src/spec/aarch64_nintendo_switch.rs
new file mode 100644
index 00000000000..74ecba489c1
--- /dev/null
+++ b/compiler/rustc_target/src/spec/aarch64_nintendo_switch.rs
@@ -0,0 +1,39 @@
+use super::{LinkerFlavor, LldFlavor, PanicStrategy, RelroLevel, Target, TargetOptions};
+
+/// A base target for Nintendo Switch devices using a pure LLVM toolchain.
+pub fn target() -> Target {
+    let mut opts = TargetOptions {
+        linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
+        linker: Some("rust-lld".into()),
+        os: "horizon".into(),
+        max_atomic_width: Some(128),
+        panic_strategy: PanicStrategy::Abort,
+        position_independent_executables: true,
+        crt_static_default: false,
+        crt_static_respected: false,
+        dynamic_linking: true,
+        executables: true,
+        has_elf_tls: false,
+        has_rpath: false,
+        relro_level: RelroLevel::Off,
+        ..Default::default()
+    };
+
+    opts.pre_link_args.insert(
+        LinkerFlavor::Lld(LldFlavor::Ld),
+        vec![],
+    );
+
+    opts.post_link_args.insert(
+        LinkerFlavor::Lld(LldFlavor::Ld),
+        vec!["--no-gc-sections".to_string(), "--eh-frame-hdr".to_string()],
+    );
+
+    Target {
+        llvm_target: "aarch64-unknown-none".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: opts,
+    }
+}
diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
index ef49fc8e968..a14a245480e 100644
--- a/compiler/rustc_target/src/spec/mod.rs
+++ b/compiler/rustc_target/src/spec/mod.rs
@@ -1035,6 +1035,8 @@ supported_targets! {
 
     ("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
 
+    ("aarch64-nintendo-switch", aarch64_nintendo_switch),
+
     ("armv7-unknown-linux-uclibceabi", armv7_unknown_linux_uclibceabi),
     ("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
 
diff --git a/src/doc/rustc/src/platform-support.md b/src/doc/rustc/src/platform-support.md
index eb985803266..641fcb9d6f8 100644
--- a/src/doc/rustc/src/platform-support.md
+++ b/src/doc/rustc/src/platform-support.md
@@ -209,6 +209,7 @@ target | std | host | notes
 `aarch64-apple-tvos` | * |  | ARM64 tvOS
 [`aarch64-apple-watchos-sim`](platform-support/apple-watchos.md) | ✓ |  | ARM64 Apple WatchOS Simulator
 [`aarch64-kmc-solid_asp3`](platform-support/kmc-solid.md) | ✓ |  | ARM64 SOLID with TOPPERS/ASP3
+`aarch64-nintendo-switch` | * |  | ARM64 Nintendo Switch, Horizon
 [`aarch64-pc-windows-gnullvm`](platform-support/pc-windows-gnullvm.md) | ✓ | ✓ |
 `aarch64-unknown-freebsd` | ✓ | ✓ | ARM64 FreeBSD
 `aarch64-unknown-hermit` | ✓ |  | ARM64 HermitCore