-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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 riscv64gc-unknown-linux-gnu target #66661
Conversation
89cc7de
to
75dac38
Compare
I have successfully compiled std for this target using my ports. # Under [patch.crates-io]
libc = { git = "https://github.com/msizanoen1/libc.git", branch = "riscv" } and run |
Also to build std you need the cross toolchain which you can build using crosstool-ng. |
I have managed to get rustc and cargo to build for riscv64 using the std and the libc ports and also made minor fixes to the libc port at the same time. |
The current riscv backend in LLVM 9 should be mature enough to compile big applications like rustc and cargo for running under linux: https://www.lowrisc.org/blog/2019/07/risc-v-llvm-backend-in-clang-llvm-9.0/ |
@rustbot modify labels: +O-riscv |
@bors: r+ |
📌 Commit 75dac38 has been approved by |
Add riscv64gc-unknown-linux-gnu target This PR add the target, but doesn't build std on CI yet. I have a port for `libc` crate and std which I will upstream soon after this target is added. r? @alexcrichton
Rollup of 14 pull requests Successful merges: - #66128 (alloc: Add new_zeroed() versions like new_uninit().) - #66661 (Add riscv64gc-unknown-linux-gnu target) - #66663 (Miri: print leak report even without tracing) - #66711 (Add hardware floating point features to aarch64-pc-windows-msvc) - #66713 (introduce a target to build the kernel of the unikernel HermitCore) - #66717 (tidy: Accommodate rustfmt's preferred layout of stability attributes) - #66719 (Store pointer width as u32 on Config) - #66720 (Move ErrorReported to rustc_errors) - #66737 (Error codes cleanup) - #66754 (Various tweaks to diagnostic output) - #66763 (Minor edit for documentation-tests.md that increases clarity) - #66779 (follow the same function order in the trait) - #66786 (Add wildcard test for const_if_match) - #66788 (Allow `Unreachable` terminators through `min_const_fn` checks) Failed merges: r? @ghost
Support for RISC-V 64-bit GNU/Linux Add support for RISC-V 64-bit GNU/Linux. Follow up to rust-lang/rust#66661. r? @alexcrichton
The required lowering for the |
It is implemented in LLVM 9 (which is the version used by rustc) now. |
The frontend lowering code is here: https://github.com/rust-lang/rust/blob/master/src/librustc_target/abi/call/riscv.rs |
@msizanoen1 as is pointed out in the commit message on rust-lang/llvm-project@0b2803e:
To elaborate: Clang generates slightly different LLVM IR depending on the ABI chosen. Unfortunately the LLVM IR to RISC-V Machine Code translation is too late for some of the ABI details needed to do the lowering from C to RISC-V machine code correctly. This is an LLVM problem common to all backends, not just RISC-V. The RISC-V ABI lowering implementation in clang is here: https://github.com/llvm/llvm-project/blob/8e780252a7284be45cf1ba224cabd884847e8e92/clang/lib/CodeGen/TargetInfo.cpp#L9311-L9773 It has been on my list to make the same changes to rustc that clang has in order to support this ABI. I have not yet got around to doing so. This means if you are calling C code, or other code that follows the RISC-V ELF psABI, you will have issues around passing floats to and from rust code, even if the function is marked Rust code that calls other rust code is allowed to do whatever it wants, as that is entirely handled by rustc. For context: I work at lowRISC on LLVM for RISC-V. I would love full support for RISC-V in rustc (which is why fixing this is on my todo list), but I also want to be accurate about what rustc supports for RISC-V and where its implementation is not complete. |
It seems like LLVM has the behavior to unwrap aggreates in structs passed in arguments by default so it will only be a problem when FLEN > XLEN, which rustc has not handle yet. |
This is my translation of the Clang lowering logic in Rust: https://github.com/msizanoen1/rust/blob/riscv-abi/src/librustc_target/abi/call/riscv.rs |
The lowering logic PR is #68452. |
Version 1.41.0 (2020-01-30) =========================== Language -------- - [You can now pass type parameters to foreign items when implementing traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`. - [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`, `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed. - [You can now use any valid identifier in a `format_args` macro.][66847] Previously identifiers starting with an underscore were not allowed. - [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and enum variants.][66183] These are still rejected semantically, but can be seen and parsed by procedural macros and conditional compilation. Compiler -------- - [Rustc will now warn if you have unused loop `'label`s.][66325] - [Removed support for the `i686-unknown-dragonfly` target.][67255] - [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661] - [You can now pass an arguments file passing the `@path` syntax to rustc.][66172] Note that the format differs somewhat from what is found in other tooling; please see [the documentation][argfile-docs] for more information. - [You can now provide `--extern` flag without a path, indicating that it is available from the search path or specified with an `-L` flag.][64882] \* Refer to Rust's [platform support page][forge-platform-support] for more information on Rust's tiered platform support. [argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path Libraries --------- - [The `core::panic` module is now stable.][66771] It was already stable through `std`. - [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`. - [`MaybeUninit<T>` now implements `fmt::Debug`.][65013] Stabilized APIs --------------- - [`Result::map_or`] - [`Result::map_or_else`] - [`std::rc::Weak::weak_count`] - [`std::rc::Weak::strong_count`] - [`std::sync::Weak::weak_count`] - [`std::sync::Weak::strong_count`] Cargo ----- - [Cargo will now document all the private items for binary crates by default.][cargo/7593] - [`cargo-install` will now reinstall the package if it detects that it is out of date.][cargo/7560] - [Cargo.lock now uses a more git friendly format that should help to reduce merge conflicts.][cargo/7579] - [You can now override specific dependencies's build settings][cargo/7591] E.g. `[profile.dev.overrides.image] opt-level = 2` sets the `image` crate's optimisation level to `2` for debug builds. You can also use `[profile.<profile>.build_overrides]` to override build scripts and their dependencies. Misc ---- - [You can now specify `edition` in documentation code blocks to compile the block for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample should be compiled the 2018 edition of Rust. - [You can now provide custom themes to rustdoc with `--theme`, and check the current theme with `--check-theme`.][54733] - [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351] Compatibility Notes ------------------- - [As previously announced 1.41.0 will be the last tier 1 release for 32-bit Apple targets.][apple-32bit-drop] This means that the source code is still available to build, but the targets are no longer being tested and release binaries for those platforms will no longer be distributed by the Rust project. Please refer to the linked blog post for more information. [54733]: rust-lang/rust#54733 [61351]: rust-lang/rust#61351 [67255]: rust-lang/rust#67255 [66661]: rust-lang/rust#66661 [66771]: rust-lang/rust#66771 [66847]: rust-lang/rust#66847 [66238]: rust-lang/rust#66238 [66277]: rust-lang/rust#66277 [66325]: rust-lang/rust#66325 [66172]: rust-lang/rust#66172 [66183]: rust-lang/rust#66183 [65879]: rust-lang/rust#65879 [65013]: rust-lang/rust#65013 [64882]: rust-lang/rust#64882 [64325]: rust-lang/rust#64325 [cargo/7560]: rust-lang/cargo#7560 [cargo/7579]: rust-lang/cargo#7579 [cargo/7591]: rust-lang/cargo#7591 [cargo/7593]: rust-lang/cargo#7593 [`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else [`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or [`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count [`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count [`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count [`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count [apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
Compiler support was merged here rust-lang/rust#66661
Compiler support was merged here rust-lang/rust#66661
413: Add riscv64gc-unknown-linux-gnu support r=reitermarkus a=tblah rust support for riscv64gc-unknown-linux-gnu [is not yet advertised](https://forge.rust-lang.org/release/platform-support.html), but [is merged](rust-lang/rust#66661). There are [issues](rust-lang/rust#62117) with riscv64gc-unknown-linux-gnu but it works well enough to build many crates (including rustc). Co-authored-by: Tom Eccles <tom.eccles@codethink.co.uk>
This PR add the target, but doesn't build std on CI yet.
I have a port for
libc
crate and std which I will upstream soon after this target is added.r? @alexcrichton