Skip to content
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

Merged
merged 1 commit into from
Nov 27, 2019
Merged

Conversation

msizanoen1
Copy link
Contributor

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

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Nov 23, 2019
@msizanoen1
Copy link
Contributor Author

msizanoen1 commented Nov 23, 2019

I have successfully compiled std for this target using my ports.
std port: https://github.com/msizanoen1/rust/tree/riscv-std
libc crate port: https://github.com/msizanoen1/libc/tree/riscv
To test, create a local branch, then merge this PR and the std port branch then add a patch for libc in workspace manifest to point to my libc branch like this:

# Under [patch.crates-io]
libc = { git = "https://github.com/msizanoen1/libc.git", branch = "riscv" }

and run cargo update -p libc.
I still have not figured out how to run the test though.

@Centril Centril added relnotes Marks issues that should be documented in the release notes of the next release. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Nov 23, 2019
@Centril Centril added this to the 1.41 milestone Nov 23, 2019
@msizanoen1
Copy link
Contributor Author

Also to build std you need the cross toolchain which you can build using crosstool-ng.
You need to set CFLAGS_riscv64gc_unknown_linux_gnu to -mabi=lp64d -fPIC.

@msizanoen1
Copy link
Contributor Author

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.

@msizanoen1
Copy link
Contributor Author

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/

@msizanoen1
Copy link
Contributor Author

@rustbot modify labels: +O-riscv

@rustbot rustbot added the O-riscv Target: RISC-V architecture label Nov 25, 2019
@alexcrichton
Copy link
Member

@bors: r+

@bors
Copy link
Contributor

bors commented Nov 25, 2019

📌 Commit 75dac38 has been approved by alexcrichton

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 25, 2019
tmandry added a commit to tmandry/rust that referenced this pull request Nov 26, 2019
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
bors added a commit that referenced this pull request Nov 27, 2019
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
@bors bors merged commit 75dac38 into rust-lang:master Nov 27, 2019
@msizanoen1 msizanoen1 deleted the riscv-gnu branch November 27, 2019 03:56
bors added a commit to rust-lang/libc that referenced this pull request Nov 28, 2019
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
@lenary
Copy link
Contributor

lenary commented Jan 21, 2020

The required lowering for the lp64d risc-v is (to my understanding) not yet implemented. It is unlikely you will be able to correctly call or return from C (or other language) functions that have floating point argument or return types.

@msizanoen1
Copy link
Contributor Author

It is implemented in LLVM 9 (which is the version used by rustc) now.

@msizanoen1
Copy link
Contributor Author

@msizanoen1
Copy link
Contributor Author

msizanoen1 commented Jan 21, 2020

The frontend lowering code is here: https://github.com/rust-lang/rust/blob/master/src/librustc_target/abi/call/riscv.rs
It does not handle hard float specifically but it shouldn't be a problem until somebody needs to use ilp32q (128-bit floating point on 32-bit RISC-V) (edit: it does not exist).

@lenary
Copy link
Contributor

lenary commented Jan 21, 2020

@msizanoen1 as is pointed out in the commit message on rust-lang/llvm-project@0b2803e:

A number of aspects of the RISC-V float hard float ABIs require frontend
support (e.g. flattening of structs and passing int+fp for fp+fp structs in a
pair of registers), and will be addressed in a Clang patch.

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 extern "C".

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.

@msizanoen1
Copy link
Contributor Author

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.

@msizanoen1
Copy link
Contributor Author

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
Rustc does not deconstruct argument by itself but rely on LLVM to do it.

@lenary
Copy link
Contributor

lenary commented Jan 23, 2020

The lowering logic PR is #68452.

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Feb 17, 2020
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
tblah added a commit to tblah/rust-forge that referenced this pull request Apr 28, 2020
XAMPPRocky pushed a commit to rust-lang/rust-forge that referenced this pull request Apr 28, 2020
bors bot added a commit to cross-rs/cross that referenced this pull request May 1, 2020
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
O-riscv Target: RISC-V architecture relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants