-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Nintendo Switch as tier 3 target #88991
Add Nintendo Switch as tier 3 target #88991
Conversation
r? @wesleywiser (rust-highfive has picked a reviewer for you, use r? to override) |
|
Please copy the list of target requirements and verify all of the requirements are satisfied. An example from one of the previous PRs: #88529 (comment) |
Yep, me and @jam1garner.
We spent a good amount of time bikeshedding this, but
The code in this PR definitely shouldn't pose any issue. Before making PRs for libstd, we plan to consult the core team and foundation (as discussed on Zulip), but none of the explicitly mentioned issues apply.
👍
See discussion on Zulip. We're planning on adding support incrementally to make review easier for both ourselves and reviewers.
Currently, there's not much specific to the target. https://github.com/aarch64-switch-rs/cargo-nx works with
👍
Assuming CI passes, I don't see any reason to think this would be an issue. |
Also, for some relevant information that was posted on Zulip but wasn't copied here, this PR just adds a target definition. Future PRs for libstd will be pure Rust: we haven't signed any NDAs for the official SDK, and we don't plan to rely on unofficial C/C++ SDKs. |
compiler/rustc_target/src/spec/aarch64_nintendo_switch_linker_script.ld
Outdated
Show resolved
Hide resolved
If this is an NDA compliant port, please drop me a line on the English language official forums under "Off-Topic/Target Triple for Rust std" or "Off-Topic/Rust". If this is a homebrew initiative, an indication as such would be appreciated. |
@sgeos Does this answer your question? I agree that this probably should've been in the PR description, but I didn't think of that while we were writing it and I can't edit it. |
The short answer is yes. |
@@ -308,7 +308,7 @@ pub struct Target { | |||
impl Target { | |||
pub fn from_triple(triple: &str) -> Self { | |||
let mut target: Self = Default::default(); | |||
if triple.contains("-none") || triple.contains("nvptx") { | |||
if triple.contains("-none") || triple.contains("nvptx") || triple.contains("switch") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Off topic - could this be turned into a no_std
flag in the target config file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The linker has the same issue with a FIXME
for pulling the info from the target config file. I'm guessing that bootstrap
doesn't have a way to access the actual target definition.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bootstrap
could invoke rustc using --print cfg
or something similar to print if the target is no_std if the target config file contains this. If it is a cfg, libstd could use the same cfg for restricted-std.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In this PR, though, it's just temporary until std is implemented on Switch.
For what it's worth, as a note on the naming, the Switch's operating system is a microkernel called Horizon. Horizon was also used on the 3DS, but it evolved quite a bit between the two consoles.
These projects might want to use the same target, in which case the |
I think one relevant point about this being primarily designed for homebrew (I can't imagine an officially sanctioned game using this; if only because they need to dynamically link against the nnsdk), however we would like to keep the possibility for there to be another target designated for use when linking against the nnsdk. (an This is further complicated by the fact our plan for this target is to be a pure Rust toolchain (just interfacing with the syscall interface), which makes it a bit weird trying to specify a toolchain in the target. I think At risk of bikeshedding: If anyone has any thoughts on how this should be handled (even if just 'leave it alone'), I'd appreciate outside input |
I think it's also worth noting that mesosphere is the only one out of the three currently 'production ready' (so to speak) and can for all intents and purposes be considered only for use on the switch, so I think actual room for confusion from 'switch' in the name to be nonexistant. |
aarch64-nintendo-switch does not conflict with any target triples that have been discussed behind the NDA wall, but it still might be confusing. aarch64-nintendo-switch-homebrew is entirely unambiguous. Personally, I would love to see a target that can be used for licensed commercial development. I am hoping this effort can be used as a basis for an official or semi-official target since you will probably move faster than me. Note that any such target, if created, will likely remain behind the NDA wall, probably forever. |
One thing I hope @sgeos (after further legal discussion, because I believe this will be an even more dicey endeavor than the currently proposed homebrew target) is that once further development is done on this target there could be a non-NDA'd target that would purely be based on the exposed symbols of the Nintendo SDK. The reason I believe this could be possible is that (please note before I continue that I am not under a Nintendo NDA, have never looked upon or been given information covered by a Nintendo NDA, or otherwise interacted with NDA materials) the Nintendo SDK exports quite a large portion of libc required to produce a working Rust libstd. I have experimented with this in the past for the purpose of modding games in the past (consider the fact that when modding games you are subject to a programming environment equivalent to that of the game, so a lot of this work could very well be helpful to a toolchain targetting 'official' game development). I would believe that at minimum the subset of libc exported (sockets, pthreads, and a limited file API) would be enough to produce a semi-useful target without *any* copyrighted materials being involved (as, while I am not a lawyer and this is ofc not legal advice, I do not believe Nintendo has the rights to copyright a subset of libc :P ) As to whether or not such a target could dynamically link against other symbols in the nnsdk within libstd is less clear to me, however, but at minimum (a) skyline-rs/rust is a quite functional starting place for those under NDA making games if they would like a starting point and (b) I am willing to answer any questions about it people have (this is not the place to do so but it's not hard to find me elsewhere). While working with the Rust Foundation and/or Rust core team when working on the homebrew libstd implementation I intend to also inquire about this. Hopefully there is a course of action I can take to enable development in the open but ultimately not putting the Rust project in legal jeopardy is my #1 priority for either of the proposed targets. |
Also I should add that the current gameplan is that leo and I are currently assessing libstd implementation strategy and I plan on contacting both the foundation and the core team once both:
|
First of all, I am not an attorney. If you have legal concerns, it is a good idea to consult an attorney. Having said that, my understanding is that reverse engineering trade secrets is legal. Reverse engineering cannot be used as a defense for patent infringement, but there is precedent in the USA for interoperability and overturning silly patents. The upshot is that reverse engineering whatever Nintendo is doing and implementing a target based on that knowledge is almost certainly legal, but there are a few things to be aware of. First of all, after signing an NDA and being approved as a developer, access to a lot of trade secret secrets is granted, technical and nontechnical. People who have signed such an NDA are obligated not to share these trade secrets even if they stop developing for the system. Anyone behind the NDA wall is legally unable to share trade secrets with you, but you are free to use publicly available information. I am pretty sure that leaks are public information that can be used, but I would double check this if it is important. If someone who has signed an NDA feeds you information, that puts both you and that person at risk legally. I have seen projects roll back functionality that is based on propriety information. I think that this is a good idea if you get information that cannot be used legally. To the extent you have not signed an NDA, you are free to work and share information openly, but you may not make use of trade secrets provided by someone who has signed an NDA. Once you have signed an NDA, there is no going back, but people behind the NDA wall are free to use reverse engineered work, license permitting. As far as concrete detail go, I do not see any problem building a target that relies on reverse engineered symbols that are present on the device. If you write a target that uses whatever subset of libc is exported, your aarch64 implementation may actually work on other aarch64 targets that export all of libc. Furthermore, it sounds like it might also work on the 3DS for the people who are still interested in developing homebrew for it. I think that working with the available reverse engineered libc symbols is the ideal strategy to use. |
@sgeos Thanks for the writeup and your view on this. I want to add another perspective though: whether something is legal or not is not the only concern. The problem is an intersection of the structure of the That would be very different if a |
@skade Thank you for the reply. As far as external agreements go, my recommendation is to only allow people to contribute if A) they have no external agreements (NDA not signed, NDA trade secrets never seen, etc.), or B) they have explicit permission to contribute despite having signed an NDA. My understanding is that external documentation based on reverse engineering should be OK, but I honestly have no idea what the Switch homebrew community is using. Some of the other homebrew communities use extensive data sheets of technical information. Does it make sense to create a |
I'm not sure we are in a position to verify that the contributors haven't signed some sort of an NDA, and drawing a line in the code for where such a verification should be made and where its not necessary seems infeasible at best. Then again, adding a plain target dues not raise huge concerns here. Adding supporting code to libc/libstd seems like it would. |
@sgeos I'll write a full reply later, but just to make clear: the |
Leaked materials definitely aren't used, though the public Tegra X1 TRM is frequently referenced for low-level details. There's likely enough documentation for clean-room implementations, but if you consider having looked at any disassembly/decompilation to taint someone, you'll have a hard time finding developers. It's definitely a far better situation than the GameCube, where I've heard that chunks of the toolchain were directly taken from decompiler output... For what it's worth, I think the fact that Nintendo hasn't taken action against Atmosphere (which has bug-compatible reimplementations of many system components) is good evidence that they wouldn't take action against a Rust port. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you also add documentation for this target to src/doc/rustc/src/platform-support
in the style of the existing iOS simulator docs?
@wesleywiser I was actually planning on doing that but I mistakenly thought those were in a separate repo, I'll write some. |
For what it's worth, I'm open to a target name like |
I think it would be helpful to go ahead and start this conversation now. From a technical perspective, the code here is fine and could be signed off on as it is. However, while it seems ok to me to merge this, I recognize that I am not a lawyer and don't really know what I'm talking about. 🙂 I would prefer if we had some kind of agreed upon strategy here for the target with those folks. If, for example, we could not find an implementation path that allows for in-tree Edit: Upon a closer reading of the target tier RFC, it appears that Tier 3 support does not require
|
The 3DS target uses an existing C-based homebrew toolchain instead of
talking directly to the system. That toolchain does have a Switch
equivalent, but I would like to avoid that for several reasons (primary
ones being a non-standard ABI requiring modifications to LLVM and the
developers being actively hostile to its usage with non-C languages or
non-GCC compilers).
…On Sat, Jun 25, 2022, 4:46 AM Elias Gabriel Amaral da Silva < ***@***.***> wrote:
I would prefer if we could have that comment from legal before proceeding.
Is the specifics of this target substantially different from the 3ds
target
<https://doc.rust-lang.org/nightly/rustc/platform-support/armv6k-nintendo-3ds.html>?
For example, are contributors to the armv6k-nintendo-3ds required to not
have signed any NDA? And should the policy for this target be the same?
—
Reply to this email directly, view it on GitHub
<#88991 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AB7X32KMJAREUHPPTJARYJ3VQ3BM7ANCNFSM5EDLWRAA>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Additionally, the 3ds is EoL, the Switch is still actively sold. And another factor (echoing leo's sentiment but from a different angle) I think linking against a homebrew focused toolchain is likely a net negative for any use in published games (more applicable to a hypothetical nnsdk target, but also potentially applicable to a freestanding target). I don't think there's actually any concern regarding the switch targets, just more things for project members and foundation legal to consider. |
And @wesleywiser @nellshamrell any changes? I know @skade left the core team, is there anyone who was involved with the policy decision here that is still involved, or has this stalled and we need to find new project members to work with on this? Want to understand whether or not this is needing patience or finding new people within the rust project to discuss this with |
I will bring the legal question back to the Foundation. @wesleywiser do you know of any project specific concerns around this? |
@jam1garner thanks so much for your patience! I'm sorry it's taken this long to get an answer back to you. Per our discussions with the Foundation's legal staff, we don't see an issue with merging this PR therefore: @bors r+ rollup |
📌 Commit 29611d2ee50418a7f7149e33bd2e5445d29dbcd1 has been approved by It is now in the queue for this repository. |
I can't think of any other reason CI might be failing, and I should've done this anyway.
29611d2
to
62aafb0
Compare
Re-approving @bors r+ rollup |
Rollup of 5 pull requests Successful merges: - rust-lang#88991 (Add Nintendo Switch as tier 3 target) - rust-lang#98869 (Remove some usages of `guess_head_span`) - rust-lang#99119 (Refactor: remove a string matching about methods) - rust-lang#99209 (Correctly handle crate level page on docs.rs as well) - rust-lang#99246 (Update RLS) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Pkgsrc changes: * Add patch to fix vendor/kqueue issue (on 32-bit hosts) * Adjust other patches & line numbers * Version bumps & checksum changes. Upstream changes: Version 1.64.0 (2022-09-22) =========================== Language -------- - [Unions with mutable references or tuples of allowed types are now allowed](rust-lang/rust#97995) - It is now considered valid to deallocate memory pointed to by a shared reference `&T` [if every byte in `T` is inside an `UnsafeCell`](rust-lang/rust#98017) - Unused tuple struct fields are now warned against in an allow-by-default lint, [`unused_tuple_struct_fields`] (rust-lang/rust#95977), similar to the existing warning for unused struct fields. This lint will become warn-by-default in the future. Compiler -------- - [Add Nintendo Switch as tier 3 target] (rust-lang/rust#88991) - Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. - [Only compile `#[used]` as llvm.compiler.used for ELF targets] (rust-lang/rust#93718) - [Add the `--diagnostic-width` compiler flag to define the terminal width.] (rust-lang/rust#95635) - [Add support for link-flavor `rust-lld` for iOS, tvOS and watchOS] (rust-lang/rust#98771) Libraries --------- - [Remove restrictions on compare-exchange memory ordering.] (rust-lang/rust#98383) - You can now `write!` or `writeln!` into an `OsString`: [Implement `fmt::Write` for `OsString`](rust-lang/rust#97915) - [Make RwLockReadGuard covariant] (rust-lang/rust#96820) - [Implement `FusedIterator` for `std::net::[Into]Incoming`] (rust-lang/rust#97300) - [`impl<T: AsRawFd> AsRawFd for {Arc,Box}<T>`] (rust-lang/rust#97437) - [`ptr::copy` and `ptr::swap` are doing untyped copies] (rust-lang/rust#97712) - [Add cgroupv1 support to `available_parallelism`] (rust-lang/rust#97925) - [Mitigate many incorrect uses of `mem::uninitialized`] (rust-lang/rust#99182) Stabilized APIs --------------- - [`future::IntoFuture`] (https://doc.rust-lang.org/stable/std/future/trait.IntoFuture.html) - [`future::poll_fn`] (https://doc.rust-lang.org/stable/std/future/fn.poll_fn.html) - [`task::ready!`] (https://doc.rust-lang.org/stable/std/task/macro.ready.html) - [`num::NonZero*::checked_mul`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_mul) - [`num::NonZero*::checked_pow`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_pow) - [`num::NonZero*::saturating_mul`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_mul) - [`num::NonZero*::saturating_pow`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_pow) - [`num::NonZeroI*::abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.abs) - [`num::NonZeroI*::checked_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.checked_abs) - [`num::NonZeroI*::overflowing_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.overflowing_abs) - [`num::NonZeroI*::saturating_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.saturating_abs) - [`num::NonZeroI*::unsigned_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.unsigned_abs) - [`num::NonZeroI*::wrapping_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.wrapping_abs) - [`num::NonZeroU*::checked_add`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_add) - [`num::NonZeroU*::checked_next_power_of_two`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_next_power_of_two) - [`num::NonZeroU*::saturating_add`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_add) - [`os::unix::process::CommandExt::process_group`] (https://doc.rust-lang.org/stable/std/os/unix/process/trait.CommandExt.html#tymethod.process_group) - [`os::windows::fs::FileTypeExt::is_symlink_dir`] (https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_dir) - [`os::windows::fs::FileTypeExt::is_symlink_file`] (https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_file) These types were previously stable in `std::ffi`, but are now also available in `core` and `alloc`: - [`core::ffi::CStr`] (https://doc.rust-lang.org/stable/core/ffi/struct.CStr.html) - [`core::ffi::FromBytesWithNulError`] (https://doc.rust-lang.org/stable/core/ffi/struct.FromBytesWithNulError.html) - [`alloc::ffi::CString`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.CString.html) - [`alloc::ffi::FromVecWithNulError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.FromVecWithNulError.html) - [`alloc::ffi::IntoStringError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.IntoStringError.html) - [`alloc::ffi::NulError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.NulError.html) These types were previously stable in `std::os::raw`, but are now also available in `core::ffi` and `std::ffi`: - [`ffi::c_char`] (https://doc.rust-lang.org/stable/std/ffi/type.c_char.html) - [`ffi::c_double`] (https://doc.rust-lang.org/stable/std/ffi/type.c_double.html) - [`ffi::c_float`] (https://doc.rust-lang.org/stable/std/ffi/type.c_float.html) - [`ffi::c_int`] (https://doc.rust-lang.org/stable/std/ffi/type.c_int.html) - [`ffi::c_long`] (https://doc.rust-lang.org/stable/std/ffi/type.c_long.html) - [`ffi::c_longlong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_longlong.html) - [`ffi::c_schar`] (https://doc.rust-lang.org/stable/std/ffi/type.c_schar.html) - [`ffi::c_short`] (https://doc.rust-lang.org/stable/std/ffi/type.c_short.html) - [`ffi::c_uchar`] (https://doc.rust-lang.org/stable/std/ffi/type.c_uchar.html) - [`ffi::c_uint`] (https://doc.rust-lang.org/stable/std/ffi/type.c_uint.html) - [`ffi::c_ulong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ulong.html) - [`ffi::c_ulonglong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ulonglong.html) - [`ffi::c_ushort`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ushort.html) These APIs are now usable in const contexts: - [`slice::from_raw_parts`] (https://doc.rust-lang.org/stable/core/slice/fn.from_raw_parts.html) Cargo ----- - [Packages can now inherit settings from the workspace so that the settings can be centralized in one place.] (rust-lang/cargo#10859) See [`workspace.package`](https://doc.rust-lang.org/nightly/cargo/reference/workspaces.html#the-workspacepackage-table) and [`workspace.dependencies`](https://doc.rust-lang.org/nightly/cargo/reference/workspaces.html#the-workspacedependencies-table) for more details on how to define these common settings. - [Cargo commands can now accept multiple `--target` flags to build for multiple targets at once] (rust-lang/cargo#10766), and the [`build.target`](https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildtarget) config option may now take an array of multiple targets. - [The `--jobs` argument can now take a negative number to count backwards from the max CPUs.] (rust-lang/cargo#10844) - [`cargo add` will now update `Cargo.lock`.] (rust-lang/cargo#10902) - [Added](rust-lang/cargo#10838) the [`--crate-type`](https://doc.rust-lang.org/nightly/cargo/commands/cargo-rustc.html#option-cargo-rustc---crate-type) flag to `cargo rustc` to override the crate type. - [Significantly improved the performance fetching git dependencies from GitHub when using a hash in the `rev` field.] (rust-lang/cargo#10079) Misc ---- - [The `rust-analyzer` rustup component is now available on the stable channel.] (rust-lang/rust#98640) Compatibility Notes ------------------- - The minimum required versions for all `-linux-gnu` targets are now at least kernel 3.2 and glibc 2.17, for targets that previously supported older versions: [Increase the minimum linux-gnu versions](rust-lang/rust#95026) - [Network primitives are now implemented with the ideal Rust layout, not the C system layout] (rust-lang/rust#78802). This can cause problems when transmuting the types. - [Add assertion that `transmute_copy`'s `U` is not larger than `T`] (rust-lang/rust#98839) - [A soundness bug in `BTreeMap` was fixed] (rust-lang/rust#99413) that allowed data it was borrowing to be dropped before the container. - [The Drop behavior of C-like enums cast to ints has changed] (rust-lang/rust#96862). These are already discouraged by a compiler warning. - [Relate late-bound closure lifetimes to parent fn in NLL] (rust-lang/rust#98835) - [Errors at const-eval time are now in future incompatibility reports] (rust-lang/rust#97743) - On the `thumbv6m-none-eabi` target, some incorrect `asm!` statements were erroneously accepted if they used the high registers (r8 to r14) as an input/output operand. [This is no longer accepted] (rust-lang/rust#99155). - [`impl Trait` was accidentally accepted as the associated type value of return-position `impl Trait`] (rust-lang/rust#97346), without fulfilling all the trait bounds of that associated type, as long as the hidden type satisfies said bounds. This has been fixed. Internal Changes ---------------- These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - Windows builds now use profile-guided optimization, providing 10-20% improvements to compiler performance: [Utilize PGO for windows x64 rustc dist builds] (rust-lang/rust#96978) - [Stop keeping metadata in memory before writing it to disk] (rust-lang/rust#96544) - [compiletest: strip debuginfo by default for mode=ui] (rust-lang/rust#98140) - Many improvements to generated code for derives, including performance improvements: - [Don't use match-destructuring for derived ops on structs.] (rust-lang/rust#98446) - [Many small deriving cleanups] (rust-lang/rust#98741) - [More derive output improvements] (rust-lang/rust#98758) - [Clarify deriving code](rust-lang/rust#98915) - [Final derive output improvements] (rust-lang/rust#99046) - [Stop injecting `#[allow(unused_qualifications)]` in generated `derive` implementations](rust-lang/rust#99485) - [Improve `derive(Debug)`](rust-lang/rust#98190) - [Bump to clap 3](rust-lang/rust#98213) - [fully move dropck to mir](rust-lang/rust#98641) - [Optimize `Vec::insert` for the case where `index == len`.] (rust-lang/rust#98755) - [Convert rust-analyzer to an in-tree tool] (rust-lang/rust#99603)
Pkgsrc changes: * This package now contains rust-analyzer, so implicitly conflicts with that pkgsrc package. The same goes for the rust-src package. * Add NetBSD/arm6 port * Add unfinished NetBSD/mipsel port * Revert the use of the internal LLVM, should now build with the new pkgsrc LLVM (15). * Add depndence on compat80 for sparc64 to fix the build * Adapt patches * Add CHECK_INTERPRETER_SKIP for a few (mostly unused) files. (A proper fix may come later.) Upstream changes: Version 1.64.0 (2022-09-22) =========================== Language -------- - [Unions with mutable references or tuples of allowed types are now allowed](rust-lang/rust#97995) - It is now considered valid to deallocate memory pointed to by a shared reference `&T` [if every byte in `T` is inside an `UnsafeCell`](rust-lang/rust#98017) - Unused tuple struct fields are now warned against in an allow-by-default lint, [`unused_tuple_struct_fields`] (rust-lang/rust#95977), similar to the existing warning for unused struct fields. This lint will become warn-by-default in the future. Compiler -------- - [Add Nintendo Switch as tier 3 target] (rust-lang/rust#88991) - Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. - [Only compile `#[used]` as llvm.compiler.used for ELF targets] (rust-lang/rust#93718) - [Add the `--diagnostic-width` compiler flag to define the terminal width.] (rust-lang/rust#95635) - [Add support for link-flavor `rust-lld` for iOS, tvOS and watchOS] (rust-lang/rust#98771) Libraries --------- - [Remove restrictions on compare-exchange memory ordering.] (rust-lang/rust#98383) - You can now `write!` or `writeln!` into an `OsString`: [Implement `fmt::Write` for `OsString`](rust-lang/rust#97915) - [Make RwLockReadGuard covariant] (rust-lang/rust#96820) - [Implement `FusedIterator` for `std::net::[Into]Incoming`] (rust-lang/rust#97300) - [`impl<T: AsRawFd> AsRawFd for {Arc,Box}<T>`] (rust-lang/rust#97437) - [`ptr::copy` and `ptr::swap` are doing untyped copies] (rust-lang/rust#97712) - [Add cgroupv1 support to `available_parallelism`] (rust-lang/rust#97925) - [Mitigate many incorrect uses of `mem::uninitialized`] (rust-lang/rust#99182) Stabilized APIs --------------- - [`future::IntoFuture`] (https://doc.rust-lang.org/stable/std/future/trait.IntoFuture.html) - [`future::poll_fn`] (https://doc.rust-lang.org/stable/std/future/fn.poll_fn.html) - [`task::ready!`] (https://doc.rust-lang.org/stable/std/task/macro.ready.html) - [`num::NonZero*::checked_mul`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_mul) - [`num::NonZero*::checked_pow`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_pow) - [`num::NonZero*::saturating_mul`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_mul) - [`num::NonZero*::saturating_pow`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_pow) - [`num::NonZeroI*::abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.abs) - [`num::NonZeroI*::checked_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.checked_abs) - [`num::NonZeroI*::overflowing_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.overflowing_abs) - [`num::NonZeroI*::saturating_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.saturating_abs) - [`num::NonZeroI*::unsigned_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.unsigned_abs) - [`num::NonZeroI*::wrapping_abs`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.wrapping_abs) - [`num::NonZeroU*::checked_add`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_add) - [`num::NonZeroU*::checked_next_power_of_two`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_next_power_of_two) - [`num::NonZeroU*::saturating_add`] (https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_add) - [`os::unix::process::CommandExt::process_group`] (https://doc.rust-lang.org/stable/std/os/unix/process/trait.CommandExt.html#tymethod.process_group) - [`os::windows::fs::FileTypeExt::is_symlink_dir`] (https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_dir) - [`os::windows::fs::FileTypeExt::is_symlink_file`] (https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_file) These types were previously stable in `std::ffi`, but are now also available in `core` and `alloc`: - [`core::ffi::CStr`] (https://doc.rust-lang.org/stable/core/ffi/struct.CStr.html) - [`core::ffi::FromBytesWithNulError`] (https://doc.rust-lang.org/stable/core/ffi/struct.FromBytesWithNulError.html) - [`alloc::ffi::CString`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.CString.html) - [`alloc::ffi::FromVecWithNulError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.FromVecWithNulError.html) - [`alloc::ffi::IntoStringError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.IntoStringError.html) - [`alloc::ffi::NulError`] (https://doc.rust-lang.org/stable/alloc/ffi/struct.NulError.html) These types were previously stable in `std::os::raw`, but are now also available in `core::ffi` and `std::ffi`: - [`ffi::c_char`] (https://doc.rust-lang.org/stable/std/ffi/type.c_char.html) - [`ffi::c_double`] (https://doc.rust-lang.org/stable/std/ffi/type.c_double.html) - [`ffi::c_float`] (https://doc.rust-lang.org/stable/std/ffi/type.c_float.html) - [`ffi::c_int`] (https://doc.rust-lang.org/stable/std/ffi/type.c_int.html) - [`ffi::c_long`] (https://doc.rust-lang.org/stable/std/ffi/type.c_long.html) - [`ffi::c_longlong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_longlong.html) - [`ffi::c_schar`] (https://doc.rust-lang.org/stable/std/ffi/type.c_schar.html) - [`ffi::c_short`] (https://doc.rust-lang.org/stable/std/ffi/type.c_short.html) - [`ffi::c_uchar`] (https://doc.rust-lang.org/stable/std/ffi/type.c_uchar.html) - [`ffi::c_uint`] (https://doc.rust-lang.org/stable/std/ffi/type.c_uint.html) - [`ffi::c_ulong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ulong.html) - [`ffi::c_ulonglong`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ulonglong.html) - [`ffi::c_ushort`] (https://doc.rust-lang.org/stable/std/ffi/type.c_ushort.html) These APIs are now usable in const contexts: - [`slice::from_raw_parts`] (https://doc.rust-lang.org/stable/core/slice/fn.from_raw_parts.html) Cargo ----- - [Packages can now inherit settings from the workspace so that the settings can be centralized in one place.] (rust-lang/cargo#10859) See [`workspace.package`](https://doc.rust-lang.org/nightly/cargo/reference/workspaces.html#the-workspacepackage-table) and [`workspace.dependencies`](https://doc.rust-lang.org/nightly/cargo/reference/workspaces.html#the-workspacedependencies-table) for more details on how to define these common settings. - [Cargo commands can now accept multiple `--target` flags to build for multiple targets at once] (rust-lang/cargo#10766), and the [`build.target`](https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildtarget) config option may now take an array of multiple targets. - [The `--jobs` argument can now take a negative number to count backwards from the max CPUs.] (rust-lang/cargo#10844) - [`cargo add` will now update `Cargo.lock`.] (rust-lang/cargo#10902) - [Added](rust-lang/cargo#10838) the [`--crate-type`](https://doc.rust-lang.org/nightly/cargo/commands/cargo-rustc.html#option-cargo-rustc---crate-type) flag to `cargo rustc` to override the crate type. - [Significantly improved the performance fetching git dependencies from GitHub when using a hash in the `rev` field.] (rust-lang/cargo#10079) Misc ---- - [The `rust-analyzer` rustup component is now available on the stable channel.] (rust-lang/rust#98640) Compatibility Notes ------------------- - The minimum required versions for all `-linux-gnu` targets are now at least kernel 3.2 and glibc 2.17, for targets that previously supported older versions: [Increase the minimum linux-gnu versions](rust-lang/rust#95026) - [Network primitives are now implemented with the ideal Rust layout, not the C system layout] (rust-lang/rust#78802). This can cause problems when transmuting the types. - [Add assertion that `transmute_copy`'s `U` is not larger than `T`] (rust-lang/rust#98839) - [A soundness bug in `BTreeMap` was fixed] (rust-lang/rust#99413) that allowed data it was borrowing to be dropped before the container. - [The Drop behavior of C-like enums cast to ints has changed] (rust-lang/rust#96862). These are already discouraged by a compiler warning. - [Relate late-bound closure lifetimes to parent fn in NLL] (rust-lang/rust#98835) - [Errors at const-eval time are now in future incompatibility reports] (rust-lang/rust#97743) - On the `thumbv6m-none-eabi` target, some incorrect `asm!` statements were erroneously accepted if they used the high registers (r8 to r14) as an input/output operand. [This is no longer accepted] (rust-lang/rust#99155). - [`impl Trait` was accidentally accepted as the associated type value of return-position `impl Trait`] (rust-lang/rust#97346), without fulfilling all the trait bounds of that associated type, as long as the hidden type satisfies said bounds. This has been fixed. Internal Changes ---------------- These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - Windows builds now use profile-guided optimization, providing 10-20% improvements to compiler performance: [Utilize PGO for windows x64 rustc dist builds] (rust-lang/rust#96978) - [Stop keeping metadata in memory before writing it to disk] (rust-lang/rust#96544) - [compiletest: strip debuginfo by default for mode=ui] (rust-lang/rust#98140) - Many improvements to generated code for derives, including performance improvements: - [Don't use match-destructuring for derived ops on structs.] (rust-lang/rust#98446) - [Many small deriving cleanups] (rust-lang/rust#98741) - [More derive output improvements] (rust-lang/rust#98758) - [Clarify deriving code](rust-lang/rust#98915) - [Final derive output improvements] (rust-lang/rust#99046) - [Stop injecting `#[allow(unused_qualifications)]` in generated `derive` implementations](rust-lang/rust#99485) - [Improve `derive(Debug)`](rust-lang/rust#98190) - [Bump to clap 3](rust-lang/rust#98213) - [fully move dropck to mir](rust-lang/rust#98641) - [Optimize `Vec::insert` for the case where `index == len`.] (rust-lang/rust#98755) - [Convert rust-analyzer to an in-tree tool] (rust-lang/rust#99603)
Relevant Zulip Discussion
This is the first step towards working on incrementally adding support for the Nintendo Switch. After this lands @leo60228 and I will work on ensuring further work is cleared from a legal perspective before continuing on to work on an allocator and porting libstd.
The plan is to keep these changes small and incremental enough so as to not cause unneeded burden on reviewers by submitting a single large patch, as was felt to be the case last attempt at upstreaming (#74567).
All this specific patch does is add the target itself without and std support, which has been tested on-device and is working as expected.
Designated Target Maintainers: